diff --git a/app/BBcode.php b/app/BBcode.php index 7d032a4..7b7747f 100644 --- a/app/BBcode.php +++ b/app/BBcode.php @@ -7,12 +7,8 @@ namespace Sakura; -use JBBCode\CodeDefinitionBuilder; -use JBBCode\DefaultCodeDefinitionSet; -use JBBCode\Parser; - /** - * Sakura wrapper for JBBCode. + * BBcode handler. * * @package Sakura * @author Julian van de Groep @@ -20,22 +16,17 @@ use JBBCode\Parser; class BBcode { /** - * The container for JBBCode. + * BBcodes, also for backwards compatibility. * - * @var Parser + * @var array */ - private static $bbcode = null; + protected static $bbcodes = []; /** * Initialiser. */ public static function init() { - // Create new parser class - self::$bbcode = new Parser(); - - // Add the standard definitions - self::loadStandardCodes(); } /** @@ -53,7 +44,7 @@ class BBcode // Parse all emoticons foreach ($emotes as $emote) { - $image = "{$emote->emote_string}"; + $image = "{$emote->emote_string}"; $icon = preg_quote($emote->emote_string, '#'); $text = preg_replace("#$icon#", $image, $text); } @@ -62,52 +53,6 @@ class BBcode return $text; } - /** - * Adds the standard BBcode. - */ - public static function loadStandardCodes() - { - // Add the standard definitions - self::$bbcode->addCodeDefinitionSet(new DefaultCodeDefinitionSet()); - - $simpleCodes = [ - ['header', '

{param}

'], - ['s', '{param}'], - ['spoiler', '{param}'], - ['box', '
-
' - . 'Click to open
'], - ['box', '
{option}
' - . '
'], - ['quote', '
Quote
{param}
'], - ]; - - foreach ($simpleCodes as $code) { - $builder = new CodeDefinitionBuilder($code[0], $code[1]); - - if (strstr($code[1], '{option}')) { - $builder->setUseOption(true); - } - - self::$bbcode->addCodeDefinition($builder->build()); - } - - // Add special definitions (PHP files MUST have the same name as the definition class - foreach (glob(ROOT . 'libraries/BBcodeDefinitions/*.php') as $ext) { - // Clean the file path - $ext = str_replace(ROOT . 'libraries/', '', $ext); - $ext = str_replace('.php', '', $ext); - $ext = str_replace('/', '\\', $ext); - - // Build the classname - $className = __NAMESPACE__ . '\\' . $ext; - - // Add the BBcode definition - self::$bbcode->addCodeDefinition(new $className); - } - } - /** * Set the text to parse. * @@ -115,12 +60,7 @@ class BBcode */ public static function text($text) { - // Check if $bbcode is still null - if (!self::$bbcode) { - self::init(); - } - - self::$bbcode->parse($text); + return $text; } /** @@ -132,17 +72,19 @@ class BBcode */ public static function toHTML($text = null) { - // Check if text isn't null - if ($text !== null) { - self::text($text); - } + // // Check if text isn't null + // if ($text !== null) { + // self::text($text); + // } - $parsed = nl2br(self::$bbcode->getAsHtml()); + // $parsed = nl2br(self::$bbcode->getAsHtml()); - $parsed = self::fixCodeTags($parsed); - $parsed = self::parseEmoticons($parsed); + // $parsed = self::fixCodeTags($parsed); + // $parsed = self::parseEmoticons($parsed); - return $parsed; + // return $parsed; + + return $text; } /** @@ -154,12 +96,14 @@ class BBcode */ public static function toEditor($text = null) { - // Check if text isn't null - if ($text !== null) { - self::text($text); - } + // // Check if text isn't null + // if ($text !== null) { + // self::text($text); + // } - return self::$bbcode->getAsBBCode(); + // return self::$bbcode->getAsBBCode(); + + return $text; } /** @@ -171,16 +115,18 @@ class BBcode */ public static function toPlain($text = null) { - // Check if text isn't null - if ($text !== null) { - self::text($text); - } + // // Check if text isn't null + // if ($text !== null) { + // self::text($text); + // } - return self::$bbcode->getAsText(); + // return self::$bbcode->getAsText(); + return $text; } /** * Clean up the contents of tags. + * See if this can be deprecated with a custom implementation! * * @param string $text Dirty * diff --git a/app/BBcodeDefinitions/Align.php b/app/BBcodeDefinitions/Align.php deleted file mode 100644 index 4250992..0000000 --- a/app/BBcodeDefinitions/Align.php +++ /dev/null @@ -1,60 +0,0 @@ - - */ -class Align extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("align"); - $this->setUseOption(true); - } - - /** - * Creates compiled HTML from the align bbcode. - * - * @param ElementNode $el The JBBCode element node. - * - * @return string Compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $alignments = [ - 'left', - 'center', - 'right', - ]; - - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= $child->getAsHTML(); - } - - $alignment = $el->getAttribute()['align']; - - if (!in_array($alignment, $alignments)) { - return $el->getAsBBCode(); - } - - return "
{$content}
"; - } -} diff --git a/app/BBcodeDefinitions/Code.php b/app/BBcodeDefinitions/Code.php deleted file mode 100644 index 7a5737e..0000000 --- a/app/BBcodeDefinitions/Code.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ -class Code extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("code"); - } - - /** - * Compiles the code bbcode to HTML. - * - * @param ElementNode $el The JBBCode element node. - * - * @return mixed The compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= $child->getAsBBCode(); - } - - return "
{$content}
"; - } -} diff --git a/app/BBcodeDefinitions/Lists.php b/app/BBcodeDefinitions/Lists.php deleted file mode 100644 index 06e5dba..0000000 --- a/app/BBcodeDefinitions/Lists.php +++ /dev/null @@ -1,65 +0,0 @@ - - */ -class Lists extends CodeDefinition -{ - /** - * Constructor - */ - public function __construct() - { - $this->parseContent = true; - $this->useOption = false; - $this->setTagName('list'); - $this->nestLimit = -1; - } - - /** - * Compiles the list bbcode to HTML. - * - * @param ElementNode $el The JBBCode element node. - * - * @return string The compiled HTML list. - */ - public function asHtml(ElementNode $el) - { - $bodyHtml = ''; - - foreach ($el->getChildren() as $child) { - $bodyHtml .= $child->getAsHTML(); - } - - $listPieces = explode('[*]', $bodyHtml); - - unset($listPieces[0]); - - $listPieces = array_map(function ($li) { - return "
  • {$li}
  • "; - }, $listPieces); - - $list = implode('', $listPieces); - - return ""; - } -} diff --git a/app/BBcodeDefinitions/Quote.php b/app/BBcodeDefinitions/Quote.php deleted file mode 100644 index 1a9f0e5..0000000 --- a/app/BBcodeDefinitions/Quote.php +++ /dev/null @@ -1,75 +0,0 @@ - - */ -class Quote extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("quote"); - $this->setUseOption(true); - $this->setParseContent(true); - } - - /** - * Compiles the user bbcode to HTML - * - * @param ElementNode $el The JBBCode element node. - * - * @return string The compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $attr = $el->getAttribute()['quote']; - - if (substr($attr, 0, 1) === '#') { - $postId = substr($attr, 1); - $post = new Post($postId); - $forum = new Forum($post->forum); - - if ($post->id !== 0 - && $forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { - $postLink = Router::route('forums.post', $post->id); - - $content = "
    " - . "
    {$post->parsed}
    "; - - return $content; - } - } - - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= $child->getAsHTML(); - } - - return "
    {$attr} wrote
    -
    {$content}
    "; - } -} diff --git a/app/BBcodeDefinitions/Size.php b/app/BBcodeDefinitions/Size.php deleted file mode 100644 index dc7c950..0000000 --- a/app/BBcodeDefinitions/Size.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ -class Size extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("size"); - $this->setUseOption(true); - } - - /** - * Compiles the size bbcode to HTML - * - * @param ElementNode $el The JBBCode element node. - * - * @return string The compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $minSize = 0; - $maxSize = 200; - - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= $child->getAsHTML(); - } - - $size = $el->getAttribute()['size']; - - if ($size < $minSize || $size > $maxSize) { - return $el->getAsBBCode(); - } - - $size = $size / 100; - - return "{$content}"; - } -} diff --git a/app/BBcodeDefinitions/User.php b/app/BBcodeDefinitions/User.php deleted file mode 100644 index 6b5aa02..0000000 --- a/app/BBcodeDefinitions/User.php +++ /dev/null @@ -1,55 +0,0 @@ - - */ -class User extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("user"); - $this->setUseOption(false); - $this->setParseContent(false); - } - - /** - * Compiles the user bbcode to HTML - * - * @param ElementNode $el The JBBCode element node. - * - * @return string The compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= clean_string($child->getAsText(), true); - } - - $user = SakuraUser::construct($content); - $profile = Router::route('user.profile', $user->id); - - return "colour}; - text-shadow: 0 0 .3em {$user->colour}; font-weight: bold;'>{$user->username}"; - } -} diff --git a/app/BBcodeDefinitions/YouTube.php b/app/BBcodeDefinitions/YouTube.php deleted file mode 100644 index c3f429c..0000000 --- a/app/BBcodeDefinitions/YouTube.php +++ /dev/null @@ -1,54 +0,0 @@ - - */ -class YouTube extends CodeDefinition -{ - /** - * Constructor. - */ - public function __construct() - { - parent::__construct(); - $this->setTagName("youtube"); - } - - /** - * Compiles the YouTube bbcode to HTML - * - * @param ElementNode $el The JBBCode element node. - * - * @return string The compiled HTML. - */ - public function asHtml(ElementNode $el) - { - $content = ""; - - foreach ($el->getChildren() as $child) { - $content .= $child->getAsBBCode(); - } - - $foundMatch = preg_match('/^([A-z0-9=\-]+?)$/i', $content, $matches); - - if (!$foundMatch) { - return $el->getAsBBCode(); - } else { - return ""; - } - } -} diff --git a/app/CSRF.php b/app/CSRF.php index bc80910..047e830 100644 --- a/app/CSRF.php +++ b/app/CSRF.php @@ -7,8 +7,6 @@ namespace Sakura; -use Sakura\Hashing; - /** * Used to generate and validate CSRF tokens. * @@ -56,7 +54,7 @@ class CSRF */ public static function generate() { - return bin2hex(\mcrypt_create_iv(self::RANDOM_SIZE, MCRYPT_DEV_URANDOM)); + return bin2hex(random_bytes(self::RANDOM_SIZE)); } /** @@ -77,7 +75,6 @@ class CSRF return false; } - // Use the slowEquals function from the hashing lib to validate - return Hashing::slowEquals($token, $_SESSION[$id]); + return hash_equals($token, $_SESSION[$id]); } } diff --git a/app/Console/Application.php b/app/Console/Application.php index 2f1f9d7..856daef 100644 --- a/app/Console/Application.php +++ b/app/Console/Application.php @@ -25,15 +25,8 @@ class Application extends \CLIFramework\Application */ const VERSION = SAKURA_VERSION; - /** - * CLI initialiser + /* + * Enable command autoloading */ - public function init() - { - // Execute the original init function - parent::init(); - - // Add commands with class reference because the autoloader is retarded - $this->command('serve', Command\ServeCommand::class); - } + protected $commandAutoloadEnabled = true; } diff --git a/app/Console/Command/DatabaseInstallCommand.php b/app/Console/Command/DatabaseInstallCommand.php new file mode 100644 index 0000000..7a0a308 --- /dev/null +++ b/app/Console/Command/DatabaseInstallCommand.php @@ -0,0 +1,26 @@ +createRepository(); + $this->getLogger()->writeln("Created the migration repository!"); + } +} diff --git a/app/Console/Command/DatabaseMigrateCommand.php b/app/Console/Command/DatabaseMigrateCommand.php new file mode 100644 index 0000000..80b65cd --- /dev/null +++ b/app/Console/Command/DatabaseMigrateCommand.php @@ -0,0 +1,40 @@ +getConnectionResolver(), new Filesystem); + + if (!$migrator->repositoryExists()) { + $this->getLogger()->writeln("Run 'database-install' first!"); + return; + } + + $migrator->run(ROOT . self::MIGRATIONS); + + foreach ($migrator->getNotes() as $note) { + $this->getLogger()->writeln($note); + } + } +} diff --git a/app/Console/Command/ServeCommand.php b/app/Console/Command/ServeCommand.php index a163630..725b88b 100644 --- a/app/Console/Command/ServeCommand.php +++ b/app/Console/Command/ServeCommand.php @@ -8,7 +8,6 @@ namespace Sakura\Console\Command; use CLIFramework\Command; -use Sakura\Config; class ServeCommand extends Command { diff --git a/app/Controllers/AuthController.php b/app/Controllers/AuthController.php index 332145f..037f846 100644 --- a/app/Controllers/AuthController.php +++ b/app/Controllers/AuthController.php @@ -11,7 +11,6 @@ use Sakura\ActionCode; use Sakura\ActiveUser; use Sakura\Config; use Sakura\DB; -use Sakura\Hashing; use Sakura\Net; use Sakura\Perms\Site; use Sakura\Router; @@ -125,30 +124,20 @@ class AuthController extends Controller return Template::render('global/information'); } - // Validate password - switch ($user->passwordAlgo) { - // Disabled - case 'disabled': - $this->touchRateLimit($user->id); - $message = 'Logging into this account is disabled.'; - Template::vars(compact('message', 'redirect')); + if (strlen($user->password) < 1) { + $message = 'Your password expired.'; + $redirect = Router::route('auth.resetpassword'); + Template::vars(compact('message', 'redirect')); - return Template::render('global/information'); + return Template::render('global/information'); + } - // Default hashing method - default: - if (!Hashing::validatePassword($password, [ - $user->passwordAlgo, - $user->passwordIter, - $user->passwordSalt, - $user->passwordHash, - ])) { - $this->touchRateLimit($user->id); - $message = 'The password you entered was invalid.'; - Template::vars(compact('message', 'redirect')); + if (!password_verify($password, $user->password)) { + $this->touchRateLimit($user->id); + $message = 'The password you entered was invalid.'; + Template::vars(compact('message', 'redirect')); - return Template::render('global/information'); - } + return Template::render('global/information'); } // Check if the user has the required privs to log in @@ -564,16 +553,13 @@ class AuthController extends Controller } // Hash the password - $pw = Hashing::createHash($password); + $password = password_hash($password, PASSWORD_BCRYPT); // Update the user DB::table('users') ->where('user_id', $user->id) ->update([ - 'password_hash' => $pw[3], - 'password_salt' => $pw[2], - 'password_algo' => $pw[0], - 'password_iter' => $pw[1], + 'password' => $password, 'password_chan' => time(), ]); diff --git a/app/Controllers/FileController.php b/app/Controllers/FileController.php index a2eb8dd..5a6066f 100644 --- a/app/Controllers/FileController.php +++ b/app/Controllers/FileController.php @@ -45,7 +45,7 @@ class FileController extends Controller */ public function avatar($id = 0) { - $noAvatar = ROOT . str_replace( + $noAvatar = ROOT . 'public/' . str_replace( '%tplname%', Template::$name, config('user.avatar_none') @@ -56,18 +56,7 @@ class FileController extends Controller 'mime' => getimagesizefromstring($noAvatar)['mime'], ]; - $deactivePath = ROOT . str_replace( - '%tplname%', - Template::$name, - config('user.avatar_inactive') - ); - $deactive = [ - 'name' => basename($deactivePath), - 'data' => file_get_contents($deactivePath), - 'mime' => getimagesizefromstring($deactivePath)['mime'], - ]; - - $bannedPath = ROOT . str_replace( + $bannedPath = ROOT . 'public/' . str_replace( '%tplname%', Template::$name, config('user.avatar_ban') @@ -80,15 +69,11 @@ class FileController extends Controller $user = User::construct($id); - if ($user->permission(Site::DEACTIVATED)) { - return $this->serve($deactive['data'], $deactive['mime'], $deactive['name']); - } - if ($user->permission(Site::RESTRICTED)) { return $this->serve($banned['data'], $banned['mime'], $banned['name']); } - if (!$user->avatar) { + if ($user->id < 1 || !$user->avatar || $user->permission(Site::DEACTIVATED)) { return $this->serve($none['data'], $none['mime'], $none['name']); } @@ -108,7 +93,7 @@ class FileController extends Controller */ public function background($id = 0) { - $noBg = ROOT . "public/content/pixel.png"; + $noBg = ROOT . "public/images/pixel.png"; $none = [ 'name' => basename($noBg), 'data' => file_get_contents($noBg), @@ -143,7 +128,7 @@ class FileController extends Controller */ public function header($id = 0) { - $noHeader = ROOT . "public/content/pixel.png"; + $noHeader = ROOT . "public/images/pixel.png"; $none = [ 'name' => basename($noHeader), 'data' => file_get_contents($noHeader), diff --git a/app/Controllers/Settings/AccountController.php b/app/Controllers/Settings/AccountController.php index a5e3ec8..12ba7cc 100644 --- a/app/Controllers/Settings/AccountController.php +++ b/app/Controllers/Settings/AccountController.php @@ -10,7 +10,6 @@ namespace Sakura\Controllers\Settings; use Sakura\ActiveUser; use Sakura\Config; use Sakura\DB; -use Sakura\Hashing; use Sakura\Perms\Site; use Sakura\Router; use Sakura\Template; @@ -237,12 +236,7 @@ class AccountController extends Controller } // Check current password - if (!Hashing::validatePassword($current, [ - ActiveUser::$user->passwordAlgo, - ActiveUser::$user->passwordIter, - ActiveUser::$user->passwordSalt, - ActiveUser::$user->passwordHash, - ])) { + if (!password_verify($current, ActiveUser::$user->password)) { $message = "Your password was invalid!"; Template::vars(compact('redirect', 'message')); return Template::render('global/information'); diff --git a/app/Controllers/Settings/AdvancedController.php b/app/Controllers/Settings/AdvancedController.php index 4740bec..4a49eac 100644 --- a/app/Controllers/Settings/AdvancedController.php +++ b/app/Controllers/Settings/AdvancedController.php @@ -9,7 +9,6 @@ namespace Sakura\Controllers\Settings; use Sakura\ActiveUser; use Sakura\DB; -use Sakura\Hashing; use Sakura\Perms\Site; use Sakura\Router; use Sakura\Template; @@ -115,12 +114,7 @@ class AdvancedController extends Controller } // Check password - if (!Hashing::validatePassword($password, [ - ActiveUser::$user->passwordAlgo, - ActiveUser::$user->passwordIter, - ActiveUser::$user->passwordSalt, - ActiveUser::$user->passwordHash, - ])) { + if (!password_verify($password, ActiveUser::$user->password)) { $message = "Your password was invalid!"; Template::vars(compact('redirect', 'message')); return Template::render('global/information'); diff --git a/app/DB.php b/app/DB.php index 411b638..fc408c7 100644 --- a/app/DB.php +++ b/app/DB.php @@ -7,7 +7,9 @@ namespace Sakura; -use \Illuminate\Database\Capsule\Manager; +use Illuminate\Database\Capsule\Manager; +use Illuminate\Database\ConnectionResolver; +use Illuminate\Database\Migrations\DatabaseMigrationRepository; /** * The Illuminate (Laravel) database wrapper. @@ -17,5 +19,16 @@ use \Illuminate\Database\Capsule\Manager; */ class DB extends Manager { - // This class solely exists as an alias + public static function getMigrationRepository() + { + $resolver = new ConnectionResolver(['database' => self::connection()]); + $repository = new DatabaseMigrationRepository($resolver, 'migrations'); + $repository->setSource('database'); + return $repository; + } + + public static function getSchemaBuilder() + { + return self::connection()->getSchemaBuilder(); + } } diff --git a/app/Forum/Forum.php b/app/Forum/Forum.php index ed69eb1..b1b8036 100644 --- a/app/Forum/Forum.php +++ b/app/Forum/Forum.php @@ -78,35 +78,35 @@ class Forum * * @var Post */ - private $_firstPost = null; + private $firstPostCache = null; /** * A cached instance of the last post in this forum. * * @var Post */ - private $_lastPost = null; + private $lastPostCache = null; /** * Cached instances of the subforums. * * @var array */ - private $_forums = []; + private $forumsCache = []; /** * Cached instances of the threads in this forum. * * @var array */ - private $_threads = []; + private $threadsCache = []; /** * The permission container. * * @var Perms */ - private $_permissions; + private $permissionsCache; /** * Constructor. @@ -121,7 +121,7 @@ class Forum ->get(); // Create permissions object - $this->_permissions = new Perms(Perms::FORUM); + $this->permissionsCache = new Perms(Perms::FORUM); // Populate the variables if ($forumRow) { @@ -159,9 +159,9 @@ class Forum } // Bitwise OR it with the permissions for this forum - $perm = $perm | $this->_permissions->user($user, ['forum_id' => [$this->id, '=']]); + $perm = $perm | $this->permissionsCache->user($user, ['forum_id' => [$this->id, '=']]); - return $raw ? $perm : $this->_permissions->check($flag, $perm); + return $raw ? $perm : $this->permissionsCache->check($flag, $perm); } /** @@ -171,8 +171,8 @@ class Forum */ public function forums() { - // Check if _forums is populated - if (!count($this->_forums)) { + // Check if forumsCache is populated + if (!count($this->forumsCache)) { // Get all rows with the category id set to the forum id $forumRows = DB::table('forums') ->where('forum_category', $this->id) @@ -187,9 +187,9 @@ class Forum $forums[$forum->forum_id] = new Forum($forum->forum_id); } - $this->_forums = $forums; + $this->forumsCache = $forums; } else { - $forums = $this->_forums; + $forums = $this->forumsCache; } // Return the forum objects @@ -203,8 +203,8 @@ class Forum */ public function threads() { - // Check if _threads is populated - if (!count($this->_threads)) { + // Check if threadsCache is populated + if (!count($this->threadsCache)) { // Get all rows with the forum id for this forum $threadRows = DB::table('topics') ->where('forum_id', $this->id) @@ -220,9 +220,9 @@ class Forum $threads[$thread->topic_id] = new Thread($thread->topic_id); } - $this->_threads = $threads; + $this->threadsCache = $threads; } else { - $threads = $this->_threads; + $threads = $this->threadsCache; } // Return the thread objects @@ -236,8 +236,8 @@ class Forum */ public function firstPost() { - // Check if _firstPost is set - if ($this->_firstPost === null) { + // Check if firstPostCache is set + if ($this->firstPostCache === null) { // Get the row $firstPost = DB::table('posts') ->where('forum_id', $this->id) @@ -249,12 +249,12 @@ class Forum $post = new Post(empty($firstPost) ? 0 : $firstPost[0]->post_id); // Assign it to a "cache" variable - $this->_firstPost = $post; + $this->firstPostCache = $post; // Return the post object return $post; } else { - return $this->_firstPost; + return $this->firstPostCache; } } @@ -265,8 +265,8 @@ class Forum */ public function lastPost() { - // Check if _lastPost is set - if ($this->_lastPost === null) { + // Check if lastPostCache is set + if ($this->lastPostCache === null) { // Get the row $lastPost = DB::table('posts') ->where('forum_id', $this->id) @@ -278,12 +278,12 @@ class Forum $post = new Post(empty($lastPost) ? 0 : $lastPost[0]->post_id); // Assign it to a "cache" variable - $this->_lastPost = $post; + $this->lastPostCache = $post; // Return the post object return $post; } else { - return $this->_lastPost; + return $this->lastPostCache; } } diff --git a/app/Forum/Thread.php b/app/Forum/Thread.php index af0ac93..a4f6d69 100644 --- a/app/Forum/Thread.php +++ b/app/Forum/Thread.php @@ -104,21 +104,21 @@ class Thread * * @var array */ - private $_posts = []; + private $postsCache = []; /** * A cached instance of opening post. * * @var Post */ - private $_firstPost = null; + private $firstPostCache = null; /** * A cached instance of the last reply. * * @var Post */ - private $_lastPost = null; + private $lastPostCache = null; /** * Constructor. @@ -244,8 +244,8 @@ class Thread */ public function posts() { - // Check if _posts is something - if (!count($this->_posts)) { + // Check if postsCache is something + if (!count($this->postsCache)) { // Get all rows with the thread id $postRows = DB::table('posts') ->where('topic_id', $this->id) @@ -259,9 +259,9 @@ class Thread $posts[$post->post_id] = new Post($post->post_id); } - $this->_posts = $posts; + $this->postsCache = $posts; } else { - $posts = $this->_posts; + $posts = $this->postsCache; } // Return the post objects @@ -276,8 +276,8 @@ class Thread public function firstPost() { // Check if the cache var is set - if ($this->_firstPost !== null) { - return $this->_firstPost; + if ($this->firstPostCache !== null) { + return $this->firstPostCache; } // Get the row from the database @@ -291,7 +291,7 @@ class Thread $post = new Post($post ? $post[0]->post_id : 0); // Assign it to the cache var - $this->_firstPost = $post; + $this->firstPostCache = $post; // Return return $post; @@ -305,8 +305,8 @@ class Thread public function lastPost() { // Check if the cache var is set - if ($this->_lastPost !== null) { - return $this->_lastPost; + if ($this->lastPostCache !== null) { + return $this->lastPostCache; } // Get the row from the database @@ -320,7 +320,7 @@ class Thread $post = new Post($post ? $post[0]->post_id : 0); // Assign it to the cache var - $this->_lastPost = $post; + $this->lastPostCache = $post; // Return return $post; diff --git a/app/Hashing.php b/app/Hashing.php deleted file mode 100644 index f5052db..0000000 --- a/app/Hashing.php +++ /dev/null @@ -1,226 +0,0 @@ - - * @author Julian van de Groep - */ -class Hashing -{ - /** - * Hashing algorithm that should be used. - * - * @var string - */ - private static $hashAlgorithm = 'sha256'; - - /** - * Iterations. - * - * @var int - */ - private static $iterations = 1000; - - /** - * The amount of bytes the salt should be. - * - * @var int - */ - private static $saltBytes = 24; - - /** - * The amount of bytes the hash should be. - * - * @var int - */ - private static $hashBytes = 24; - - /** - * Creates a hash. - * - * @param string $pass The password that should be hashed. - * - * @return array An array containing the algorithm, iterations, salt and hash. - */ - public static function createHash($pass) - { - $salt = base64_encode( - \mcrypt_create_iv( - self::$saltBytes, - MCRYPT_DEV_URANDOM - ) - ); - - $hash = base64_encode( - self::pbkdf2( - self::$hashAlgorithm, - $pass, - $salt, - self::$iterations, - self::$hashBytes, - true - ) - ); - - $passwordData = [ - self::$hashAlgorithm, - self::$iterations, - $salt, - $hash, - ]; - - return $passwordData; - } - - /** - * Validate a password. - * - * @param string $password The password that is being validated. - * @param array $params The parametres in the order of algorithm, iterations, salt and hash. - * - * @return bool Correct? - */ - public static function validatePassword($password, $params) - { - if (count($params) < 4) { - return false; - } - - $pbkdf2 = base64_decode($params[3]); - - $validate = self::slowEquals( - $pbkdf2, - self::pbkdf2( - $params[0], - $password, - $params[2], - (int) $params[1], - strlen($pbkdf2), - true - ) - ); - - return $validate; - } - - /** - * Compares two strings $a and $b in length-constant time. - * - * @param string $a String A. - * @param string $b String B. - * - * @return bool Boolean indicating difference. - */ - public static function slowEquals($a, $b) - { - $diff = strlen($a) ^ strlen($b); - - for ($i = 0; $i < strlen($a) && $i < strlen($b); $i++) { - $diff |= ord($a[$i]) ^ ord($b[$i]); - } - - return $diff === 0; - } - - /** - * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt - * - * This implementation of PBKDF2 was originally created by https://defuse.ca - * With improvements by http://www.variations-of-shadow.com - * - * @param mixed $algorithm The hash algorithm to use. Recommended: SHA256. - * @param mixed $password The password. - * @param mixed $salt A salt that is unique to the password. - * @param mixed $count Iteration count. Higher is better, but slower. Recommended: At least 1000. - * @param mixed $key_length The length of the derived key in bytes. - * @param mixed $raw_output A $key_length-byte key derived from the password and salt. - * - * @return string The PBKDF2 derivation. - */ - private static function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) - { - $algorithm = strtolower($algorithm); - - if (!in_array($algorithm, hash_algos(), true)) { - trigger_error( - 'PBKDF2 ERROR: Invalid hash algorithm.', - E_USER_ERROR - ); - } - - if ($count <= 0 || $key_length <= 0) { - trigger_error( - 'PBKDF2 ERROR: Invalid parameters.', - E_USER_ERROR - ); - } - - if (function_exists('hash_pbkdf2')) { - // The output length is in NIBBLES (4-bits) if $raw_output is false! - if (!$raw_output) { - $key_length = $key_length * 2; - } - - return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output); - } - - $hash_length = strlen(hash($algorithm, '', true)); - $block_count = ceil($key_length / $hash_length); - - $output = ''; - - for ($i = 1; $i <= $block_count; $i++) { - // $i encoded as 4 bytes, big endian. - $last = $salt . pack('N', $i); - - // First iteration - $last = $xorsum = hash_hmac($algorithm, $last, $password, true); - - // Perform the other $count - 1 interations - for ($j = 1; $j < $count; $j++) { - $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); - } - - $output .= $xorsum; - - if ($raw_output) { - return substr($output, 0, $key_length); - } - - return bin2hex(substr($output, 0, $key_length)); - } - } -} diff --git a/app/Template.php b/app/Template.php index 5a71910..fac0f66 100644 --- a/app/Template.php +++ b/app/Template.php @@ -42,13 +42,6 @@ class Template */ public static $name; - /** - * The path to the client side resources - * - * @var string - */ - public static $resources; - /** * The file extension used by template files */ @@ -64,9 +57,6 @@ class Template // Set variables self::$name = $name; - // Set reources path - self::$resources = '/content/data/' . self::$name; - // Reinitialise self::init(); } @@ -77,14 +67,14 @@ class Template public static function init() { // Initialise Twig Filesystem Loader - $twigLoader = new Twig_Loader_Filesystem(ROOT . 'views/' . self::$name); + $twigLoader = new Twig_Loader_Filesystem(ROOT . 'resources/views/' . self::$name); // Environment variable $twigEnv = []; // Enable caching if (config("performance.template_cache")) { - $twigEnv['cache'] = ROOT . config("performance.cache_dir") . 'twig'; + $twigEnv['cache'] = ROOT . config("performance.cache_dir") . 'views'; } // And now actually initialise the templating engine @@ -94,18 +84,11 @@ class Template self::$engine->addExtension(new Twig_Extension_StringLoader()); // Add route function - self::$engine->addFunction(new Twig_SimpleFunction('route', function ($name, $args = null) { - return Router::route($name, $args); - })); + self::$engine->addFunction(new Twig_SimpleFunction('route', 'route')); // Add config function self::$engine->addFunction(new Twig_SimpleFunction('config', 'config')); - // Add resource function - self::$engine->addFunction(new Twig_SimpleFunction('resource', function ($path = "") { - return self::$resources . "/{$path}"; - })); - // Method of getting the currently active session id self::$engine->addFunction(new Twig_SimpleFunction('session_id', 'session_id')); @@ -135,10 +118,6 @@ class Template */ public static function render($file) { - try { - return self::$engine->render($file . self::FILE_EXT, self::$vars); - } catch (\Exception $e) { - return trigger_error($e->getMessage(), E_USER_ERROR); - } + return self::$engine->render($file . self::FILE_EXT, self::$vars); } } diff --git a/app/User.php b/app/User.php index 0ab1738..ed9130b 100644 --- a/app/User.php +++ b/app/User.php @@ -219,7 +219,7 @@ class User * * @var array */ - protected static $_userCache = []; + protected static $userCache = []; /** * Cached constructor. @@ -232,13 +232,13 @@ class User public static function construct($uid, $forceRefresh = false) { // Check if a user object isn't present in cache - if ($forceRefresh || !array_key_exists($uid, self::$_userCache)) { + if ($forceRefresh || !array_key_exists($uid, self::$userCache)) { // If not create a new object and cache it - self::$_userCache[$uid] = new User($uid); + self::$userCache[$uid] = new User($uid); } // Return the cached object - return self::$_userCache[$uid]; + return self::$userCache[$uid]; } /** @@ -256,17 +256,14 @@ class User // Set a few variables $usernameClean = clean_string($username, true); $emailClean = clean_string($email, true); - $password = Hashing::createHash($password); + $password = password_hash($password, PASSWORD_BCRYPT); // Insert the user into the database and get the id $userId = DB::table('users') ->insertGetId([ 'username' => $username, 'username_clean' => $usernameClean, - 'password_hash' => $password[3], - 'password_salt' => $password[2], - 'password_algo' => $password[0], - 'password_iter' => $password[1], + 'password' => $password, 'email' => $emailClean, 'rank_main' => 0, 'register_ip' => Net::pton(Net::ip()), @@ -308,11 +305,7 @@ class User $this->id = $userRow->user_id; $this->username = $userRow->username; $this->usernameClean = $userRow->username_clean; - $this->passwordHash = $userRow->password_hash; - $this->passwordSalt = $userRow->password_salt; - $this->passwordAlgo = $userRow->password_algo; - $this->passwordIter = $userRow->password_iter; - $this->passwordChan = $userRow->password_chan; + $this->password = $userRow->password; $this->email = $userRow->email; $this->mainRankId = $userRow->rank_main; $this->colour = $userRow->user_colour; @@ -1015,62 +1008,6 @@ class User return $return; } - /** - * Get the open warnings on this user. - * - * @return array The warnings. - */ - public function getWarnings() - { - // Do the database query - $getWarnings = DB::table('warnings') - ->where('user_id', $this->id) - ->get(); - - // Storage array - $warnings = []; - - // Add special stuff - foreach ($getWarnings as $warning) { - // Check if it hasn't expired - if ($warning->warning_expires < time()) { - DB::table('warnings') - ->where('warning_id', $warning['warning_id']) - ->delete(); - continue; - } - - // Text action - switch ($warning->warning_action) { - default: - case '0': - $warning->warning_action_text = 'Warning'; - break; - case '1': - $warning->warning_action_text = 'Silence'; - break; - case '2': - $warning->warning_action_text = 'Restriction'; - break; - case '3': - $warning->warning_action_text = 'Ban'; - break; - case '4': - $warning->warning_action_text = 'Abyss'; - break; - } - - // Text expiration - $warning->warning_length = round(($warning->warning_expires - $warning->warning_issued) / 60); - - // Add to array - $warnings[$warning->warning_id] = $warning; - } - - // Return all the warnings - return $warnings; - } - /** * Parse the user's userpage. * @@ -1155,16 +1092,13 @@ class User public function setPassword($password) { // Create hash - $password = Hashing::createHash($password); + $password = password_hash($password, PASSWORD_BCRYPT); // Update userrow DB::table('users') ->where('user_id', $this->id) ->update([ - 'password_hash' => $password[3], - 'password_salt' => $password[2], - 'password_algo' => $password[0], - 'password_iter' => $password[1], + 'password' => $password, 'password_chan' => time(), ]); } diff --git a/composer.json b/composer.json index ecbee13..4b887a5 100644 --- a/composer.json +++ b/composer.json @@ -12,13 +12,15 @@ "ext-curl": "*", "ext-json": "*", "twig/twig": "*", - "phpmailer/phpmailer": "*", "paypal/rest-api-sdk-php": "*", - "jbbcode/jbbcode": "*", - "corneltek/cliframework": "*", "phroute/phroute": "^2.1", "illuminate/database": "5.2.*", - "doctrine/dbal": "~2.4" + "doctrine/dbal": "~2.4", + "golonka/bbcodeparser": "^2.2", + "nesbot/carbon": "^1.21", + "swiftmailer/swiftmailer": "^5.4", + "corneltek/cliframework": "^3.0", + "illuminate/filesystem": "^5.2" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index c4e893d..1d94871 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "765ea465939a65048ac736e4fbc6c167", - "content-hash": "1af681873ad63e53d42dfd445d67b388", + "hash": "1f0887a5e8183bc1ca24e7c50e054ba1", + "content-hash": "271f4f1bcfb9fdc9446336132938b762", "packages": [ { "name": "corneltek/class-template", @@ -725,6 +725,56 @@ ], "time": "2014-09-09 13:34:57" }, + { + "name": "golonka/bbcodeparser", + "version": "v2.2.2", + "source": { + "type": "git", + "url": "https://github.com/golonka/BBCodeParser.git", + "reference": "769c4ebe6207ffa20298b84b90eafca87ce2fb95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/golonka/BBCodeParser/zipball/769c4ebe6207ffa20298b84b90eafca87ce2fb95", + "reference": "769c4ebe6207ffa20298b84b90eafca87ce2fb95", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4", + "squizlabs/php_codesniffer": "~2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Golonka\\BBCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joseph Landberg", + "email": "joseph.landberg@gmail.com", + "homepage": "http://github.com/golonka/" + } + ], + "description": "Parse your BBCode easy with this library.", + "homepage": "http://github.com/golonka/bbcodeparser", + "keywords": [ + "PSR-1", + "PSR-2", + "PSR-4", + "bbcode", + "laravel", + "parser" + ], + "time": "2016-03-03 09:56:19" + }, { "name": "illuminate/container", "version": "v5.2.37", @@ -870,6 +920,56 @@ ], "time": "2016-06-06 13:12:46" }, + { + "name": "illuminate/filesystem", + "version": "v5.2.37", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "e9c3ba4fce5853f559f805a5626b18517a55b8b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/e9c3ba4fce5853f559f805a5626b18517a55b8b3", + "reference": "e9c3ba4fce5853f559f805a5626b18517a55b8b3", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.2.*", + "illuminate/support": "5.2.*", + "php": ">=5.5.9", + "symfony/finder": "2.8.*|3.0.*" + }, + "suggest": { + "league/flysystem": "Required to use the Flysystem local and FTP drivers (~1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.2-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylorotwell@gmail.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "http://laravel.com", + "time": "2016-05-31 15:08:27" + }, { "name": "illuminate/support", "version": "v5.2.37", @@ -926,52 +1026,6 @@ "homepage": "http://laravel.com", "time": "2016-05-30 02:40:53" }, - { - "name": "jbbcode/jbbcode", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/jbowens/jBBCode.git", - "reference": "645b6a1c0afa92b7d029d3417ebd8b60a5c578b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jbowens/jBBCode/zipball/645b6a1c0afa92b7d029d3417ebd8b60a5c578b3", - "reference": "645b6a1c0afa92b7d029d3417ebd8b60a5c578b3", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "JBBCode": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jackson Owens", - "email": "jackson_owens@alumni.brown.edu", - "homepage": "http://jbowens.org/", - "role": "Developer" - } - ], - "description": "A lightweight but extensible BBCode parser written in PHP 5.3.", - "homepage": "http://jbbcode.com/", - "keywords": [ - "BB", - "bbcode" - ], - "time": "2014-07-06 05:48:20" - }, { "name": "nesbot/carbon", "version": "1.21.0", @@ -1116,66 +1170,6 @@ ], "time": "2016-07-15 20:42:18" }, - { - "name": "phpmailer/phpmailer", - "version": "v5.2.16", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a", - "reference": "1d85f9ef3ecfc42bbc4f3c70d5e37ca9a65f629a", - "shasum": "" - }, - "require": { - "php": ">=5.0.0" - }, - "require-dev": { - "phpdocumentor/phpdocumentor": "*", - "phpunit/phpunit": "4.7.*" - }, - "suggest": { - "league/oauth2-google": "Needed for Google XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "classmap": [ - "class.phpmailer.php", - "class.phpmaileroauth.php", - "class.phpmaileroauthgoogle.php", - "class.smtp.php", - "class.pop3.php", - "extras/EasyPeasyICS.php", - "extras/ntlm_sasl_client.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2016-06-06 09:09:37" - }, { "name": "phroute/phroute", "version": "v2.1.0", @@ -1304,6 +1298,59 @@ ], "time": "2012-12-21 11:40:51" }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", + "reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2016-07-08 11:51:25" + }, { "name": "symfony/class-loader", "version": "v3.0.0", diff --git a/config/config.example.ini b/config/config.example.ini index 356435e..4684d8e 100644 --- a/config/config.example.ini +++ b/config/config.example.ini @@ -1,38 +1,41 @@ ; Database configuration according to https://laravel.com/docs/5.2/database#introduction ; Put some here in advance, uncomment the one you need. [database] -;; mysql -;driver = mysql -;host = localhost -;port = 3306 -;username = sakura -;password = password -;prefix = sakura_ -;database = sakura-development -;charset = utf8 -;collation = utf8_unicode_ci +; ; mysql +; driver = mysql +; host = localhost +; port = 3306 +; username = sakura +; password = password +; prefix = sakura_ +; database = sakura-development +; charset = utf8 +; collation = utf8_unicode_ci -;; sqlite -;driver = sqlite -;database = sakura.sq3 -;prefix = sakura_ +; ; sqlite +; driver = sqlite +; database = sakura.sq3 +; prefix = sakura_ -;; postgres -;driver = pgsql -;host = localhost -;port = 5432 -;username = sakura -;password = password -;prefix = sakura_ -;database = sakura-development -;charset = utf8 -;schema = public +; ; postgres +; driver = pgsql +; host = localhost +; port = 5432 +; username = sakura +; password = password +; prefix = sakura_ +; database = sakura-development +; charset = utf8 +; schema = public ; General site settings [general] ; Name of the site name = Sakura +; Logo of the site +logo = + ; Description of the site description = Test site @@ -48,6 +51,9 @@ cover = ; Close the site for maintenance maintenance = false +; URL of the sakurako chat (full path) without trailing slash +chat = http://chat.localghost + ; Cookie settings [cookie] prefix = sakura_ @@ -90,7 +96,7 @@ username = password = server = port = 25 -secure = true +secure = tls ; File settings [file] @@ -116,10 +122,9 @@ max_width = 2048 ; User settings [user] -; Avatars -avatar_ban = public/content/data/%tplname%/images/banned-av.png -avatar_none = public/content/data/%tplname%/images/no-av.png -avatar_inactive = public/content/data/%tplname%/images/deactivated-av.png +; Avatars (relative to public/) +avatar_ban = images/%tplname%-ban.png +avatar_none = images/%tplname%-none.png ; Username constraints name_min = 3 diff --git a/database/2013_01_27_221444_base_tables.php b/database/2013_01_27_221444_base_tables.php index 1b4a496..43b0e8d 100644 --- a/database/2013_01_27_221444_base_tables.php +++ b/database/2013_01_27_221444_base_tables.php @@ -1,6 +1,7 @@ string('code_action', 255) - ->comment('Action identifier so the backend knows what to do.'); + $schema = DB::getSchemaBuilder(); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that would be affected by this action'); + $schema->create('actioncodes', function (Blueprint $table) { + $table->string('code_action', 255); - $table->string('action_code', 255) - ->comment('The URL key for using this code.'); + $table->integer('user_id') + ->unsigned(); + + $table->string('action_code', 255); }); - Schema::create('apikeys', function (Blueprint $table) { - $table->bigIncrements('id', 128) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); + $schema->create('comment_votes', function (Blueprint $table) { + $table->integer('vote_comment') + ->unsigned(); - $table->bigInteger('owner', 128) - ->unsigned() - ->comment('ID of user that owns this API key.'); + $table->integer('vote_user') + ->unsigned(); - $table->string('apikey', 32) - ->comment('The API key.'); + $table->tinyInteger('vote_state') + ->unsigned(); }); - Schema::create('bans', function (Blueprint $table) { - $table->bigIncrements('ban_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); + $schema->create('comments', function (Blueprint $table) { + $table->increments('comment_id'); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user that was banned, 0 for just an IP ban.'); + $table->string('comment_category', 32); - $table->integer('ban_begin', 11) - ->unsigned() - ->comment('Timestamp when the user was banned.'); + $table->integer('comment_timestamp') + ->unsigned(); - $table->integer('ban_end', 11) - ->unsigned() - ->comment('Timestamp when the user should regain access to the site.'); + $table->integer('comment_poster') + ->unsigned(); - $table->string('ban_reason', 512) - ->nullable() - ->default(null) - ->comment('Reason given for the ban.'); - - $table->bigInteger('ban_moderator', 255) + $table->integer('comment_reply_to') ->unsigned() - ->comment('ID of moderator that banned this user,'); + ->default(0); + + $table->text('comment_text', 255); }); - Schema::create('comment_votes', function (Blueprint $table) { - $table->bigInteger('vote_comment', 255) - ->unsigned() - ->comment('ID of the comment that was voted on.'); + $schema->create('emoticons', function (Blueprint $table) { + $table->string('emote_string', 255); - $table->bigInteger('vote_user', 255) - ->unsigned() - ->comment('ID of the voter.'); - - $table->tinyInteger('vote_state', 1) - ->unsigned() - ->comment('0 = dislike, 1 = like.'); + $table->string('emote_path', 255); }); - Schema::create('comments', function (Blueprint $table) { - $table->bigIncrements('comment_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + $schema->create('error_log', function (Blueprint $table) { + $table->string('error_id', 32); - $table->string('comment_category', 32) - ->comment('Comment category.'); + $table->string('error_timestamp', 128); - $table->integer('comment_timestamp', 11) - ->unsigned() - ->comment('Timestamp of when this comment was posted.'); + $table->integer('error_revision') + ->unsigned(); - $table->bigInteger('comment_poster', 255) - ->unsigned() - ->comment('User ID of the poster.'); + $table->integer('error_type') + ->unsigned(); - $table->bigInteger('comment_reply_to', 255) - ->unsigned() - ->default(0) - ->comment('ID of the comment this comment is a reply to'); + $table->integer('error_line') + ->unsigned(); - $table->text('comment_text', 255) - ->comment('Content of the comment.'); + $table->string('error_string', 512); + + $table->string('error_file', 512); + + $table->text('error_backtrace'); }); - Schema::create('config', function (Blueprint $table) { - $table->string('config_name', 255) - ->unique() - ->comment('Array key for configuration value'); + $schema->create('faq', function (Blueprint $table) { + $table->increments('faq_id'); - $table->string('config_value', 255) - ->comment('The value, obviously.'); + $table->string('faq_shorthand', 255); + + $table->string('faq_question', 255); + + $table->text('faq_answer'); }); - Schema::create('emoticons', function (Blueprint $table) { - $table->string('emote_string', 255) - ->comment('String to catch and replace'); + $schema->create('forum_permissions', function (Blueprint $table) { + $table->integer('forum_id') + ->unsigned(); - $table->string('emote_path', 255) - ->comment('Path to the image file relative to the content domain.'); + $table->integer('rank_id') + ->unsigned(); + + $table->integer('user_id') + ->unsigned(); + + $table->string('forum_perms', 255); }); - Schema::create('error_log', function (Blueprint $table) { - $table->string('error_id', 32) - ->comment('An ID that is created when an error occurs.'); + $schema->create('forums', function (Blueprint $table) { + $table->increments('forum_id'); - $table->string('error_timestamp', 128) - ->comment('A datestring from when the error occurred.'); + $table->integer('forum_order') + ->unsigned(); - $table->integer('error_revision', 16) + $table->string('forum_name', 255); + + $table->text('forum_desc'); + + $table->string('forum_link', 255); + + $table->integer('forum_category') ->unsigned() - ->comment('Sakura Revision number.'); + ->default(0); - $table->integer('error_type', 16) + $table->tinyInteger('forum_type') ->unsigned() - ->comment('The PHP error type of this error.'); + ->default(0); - $table->integer('error_line', 32) - ->unsigned() - ->comment('The line that caused this error.'); - - $table->string('error_string', 512) - ->comment("PHP's description of this error."); - - $table->string('error_file', 512) - ->comment('The file in which this error occurred.'); - - $table->text('error_backtrace') - ->comment('A full base64 and json encoded backtrace containing all environment data.'); + $table->string('forum_icon', 255); }); - Schema::create('faq', function (Blueprint $table) { - $table->bigIncrements('faq_id', 128) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + $schema->create('friends', function (Blueprint $table) { + $table->integer('user_id') + ->unsigned(); - $table->string('faq_shorthand', 255) - ->comment('Used for linking directly to a question.'); - - $table->string('faq_question', 255) - ->comment('The question.'); - - $table->text('faq_answer') - ->comment('The answer.'); - }); - - Schema::create('forum_permissions', function (Blueprint $table) { - $table->bigInteger('forum_id', 255) - ->unsigned() - ->comment('Forum ID'); - - $table->bigInteger('rank_id', 128) - ->unsigned() - ->comment('Rank ID, leave 0 for a user'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID, leave 0 for a rank'); - - $table->string('forum_perms', 255) - ->comment('Forum action permission string'); - }); - - Schema::create('forums', function (Blueprint $table) { - $table->bigIncrements('forum_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); - - $table->bigInteger('forum_order', 255) - ->unsigned() - ->comment('Forum sorting order.'); - - $table->string('forum_name', 255) - ->comment('Display name of the forum.'); - - $table->text('forum_desc') - ->comment('Description of the forum.'); - - $table->string('forum_link', 255) - ->comment('If set forum will display as a link.'); - - $table->bigInteger('forum_category', 255) - ->unsigned() - ->default(0) - ->comment('ID of the category this forum falls under.'); - - $table->tinyInteger('forum_type', 4) - ->unsigned() - ->default(0) - ->comment('Forum type, 0 for regular board, 1 for category and 2 for link.'); - - $table->string('forum_icon', 255) - ->comment('Display icon for the forum.'); - }); - - Schema::create('friends', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that added the friend.'); - - $table->bigInteger('friend_id', 255) - ->unsigned() - ->comment('ID of the user that was added as a friend.'); + $table->integer('friend_id') + ->unsigned(); $table->integer('friend_timestamp', 11) - ->unsigned() - ->comment('Timestamp of action.'); + ->unsigned(); }); - Schema::create('infopages', function (Blueprint $table) { - $table->string('page_shorthand', 255) - ->comment('Name used for calling this page up in the /r/URL'); + $schema->create('login_attempts', function (Blueprint $table) { + $table->increments('attempt_id'); - $table->string('page_title', 255) - ->comment('Title displayed on the top of the page'); + $table->tinyInteger('attempt_success') + ->unsigned(); - $table->text('page_content') - ->comment('Content of the page'); + $table->integer('attempt_timestamp') + ->unsigned(); + + $table->string('attempt_ip', 255); + + $table->integer('user_id') + ->unsigned(); }); - Schema::create('login_attempts', function (Blueprint $table) { - $table->bigIncrements('attempt_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + $schema->create('news', function (Blueprint $table) { + $table->increments('news_id'); - $table->tinyInteger('attempt_success', 1) - ->unsigned() - ->comment('Success boolean.'); + $table->string('news_category', 255); - $table->integer('attempt_timestamp', 11) - ->unsigned() - ->comment('Unix timestamp of the event.'); + $table->integer('user_id') + ->unsigned(); - $table->string('attempt_ip', 255) - ->comment('IP that made this attempt.'); + $table->integer('news_timestamp') + ->unsigned(); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that was attempted to log in to.'); + $table->string('news_title', 255); + + $table->text('news_content'); }); - Schema::create('messages', function (Blueprint $table) { - $table->bigIncrements('id', 128) + $schema->create('notifications', function (Blueprint $table) { + $table->increments('alert_id'); + + $table->integer('user_id') ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); + ->default(0); - $table->bigInteger('from_user', 255) + $table->integer('alert_timestamp') ->unsigned() - ->comment('ID of the user that sent this message.'); + ->default(0); - $table->bigInteger('to_user', 255) + $table->tinyInteger('alert_read') ->unsigned() - ->comment('ID of user that should receive this message.'); + ->default(0); - $table->string('read', 255) - ->comment('IDs of users who read this message.'); - - $table->string('deleted', 255) - ->comment('Indicator if one of the parties deleted the message, if it is already 1 the script will remove this row.'); - - $table->integer('timestamp', 11) + $table->tinyInteger('alert_sound') ->unsigned() - ->comment('Timestamp of the time this message was sent'); + ->default(0); - $table->string('subject', 255) - ->comment('Title of the message'); + $table->string('alert_title', 255); - $table->text('content') - ->comment('Contents of the message.'); + $table->string('alert_text', 255); + + $table->string('alert_link', 255); + + $table->string('alert_img', 255); + + $table->integer('alert_timeout') + ->unsigned() + ->default(0); }); - Schema::create('news', function (Blueprint $table) { - $table->bigIncrements('news_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->string('news_category', 255) - ->comment('Category ID.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user who posted this news message.'); - - $table->integer('news_timestamp', 11) - ->unsigned() - ->comment('News post timestamp.'); - - $table->string('news_title', 255) - ->comment('Title of the post.'); - - $table->text('news_content') - ->comment('Contents of the post'); - }); - - Schema::create('notifications', function (Blueprint $table) { - $table->bigIncrements('alert_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->default(0) - ->comment('User ID this notification is intended for.'); - - $table->integer('alert_timestamp', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp when this notification was created.'); - - $table->tinyInteger('alert_read', 1) - ->unsigned() - ->default(0) - ->comment('Toggle for unread and read.'); - - $table->tinyInteger('alert_sound', 1) - ->unsigned() - ->default(0) - ->comment('Toggle if a sound should be played upon receiving the notification.'); - - $table->string('alert_title', 255) - ->comment('Title displayed on the notification.'); - - $table->string('alert_text', 255) - ->comment('Text displayed.'); - - $table->string('alert_link', 255) - ->comment('Link (empty for no link).'); - - $table->string('alert_img', 255) - ->comment('Image path, prefix with font: to use a font class instead of an image.'); - - $table->integer('alert_timeout', 16) - ->unsigned() - ->default(0) - ->comment('How long the notification should stay on screen in milliseconds, 0 for forever.'); - }); - - Schema::create('optionfields', function (Blueprint $table) { + $schema->create('optionfields', function (Blueprint $table) { $table->string('option_id', 255) - ->unique() - ->comment('Unique identifier for accessing this option.'); + ->unique(); - $table->string('option_name', 255) - ->comment('Description of the field in a proper way.'); + $table->string('option_name', 255); - $table->string('option_description', 255) - ->comment('Longer description of the option.'); + $table->string('option_description', 255); - $table->string('option_type', 255) - ->comment('Type attribute in the input element.'); + $table->string('option_type', 255); - $table->string('option_permission', 255) - ->comment('The minimum permission level this option requires.'); + $table->string('option_permission', 255); }); - Schema::create('permissions', function (Blueprint $table) { - $table->bigInteger('rank_id', 255) + $schema->create('permissions', function (Blueprint $table) { + $table->integer('rank_id') ->unsigned() - ->default(0) - ->comment('ID of the rank this permissions set is used for.'); + ->default(0); - $table->bigInteger('user_id', 255) + $table->integer('user_id') ->unsigned() - ->default(0) - ->comment('ID of the user this permissions set is used for.'); + ->default(0); $table->string('permissions_site', 255) - ->default(0) - ->comment('Site permissions.'); + ->default(0); $table->string('permissions_manage', 255) - ->default(0) - ->comment('Site management permissions'); + ->default(0); }); - Schema::create('posts', function (Blueprint $table) { - $table->bigIncrements('post_id', 255) + $schema->create('posts', function (Blueprint $table) { + $table->increments('post_id'); + + $table->integer('topic_id') ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + ->default(0); - $table->bigInteger('topic_id', 255) + $table->integer('forum_id') ->unsigned() - ->default(0) - ->comment('ID of topic this post is a part of.'); + ->default(0); - $table->bigInteger('forum_id', 255) + $table->integer('poster_id') ->unsigned() - ->default(0) - ->comment('ID of forum this was posted in.'); + ->default(0); - $table->bigInteger('poster_id', 255) + $table->string('poster_ip', 40); + + $table->integer('post_time') ->unsigned() - ->default(0) - ->comment('ID of poster of this post.'); + ->default(0); - $table->string('poster_ip', 40) - ->comment('IP of poster.'); + $table->string('post_subject', 255); - $table->integer('post_time', 11) + $table->text('post_text'); + + $table->integer('post_edit_time') ->unsigned() - ->default(0) - ->comment('Time this post was made.'); + ->default(0); - $table->string('post_subject', 255) - ->comment('Subject of the post.'); + $table->string('post_edit_reason', 255); - $table->text('post_text') - ->comment('Contents of the post.'); - - $table->integer('post_edit_time', 11) + $table->integer('post_edit_user') ->unsigned() - ->default(0) - ->comment('Time this post was last edited.'); - - $table->string('post_edit_reason', 255) - ->comment('Reason this was edited.'); - - // yup, integer, despite being bigint every else >.> - $table->integer('post_edit_user', 255) - ->unsigned() - ->default(0) - ->comment('ID of user that edited.'); + ->default(0); }); - Schema::create('premium', function (Blueprint $table) { - $table->bigInteger('user_id', 255) + $schema->create('premium', function (Blueprint $table) { + $table->integer('user_id') ->unsigned() - ->unique() - ->comment('ID of the user that purchased Tenshi.'); + ->unique(); - $table->integer('premium_start', 11) - ->unsigned() - ->comment('Timestamp of first purchase.'); + $table->integer('premium_start') + ->unsigned(); - $table->integer('premium_expire', 11) - ->unsigned() - ->comment('Expiration timestamp.'); + $table->integer('premium_expire') + ->unsigned(); }); - Schema::create('premium_log', function (Blueprint $table) { - $table->increments('transaction_id', 16) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + $schema->create('profilefields', function (Blueprint $table) { + $table->increments('field_id') + ->unsigned(); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID of purchaser'); + $table->string('field_name', 255); - $table->float('transaction_amount') - ->comment('Amount that was transferred.'); + $table->string('field_type', 255); - $table->integer('transaction_date', 11) - ->unsigned() - ->comment('Date when the purchase was made.'); + $table->tinyInteger('field_link') + ->unsigned(); - $table->string('transaction_comment', 255) - ->comment('A short description of the action taken.'); + $table->string('field_linkformat', 255); + + $table->string('field_description', 255); + + $table->string('field_additional', 255); }); - Schema::create('profilefields', function (Blueprint $table) { - $table->increments('field_id', 64) - ->unsigned() - ->comment('ID used for ordering on the userpage.'); + $schema->create('ranks', function (Blueprint $table) { + $table->increments('rank_id'); - $table->string('field_name', 255) - ->comment('Name of the field.'); + $table->integer('rank_hierarchy') + ->unsigned(); - $table->string('field_type', 255) - ->comment('Type attribute in the input element.'); - - $table->tinyInteger('field_link', 1) - ->unsigned() - ->comment('Set if this value should be put in a href.'); - - $table->string('field_linkformat', 255) - ->comment('If the form is a link how should it be formatted? {{ VAL }} gets replace with the value.'); - - $table->string('field_description', 255) - ->comment('Description of the field displayed in the control panel.'); - - $table->string('field_additional', 255) - ->comment('Undocumented JSON array containing special options if needed (probably only going to be used for the YouTube field).'); - }); - - Schema::create('ranks', function (Blueprint $table) { - $table->bigIncrements('rank_id', 128) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->integer('rank_hierarchy', 11) - ->unsigned() - ->comment('Rank hierarchy.'); - - $table->string('rank_name', 255) - ->comment('Display name of the rank.'); + $table->string('rank_name', 255); $table->string('rank_multiple', 10) ->nullable() - ->default(null) - ->comment('Used when addressing this rank as a multiple'); + ->default(null); - $table->tinyInteger('rank_hidden', 1) + $table->tinyInteger('rank_hidden') ->unsigned() - ->default(0) - ->comment("Don't show any public links to this rank."); + ->default(0); - $table->string('rank_colour', 255) - ->comment('Colour used for the username of a member of this rank.'); + $table->string('rank_colour', 255); - $table->text('rank_description') - ->comment('A description of what a user of this rank can do/is supposed to do.'); + $table->text('rank_description'); - $table->string('rank_title', 64) - ->comment('Default user title if user has none set.'); + $table->string('rank_title', 64); }); - Schema::create('reports', function (Blueprint $table) { - $table->bigIncrements('id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); + $schema->create('sessions', function (Blueprint $table) { + $table->increments('session_id'); - $table->integer('type', 32) - ->unsigned() - ->comment('Report type, entirely handled on the script side.'); + $table->integer('user_id') + ->unsigned(); - $table->bigInteger('issuer', 255) - ->unsigned() - ->comment('ID of the person who issued this report.'); - - // what the fuck - $table->bigInteger('subject', 255) - ->unsigned() - ->comment("ID pointing out what was reported (a more accurate description isn't possible due to the type column)."); - - $table->string('title', 255) - ->comment('A quick description of this report.'); - - $table->text('description') - ->comment('And a detailed description.'); - - $table->bigInteger('reviewed', 255) - ->unsigned() - ->default(0) - ->comment('ID of the moderator that reviewed this report.'); - }); - - Schema::create('sessions', function (Blueprint $table) { - $table->bigIncrements('session_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management. '); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user this session is spawned for. '); - - $table->string('user_ip', 255) - ->comment('IP of the user this session is spawned for.'); + $table->string('user_ip', 255); $table->string('user_agent', 255) ->nullable() - ->default(null) - ->comment('User agent of the user this session is spawned for.'); + ->default(null); - $table->string('session_key', 255) - ->comment("Session key, allow direct access to the user's account. "); + $table->string('session_key', 255); - $table->integer('session_start', 16) + $table->integer('session_start') + ->unsigned(); + + $table->integer('session_expire') + ->unsigned(); + + $table->tinyInteger('session_remember') ->unsigned() - ->comment('The timestamp for when the session was started. '); - - $table->integer('session_expire', 16) - ->unsigned() - ->comment('The timestamp for when this session should end, -1 for permanent. '); - - $table->tinyInteger('session_remember', 1) - ->unsigned() - ->default(0) - ->comment('If set to 1 session will be extended each time a page is loaded.'); + ->default(0); }); - Schema::create('topics', function (Blueprint $table) { - $table->bigIncrements('topic_id', 255) - ->unsigned() - ->comment('ID of forum this topic was created in.'); + $schema->create('topics', function (Blueprint $table) { + $table->increments('topic_id'); - $table->bigInteger('forum_id', 255) + $table->integer('forum_id') ->unsigned() - ->default(0) - ->comment('ID of forum this topic was created in.'); + ->default(0); - $table->tinyInteger('topic_hidden', 1) + $table->tinyInteger('topic_hidden') ->unsigned() - ->default(0) - ->comment('Boolean to set the topic as hidden.'); + ->default(0); - $table->string('topic_title', 255) - ->comment('Title of the topic.'); + $table->string('topic_title', 255); - $table->integer('topic_time', 11) + $table->integer('topic_time') ->unsigned() - ->default(0) - ->comment('Timestamp when the topic was created.'); + ->default(0); - $table->integer('topic_time_limit', 11) + $table->integer('topic_time_limit') ->unsigned() - ->default(0) - ->comment('After how long a topic should be locked.'); + ->default(0); - $table->bigInteger('topic_views', 255) + $table->integer('topic_views') ->unsigned() - ->default(0) - ->comment('Amount of times the topic has been viewed.'); + ->default(0); - $table->tinyInteger('topic_status', 3) + $table->tinyInteger('topic_status') ->unsigned() - ->default(0) - ->comment('Status of topic.'); + ->default(0); - $table->integer('topic_status_change', 11) + $table->integer('topic_status_change') ->unsigned() - ->default(0) - ->comment('Date the topic status was changed (used for deletion cooldown as well).'); + ->default(0); - $table->tinyInteger('topic_type', 3) + $table->tinyInteger('topic_type') ->unsigned() - ->default(0) - ->comment('Type of the topic.'); + ->default(0); - $table->integer('topic_last_reply', 11) + $table->integer('topic_last_reply') ->unsigned() - ->default(0) - ->comment('Timestamp of when the last reply made to this thread.'); + ->default(0); - $table->bigInteger('topic_old_forum', 255) + $table->integer('topic_old_forum') ->unsigned() - ->default(0) - ->comment('Pre-move forum id.'); + ->default(0); }); - Schema::create('topics_track', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user this row applies to.'); + $schema->create('topics_track', function (Blueprint $table) { + $table->integer('user_id') + ->unsigned(); - $table->bigInteger('topic_id', 255) - ->unsigned() - ->comment('ID of the thread in question.'); + $table->integer('topic_id') + ->unsigned(); - $table->bigInteger('forum_id', 255) - ->unsigned() - ->comment('ID of the forum in question.'); + $table->integer('forum_id') + ->unsigned(); - $table->integer('mark_time', 11) + $table->integer('mark_time') ->unsigned() - ->default(0) - ->comment('Timestamp of the event.'); + ->default(0); }); - Schema::create('uploads', function (Blueprint $table) { - $table->bigIncrements('file_id', 255) - ->unsigned() - ->comment('Automatically generated value for management'); + $schema->create('uploads', function (Blueprint $table) { + $table->increments('file_id'); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that uploaded the file'); + $table->integer('user_id') + ->unsigned(); // this one's actually longblob - $table->binary('file_data') - ->comment('Contents of the file'); + $table->binary('file_data'); - $table->string('file_name', 255) - ->comment('Name of the file'); + $table->string('file_name', 255); - $table->string('file_mime', 255) - ->comment('Static mime type of the file'); + $table->string('file_mime', 255); - $table->integer('file_time', 11) - ->unsigned() - ->comment('Timestamp of when the file was uploaded'); + $table->integer('file_time') + ->unsigned(); - $table->integer('file_expire', 11) - ->unsigned() - ->comment('When should the file be removed, 0 for never'); + $table->integer('file_expire') + ->unsigned(); }); - Schema::create('user_optionfields', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User this field applies to'); + $schema->create('user_optionfields', function (Blueprint $table) { + $table->integer('user_id') + ->unsigned(); + + $table->string('field_name', 255); + + $table->string('field_value', 255); + }); + + $schema->create('user_profilefields', function (Blueprint $table) { + $table->integer('user_id') + ->unsigned(); $table->string('field_name', 255) ->comment('Identifier of the field'); @@ -718,181 +446,93 @@ class BaseTables extends Migration ->comment('Value of the field'); }); - Schema::create('user_profilefields', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User this field applies to'); - - $table->string('field_name', 255) - ->comment('Identifier of the field'); - - $table->string('field_value', 255) - ->comment('Value of the field'); - }); - - Schema::create('user_ranks', function (Blueprint $table) { - $table->bigInteger('user_id', 255) + $schema->create('user_ranks', function (Blueprint $table) { + $table->integer('user_id') ->unsigned(); - $table->bigInteger('rank_id', 128) + $table->integer('rank_id') ->unsigned(); }); - Schema::create('username_history', function (Blueprint $table) { - $table->increments('change_id', 11) - ->unsigned() - ->comment('Identifier'); + $schema->create('username_history', function (Blueprint $table) { + $table->increments('change_id'); - $table->integer('change_time', 11) - ->unsigned() - ->comment('Timestamp of change'); + $table->integer('change_time') + ->unsigned(); - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID'); + $table->integer('user_id') + ->unsigned(); - $table->string('username_new', 255) - ->comment('New username'); + $table->string('username_new', 255); - $table->string('username_new_clean', 255) - ->comment('Clean new username'); + $table->string('username_new_clean', 255); - $table->string('username_old', 255) - ->comment('Old username'); + $table->string('username_old', 255); - $table->string('username_old_clean', 255) - ->comment('Clean old username'); + $table->string('username_old_clean', 255); }); - Schema::create('users', function (Blueprint $table) { - $table->bigIncrements('user_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management. '); + $schema->create('users', function (Blueprint $table) { + $table->increments('user_id'); - $table->string('username', 255) - ->comment('Username set at registration.'); + $table->string('username', 255); $table->string('username_clean', 255) - ->unique() - ->comment('A more cleaned up version of the username for backend usage.'); + ->unique(); - $table->string('password_hash', 255) - ->comment('Hashing algo used for the password hash.'); + $table->string('password', 60) + ->nullable() + ->default(null); - $table->string('password_salt', 255) - ->comment('Salt used for the password hash.'); + $table->string('email', 255); - $table->string('password_algo', 255) - ->comment('Algorithm used for the password hash.'); - - $table->integer('password_iter', 11) + $table->mediumInteger('rank_main') ->unsigned() - ->comment('Password hash iterations.'); - - $table->integer('password_chan', 11) - ->unsigned() - ->default(0) - ->comment('Last time the user changed their password.'); - - $table->string('email', 255) - ->comment('E-mail of the user for password restoring etc.'); - - $table->mediumInteger('rank_main', 4) - ->unsigned() - ->default(0) - ->comment('Main rank of the user.'); + ->default(0); $table->string('user_colour', 255) ->nullable() - ->default(null) - ->comment('Additional name colour, when empty colour defaults to group colour.'); + ->default(null); - $table->string('register_ip', 255) - ->comment('IP used for the creation of this account.'); + $table->string('register_ip', 255); - $table->string('last_ip', 255) - ->comment('Last IP that was used to log into this account.'); + $table->string('last_ip', 255); $table->string('user_title', 64) ->nullable() - ->default(null) - ->comment('Custom user title of the user, when empty reverts to their derault group name.'); + ->default(null); - $table->integer('user_register', 11) + $table->integer('user_registered') ->unsigned() - ->default(0) - ->comment('Timestamp of account creation.'); + ->default(0); - $table->integer('user_last_online', 11) + $table->integer('user_last_online') ->unsigned() - ->default(0) - ->comment('Last time anything was done on this account.'); + ->default(0); $table->date('user_birthday') - ->default('0000-00-00') - ->comment('Birthdate of the user.'); + ->default('0000-00-00'); $table->char('user_country', 2) - ->default('XX') - ->comment("Contains ISO 3166 country code of user's registration location."); + ->default('XX'); - $table->bigInteger('user_avatar', 255) + $table->integer('user_avatar') ->unsigned() - ->default(0) - ->comment('ID of the avatar in the uploads table.'); + ->default(0); - $table->bigInteger('user_background', 255) + $table->integer('user_background') ->unsigned() - ->default(0) - ->comment('ID of the background in the uploads table.'); + ->default(0); - $table->bigInteger('user_header', 255) + $table->integer('user_header') ->unsigned() - ->default(0) - ->comment('ID of the profile header in the uploads table.'); + ->default(0); $table->longText('user_page') - ->comment('Contents of the userpage.'); + ->nullable(); $table->text('user_signature') - ->comment('Signature displayed below forum posts.'); - - $table->string('password', 255) - ->nullable() - ->default(null); - }); - - Schema::create('warnings', function (Blueprint $table) { - $table->bigIncrements('warning_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user that was warned.'); - - $table->bigInteger('moderator_id', 255) - ->unsigned() - ->comment('ID of the user that issued the warning.'); - - $table->integer('warning_issued', 16) - ->unsigned() - ->comment('Timestamp of the date the warning was issued.'); - - $table->integer('warning_expires', 16) - ->unsigned() - ->comment('Timstamp when the warning should expire, 0 for a permanent warning.'); - - $table->tinyInteger('warning_action', 1) - ->unsigned() - ->nullable() - ->default(null) - ->comment('Action taken.'); - - $table->string('warning_reason', 512) - ->nullable() - ->default(null) - ->comment('Reason for the warning.'); + ->nullable(); }); } @@ -903,39 +543,34 @@ class BaseTables extends Migration */ public function down() { - Schema::drop('actioncodes'); - Schema::drop('apikeys'); - Schema::drop('bans'); - Schema::drop('comment_votes'); - Schema::drop('comments'); - Schema::drop('config'); - Schema::drop('emoticons'); - Schema::drop('faq'); - Schema::drop('forum_permissions'); - Schema::drop('forums'); - Schema::drop('friends'); - Schema::drop('infopages'); - Schema::drop('login_attempts'); - Schema::drop('messages'); - Schema::drop('news'); - Schema::drop('notifications'); - Schema::drop('optionfields'); - Schema::drop('permissions'); - Schema::drop('posts'); - Schema::drop('premium'); - Schema::drop('premium_log'); - Schema::drop('profilefields'); - Schema::drop('ranks'); - Schema::drop('reports'); - Schema::drop('sessions'); - Schema::drop('topics'); - Schema::drop('topics_track'); - Schema::drop('uploads'); - Schema::drop('user_optionfields'); - Schema::drop('user_profilefields'); - Schema::drop('user_ranks'); - Schema::drop('username_history'); - Schema::drop('users'); - Schema::drop('warnings'); + $schema = DB::getSchemaBuilder(); + + $schema->drop('actioncodes'); + $schema->drop('comment_votes'); + $schema->drop('comments'); + $schema->drop('emoticons'); + $schema->drop('faq'); + $schema->drop('forum_permissions'); + $schema->drop('forums'); + $schema->drop('friends'); + $schema->drop('login_attempts'); + $schema->drop('messages'); + $schema->drop('news'); + $schema->drop('notifications'); + $schema->drop('optionfields'); + $schema->drop('permissions'); + $schema->drop('posts'); + $schema->drop('premium'); + $schema->drop('profilefields'); + $schema->drop('ranks'); + $schema->drop('sessions'); + $schema->drop('topics'); + $schema->drop('topics_track'); + $schema->drop('uploads'); + $schema->drop('user_optionfields'); + $schema->drop('user_profilefields'); + $schema->drop('user_ranks'); + $schema->drop('username_history'); + $schema->drop('users'); } } diff --git a/database/2016_07_26_233506_taking_out_the_trash.php b/database/2016_07_26_233506_taking_out_the_trash.php deleted file mode 100644 index c488c90..0000000 --- a/database/2016_07_26_233506_taking_out_the_trash.php +++ /dev/null @@ -1,1934 +0,0 @@ -integer('vote_comment', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('vote_user', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->tinyInteger('vote_state', 1) - ->unsigned() - ->comment(null) - ->change(); - }); - - Schema::table('comments', function (Blueprint $table) { - $table->increments('comment_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('comment_category', 32) - ->comment(null) - ->change(); - - $table->integer('comment_timestamp', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('comment_poster', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('comment_reply_to', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->text('comment_text', 500) - ->comment(null) - ->change(); - }); - - Schema::table('emoticons', function (Blueprint $table) { - $table->string('emote_string', 50) - ->comment(null) - ->change(); - - $table->string('emote_path', 255) - ->comment(null) - ->change(); - }); - - Schema::table('error_log', function (Blueprint $table) { - $table->string('error_id', 32) - ->comment(null) - ->change(); - - $table->string('error_timestamp', 128) - ->comment(null) - ->change(); - - $table->integer('error_revision', 16) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('error_type', 16) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('error_line', 32) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('error_string', 512) - ->comment(null) - ->change(); - - $table->string('error_file', 512) - ->comment(null) - ->change(); - - $table->text('error_backtrace') - ->comment(null) - ->change(); - }); - - Schema::table('faq', function (Blueprint $table) { - $table->increments('faq_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('faq_shorthand', 40) - ->comment(null) - ->change(); - - $table->string('faq_question', 255) - ->comment(null) - ->change(); - - $table->text('faq_answer') - ->comment(null) - ->change(); - }); - - Schema::table('forum_permissions', function (Blueprint $table) { - $table->integer('forum_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('rank_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('forum_perms', 255) - ->comment(null) - ->change(); - }); - - Schema::table('forums', function (Blueprint $table) { - $table->increments('forum_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('forum_order', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('forum_name', 255) - ->comment(null) - ->change(); - - $table->text('forum_desc') - ->comment(null) - ->change(); - - $table->string('forum_link', 255) - ->comment(null) - ->change(); - - $table->integer('forum_category', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('forum_type', 4) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('forum_icon', 255) - ->comment(null) - ->change(); - }); - - Schema::table('friends', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('friend_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('friend_timestamp', 11) - ->unsigned() - ->comment(null) - ->change(); - }); - - Schema::table('login_attempts', function (Blueprint $table) { - $table->increments('attempt_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->tinyInteger('attempt_success', 1) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('attempt_timestamp', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('attempt_ip', 255) - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - }); - - Schema::table('news', function (Blueprint $table) { - $table->increments('news_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('news_category', 255) - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('news_timestamp', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('news_title', 255) - ->comment(null) - ->change(); - - $table->text('news_content') - ->comment(null) - ->change(); - }); - - Schema::table('notifications', function (Blueprint $table) { - $table->increments('alert_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('alert_timestamp', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('alert_read', 1) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('alert_sound', 1) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('alert_title', 255) - ->comment(null) - ->change(); - - $table->string('alert_text', 255) - ->comment(null) - ->change(); - - $table->string('alert_link', 255) - ->comment(null) - ->change(); - - $table->string('alert_img', 255) - ->comment(null) - ->change(); - - $table->integer('alert_timeout', 16) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('optionfields', function (Blueprint $table) { - $table->string('option_id', 50) - ->unique() - ->comment(null) - ->change(); - - $table->string('option_name', 255) - ->comment(null) - ->change(); - - $table->string('option_description', 255) - ->comment(null) - ->change(); - - $table->string('option_type', 40) - ->comment(null) - ->change(); - - $table->string('option_permission', 40) - ->comment(null) - ->change(); - }); - - Schema::table('permissions', function (Blueprint $table) { - $table->integer('rank_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('permissions_site', 255) - ->default(0) - ->comment(null) - ->change(); - - $table->string('permissions_manage', 255) - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('posts', function (Blueprint $table) { - $table->increments('post_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('topic_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('forum_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('poster_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->binary('poster_ip') - ->comment(null) - ->change(); - - $table->integer('post_time', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('post_subject', 255) - ->comment(null) - ->change(); - - $table->text('post_text') - ->comment(null) - ->change(); - - $table->integer('post_edit_time', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('post_edit_reason', 255) - ->comment(null) - ->change(); - - $table->integer('post_edit_user', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('premium', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->unique() - ->comment(null) - ->change(); - - $table->integer('premium_start', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('premium_expire', 11) - ->unsigned() - ->comment(null) - ->change(); - }); - - Schema::table('profilefields', function (Blueprint $table) { - $table->increments('field_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('field_name', 255) - ->comment(null) - ->change(); - - $table->string('field_type', 40) - ->comment(null) - ->change(); - - $table->tinyInteger('field_link', 1) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('field_linkformat', 255) - ->comment(null) - ->change(); - - $table->string('field_description', 255) - ->comment(null) - ->change(); - - $table->string('field_additional', 255) - ->comment(null) - ->change(); - }); - - Schema::table('ranks', function (Blueprint $table) { - $table->increments('rank_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('rank_hierarchy', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('rank_name', 100) - ->comment(null) - ->change(); - - $table->string('rank_multiple', 10) - ->nullable() - ->default(null) - ->comment(null) - ->change(); - - $table->tinyInteger('rank_hidden', 1) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('rank_colour', 255) - ->comment(null) - ->change(); - - $table->text('rank_description') - ->nullable() - ->default(null) - ->comment(null) - ->change(); - - $table->string('rank_title', 64) - ->nullable() - ->default(null) - ->comment(null) - ->change(); - }); - - Schema::table('sessions', function (Blueprint $table) { - $table->increments('session_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->binary('user_ip') - ->comment(null) - ->change(); - - $table->string('user_agent', 255) - ->nullable() - ->default(null) - ->comment(null) - ->change(); - - $table->string('session_key', 255) - ->comment(null) - ->change(); - - $table->integer('session_start', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('session_expire', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->tinyInteger('session_remember', 1) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('topics', function (Blueprint $table) { - $table->increments('topic_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('forum_id', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('topic_hidden', 1) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('topic_title', 255) - ->comment(null) - ->change(); - - $table->integer('topic_time', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('topic_time_limit', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('topic_views', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('topic_status', 3) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('topic_status_change', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->tinyInteger('topic_type', 3) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('topic_last_reply', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('topic_old_forum', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('topics_track', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('topic_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('forum_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('mark_time', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - }); - - Schema::table('uploads', function (Blueprint $table) { - $table->increments('file_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->binary('file_data') - ->comment(null) - ->change(); - - $table->string('file_name', 255) - ->comment(null) - ->change(); - - $table->string('file_mime', 255) - ->comment(null) - ->change(); - - $table->integer('file_time', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('file_expire', 11) - ->unsigned() - ->comment(null) - ->change(); - }); - - Schema::table('user_optionfields', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('field_name', 255) - ->comment(null) - ->change(); - - $table->string('field_value', 255) - ->comment(null) - ->change(); - }); - - Schema::table('user_profilefields', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('field_name', 255) - ->comment(null) - ->change(); - - $table->string('field_value', 255) - ->comment(null) - ->change(); - }); - - Schema::create('user_ranks', function (Blueprint $table) { - $table->integer('user_id', 11) - ->unsigned() - ->change(); - - $table->integer('rank_id', 11) - ->unsigned() - ->change(); - }); - - Schema::table('username_history', function (Blueprint $table) { - $table->increments('change_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('change_time', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->integer('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('username_new', 255) - ->comment(null) - ->change(); - - $table->string('username_new_clean', 255) - ->comment(null) - ->change(); - - $table->string('username_old', 255) - ->comment(null) - ->change(); - - $table->string('username_old_clean', 255) - ->comment(null) - ->change(); - }); - - Schema::table('users', function (Blueprint $table) { - $table->increments('user_id', 11) - ->unsigned() - ->comment(null) - ->change(); - - $table->string('username', 255) - ->comment(null) - ->change(); - - $table->string('username_clean', 255) - ->unique() - ->comment(null) - ->change(); - - $table->dropColumn('password_hash'); - $table->dropColumn('password_salt'); - $table->dropColumn('password_algo'); - $table->dropColumn('password_iter'); - - $table->integer('password_chan', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('email', 255) - ->comment(null) - ->change(); - - $table->mediumInteger('rank_main', 4) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->string('user_colour', 255) - ->nullable() - ->default(null) - ->comment(null) - ->change(); - - $table->binary('register_ip') - ->comment(null) - ->change(); - - $table->binary('last_ip') - ->comment(null) - ->change(); - - $table->string('user_title', 64) - ->nullable() - ->default(null) - ->comment(null) - ->change(); - - $table->integer('user_register', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('user_last_online', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->date('user_birthday') - ->default('0000-00-00') - ->comment(null) - ->change(); - - $table->char('user_country', 2) - ->default('XX') - ->comment(null) - ->change(); - - $table->integer('user_avatar', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('user_background', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->integer('user_header', 11) - ->unsigned() - ->default(0) - ->comment(null) - ->change(); - - $table->longText('user_page') - ->comment(null) - ->change(); - - $table->text('user_signature') - ->comment(null) - ->change(); - - $table->string('password', 60) - ->nullable() - ->default(null) - ->change(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // undo trashing - Schema::create('actioncodes', function (Blueprint $table) { - $table->string('code_action', 255) - ->comment('Action identifier so the backend knows what to do.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that would be affected by this action'); - - $table->string('action_code', 255) - ->comment('The URL key for using this code.'); - }); - - Schema::create('apikeys', function (Blueprint $table) { - $table->bigIncrements('id', 128) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('owner', 128) - ->unsigned() - ->comment('ID of user that owns this API key.'); - - $table->string('apikey', 32) - ->comment('The API key.'); - }); - - Schema::create('bans', function (Blueprint $table) { - $table->bigIncrements('ban_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user that was banned, 0 for just an IP ban.'); - - $table->integer('ban_begin', 11) - ->unsigned() - ->comment('Timestamp when the user was banned.'); - - $table->integer('ban_end', 11) - ->unsigned() - ->comment('Timestamp when the user should regain access to the site.'); - - $table->string('ban_reason', 512) - ->nullable() - ->default(null) - ->comment('Reason given for the ban.'); - - $table->bigInteger('ban_moderator', 255) - ->unsigned() - ->comment('ID of moderator that banned this user,'); - }); - - Schema::create('config', function (Blueprint $table) { - $table->string('config_name', 255) - ->unique() - ->comment('Array key for configuration value'); - - $table->string('config_value', 255) - ->comment('The value, obviously.'); - }); - - Schema::create('infopages', function (Blueprint $table) { - $table->string('page_shorthand', 255) - ->comment('Name used for calling this page up in the /r/URL'); - - $table->string('page_title', 255) - ->comment('Title displayed on the top of the page'); - - $table->text('page_content') - ->comment('Content of the page'); - }); - - Schema::create('messages', function (Blueprint $table) { - $table->bigIncrements('id', 128) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('from_user', 255) - ->unsigned() - ->comment('ID of the user that sent this message.'); - - $table->bigInteger('to_user', 255) - ->unsigned() - ->comment('ID of user that should receive this message.'); - - $table->string('read', 255) - ->comment('IDs of users who read this message.'); - - $table->string('deleted', 255) - ->comment('Indicator if one of the parties deleted the message, if it is already 1 the script will remove this row.'); - - $table->integer('timestamp', 11) - ->unsigned() - ->comment('Timestamp of the time this message was sent'); - - $table->string('subject', 255) - ->comment('Title of the message'); - - $table->text('content') - ->comment('Contents of the message.'); - }); - - Schema::create('premium_log', function (Blueprint $table) { - $table->increments('transaction_id', 16) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID of purchaser'); - - $table->float('transaction_amount') - ->comment('Amount that was transferred.'); - - $table->integer('transaction_date', 11) - ->unsigned() - ->comment('Date when the purchase was made.'); - - $table->string('transaction_comment', 255) - ->comment('A short description of the action taken.'); - }); - - Schema::create('reports', function (Blueprint $table) { - $table->bigIncrements('id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.'); - - $table->integer('type', 32) - ->unsigned() - ->comment('Report type, entirely handled on the script side.'); - - $table->bigInteger('issuer', 255) - ->unsigned() - ->comment('ID of the person who issued this report.'); - - // what the fuck - $table->bigInteger('subject', 255) - ->unsigned() - ->comment("ID pointing out what was reported (a more accurate description isn't possible due to the type column)."); - - $table->string('title', 255) - ->comment('A quick description of this report.'); - - $table->text('description') - ->comment('And a detailed description.'); - - $table->bigInteger('reviewed', 255) - ->unsigned() - ->default(0) - ->comment('ID of the moderator that reviewed this report.'); - }); - - Schema::create('warnings', function (Blueprint $table) { - $table->bigIncrements('warning_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.'); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user that was warned.'); - - $table->bigInteger('moderator_id', 255) - ->unsigned() - ->comment('ID of the user that issued the warning.'); - - $table->integer('warning_issued', 16) - ->unsigned() - ->comment('Timestamp of the date the warning was issued.'); - - $table->integer('warning_expires', 16) - ->unsigned() - ->comment('Timstamp when the warning should expire, 0 for a permanent warning.'); - - $table->tinyInteger('warning_action', 1) - ->unsigned() - ->nullable() - ->default(null) - ->comment('Action taken.'); - - $table->string('warning_reason', 512) - ->nullable() - ->default(null) - ->comment('Reason for the warning.'); - }); - - // readd comments and undo fixes - Schema::table('comment_votes', function (Blueprint $table) { - $table->bigInteger('vote_comment', 255) - ->unsigned() - ->comment('ID of the comment that was voted on.') - ->change(); - - $table->bigInteger('vote_user', 255) - ->unsigned() - ->comment('ID of the voter.') - ->change(); - - $table->tinyInteger('vote_state', 1) - ->unsigned() - ->comment('0 = dislike, 1 = like.') - ->change(); - }); - - Schema::table('comments', function (Blueprint $table) { - $table->bigIncrements('comment_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.') - ->change(); - - $table->string('comment_category', 32) - ->comment('Comment category.') - ->change(); - - $table->integer('comment_timestamp', 11) - ->unsigned() - ->comment('Timestamp of when this comment was posted.') - ->change(); - - $table->bigInteger('comment_poster', 255) - ->unsigned() - ->comment('User ID of the poster.') - ->change(); - - $table->bigInteger('comment_reply_to', 255) - ->unsigned() - ->default(0) - ->comment('ID of the comment this comment is a reply to') - ->change(); - - $table->text('comment_text', 255) - ->comment('Content of the comment.') - ->change(); - }); - - Schema::table('emoticons', function (Blueprint $table) { - $table->string('emote_string', 255) - ->comment('String to catch and replace') - ->change(); - - $table->string('emote_path', 255) - ->comment('Path to the image file relative to the content domain.') - ->change(); - }); - - Schema::table('error_log', function (Blueprint $table) { - $table->string('error_id', 32) - ->comment('An ID that is created when an error occurs.') - ->change(); - - $table->string('error_timestamp', 128) - ->comment('A datestring from when the error occurred.') - ->change(); - - $table->integer('error_revision', 16) - ->unsigned() - ->comment('Sakura Revision number.') - ->change(); - - $table->integer('error_type', 16) - ->unsigned() - ->comment('The PHP error type of this error.') - ->change(); - - $table->integer('error_line', 32) - ->unsigned() - ->comment('The line that caused this error.') - ->change(); - - $table->string('error_string', 512) - ->comment("PHP's description of this error.") - ->change(); - - $table->string('error_file', 512) - ->comment('The file in which this error occurred.') - ->change(); - - $table->text('error_backtrace') - ->comment('A full base64 and json encoded backtrace containing all environment data.') - ->change(); - }); - - Schema::table('faq', function (Blueprint $table) { - $table->bigIncrements('faq_id', 128) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.') - ->change(); - - $table->string('faq_shorthand', 255) - ->comment('Used for linking directly to a question.') - ->change(); - - $table->string('faq_question', 255) - ->comment('The question.') - ->change(); - - $table->text('faq_answer') - ->comment('The answer.') - ->change(); - }); - - Schema::table('forum_permissions', function (Blueprint $table) { - $table->bigInteger('forum_id', 255) - ->unsigned() - ->comment('Forum ID') - ->change(); - - $table->bigInteger('rank_id', 128) - ->unsigned() - ->comment('Rank ID, leave 0 for a user') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID, leave 0 for a rank') - ->change(); - - $table->string('forum_perms', 255) - ->comment('Forum action permission string') - ->change(); - }); - - Schema::table('forums', function (Blueprint $table) { - $table->bigIncrements('forum_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.') - ->change(); - - $table->bigInteger('forum_order', 255) - ->unsigned() - ->comment('Forum sorting order.') - ->change(); - - $table->string('forum_name', 255) - ->comment('Display name of the forum.') - ->change(); - - $table->text('forum_desc') - ->comment('Description of the forum.') - ->change(); - - $table->string('forum_link', 255) - ->comment('If set forum will display as a link.') - ->change(); - - $table->bigInteger('forum_category', 255) - ->unsigned() - ->default(0) - ->comment('ID of the category this forum falls under.') - ->change(); - - $table->tinyInteger('forum_type', 4) - ->unsigned() - ->default(0) - ->comment('Forum type, 0 for regular board, 1 for category and 2 for link.') - ->change(); - - $table->string('forum_icon', 255) - ->comment('Display icon for the forum.') - ->change(); - }); - - Schema::table('friends', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that added the friend.') - ->change(); - - $table->bigInteger('friend_id', 255) - ->unsigned() - ->comment('ID of the user that was added as a friend.') - ->change(); - - $table->integer('friend_timestamp', 11) - ->unsigned() - ->comment('Timestamp of action.') - ->change(); - }); - - Schema::table('login_attempts', function (Blueprint $table) { - $table->bigIncrements('attempt_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.') - ->change(); - - $table->tinyInteger('attempt_success', 1) - ->unsigned() - ->comment('Success boolean.') - ->change(); - - $table->integer('attempt_timestamp', 11) - ->unsigned() - ->comment('Unix timestamp of the event.') - ->change(); - - $table->string('attempt_ip', 255) - ->comment('IP that made this attempt.') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that was attempted to log in to.') - ->change(); - }); - - Schema::table('news', function (Blueprint $table) { - $table->bigIncrements('news_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.') - ->change(); - - $table->string('news_category', 255) - ->comment('Category ID.') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of user who posted this news message.') - ->change(); - - $table->integer('news_timestamp', 11) - ->unsigned() - ->comment('News post timestamp.') - ->change(); - - $table->string('news_title', 255) - ->comment('Title of the post.') - ->change(); - - $table->text('news_content') - ->comment('Contents of the post') - ->change(); - }); - - Schema::table('notifications', function (Blueprint $table) { - $table->bigIncrements('alert_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->default(0) - ->comment('User ID this notification is intended for.') - ->change(); - - $table->integer('alert_timestamp', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp when this notification was created.') - ->change(); - - $table->tinyInteger('alert_read', 1) - ->unsigned() - ->default(0) - ->comment('Toggle for unread and read.') - ->change(); - - $table->tinyInteger('alert_sound', 1) - ->unsigned() - ->default(0) - ->comment('Toggle if a sound should be played upon receiving the notification.') - ->change(); - - $table->string('alert_title', 255) - ->comment('Title displayed on the notification.') - ->change(); - - $table->string('alert_text', 255) - ->comment('Text displayed.') - ->change(); - - $table->string('alert_link', 255) - ->comment('Link (empty for no link).') - ->change(); - - $table->string('alert_img', 255) - ->comment('Image path, prefix with font: to use a font class instead of an image.') - ->change(); - - $table->integer('alert_timeout', 16) - ->unsigned() - ->default(0) - ->comment('How long the notification should stay on screen in milliseconds, 0 for forever.') - ->change(); - }); - - Schema::table('optionfields', function (Blueprint $table) { - $table->string('option_id', 255) - ->unique() - ->comment('Unique identifier for accessing this option.') - ->change(); - - $table->string('option_name', 255) - ->comment('Description of the field in a proper way.') - ->change(); - - $table->string('option_description', 255) - ->comment('Longer description of the option.') - ->change(); - - $table->string('option_type', 255) - ->comment('Type attribute in the input element.') - ->change(); - - $table->string('option_permission', 255) - ->comment('The minimum permission level this option requires.') - ->change(); - }); - - Schema::table('permissions', function (Blueprint $table) { - $table->bigInteger('rank_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of the rank this permissions set is used for.') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of the user this permissions set is used for.') - ->change(); - - $table->string('permissions_site', 255) - ->default(0) - ->comment('Site permissions.') - ->change(); - - $table->string('permissions_manage', 255) - ->default(0) - ->comment('Site management permissions') - ->change(); - }); - - Schema::table('posts', function (Blueprint $table) { - $table->bigIncrements('post_id', 255) - ->unsigned() - ->comment('MySQL Generated ID used for sorting.') - ->change(); - - $table->bigInteger('topic_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of topic this post is a part of.') - ->change(); - - $table->bigInteger('forum_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of forum this was posted in.') - ->change(); - - $table->bigInteger('poster_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of poster of this post.') - ->change(); - - $table->string('poster_ip', 40) - ->comment('IP of poster.') - ->change(); - - $table->integer('post_time', 11) - ->unsigned() - ->default(0) - ->comment('Time this post was made.') - ->change(); - - $table->string('post_subject', 255) - ->comment('Subject of the post.') - ->change(); - - $table->text('post_text') - ->comment('Contents of the post.') - ->change(); - - $table->integer('post_edit_time', 11) - ->unsigned() - ->default(0) - ->comment('Time this post was last edited.') - ->change(); - - $table->string('post_edit_reason', 255) - ->comment('Reason this was edited.') - ->change(); - - $table->integer('post_edit_user', 255) - ->unsigned() - ->default(0) - ->comment('ID of user that edited.') - ->change(); - }); - - Schema::table('premium', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->unique() - ->comment('ID of the user that purchased Tenshi.') - ->change(); - - $table->integer('premium_start', 11) - ->unsigned() - ->comment('Timestamp of first purchase.') - ->change(); - - $table->integer('premium_expire', 11) - ->unsigned() - ->comment('Expiration timestamp.') - ->change(); - }); - - Schema::table('profilefields', function (Blueprint $table) { - $table->increments('field_id', 64) - ->unsigned() - ->comment('ID used for ordering on the userpage.') - ->change(); - - $table->string('field_name', 255) - ->comment('Name of the field.') - ->change(); - - $table->string('field_type', 255) - ->comment('Type attribute in the input element.') - ->change(); - - $table->tinyInteger('field_link', 1) - ->unsigned() - ->comment('Set if this value should be put in a href.') - ->change(); - - $table->string('field_linkformat', 255) - ->comment('If the form is a link how should it be formatted? {{ VAL }} gets replace with the value.') - ->change(); - - $table->string('field_description', 255) - ->comment('Description of the field displayed in the control panel.') - ->change(); - - $table->string('field_additional', 255) - ->comment('Undocumented JSON array containing special options if needed (probably only going to be used for the YouTube field).') - ->change(); - }); - - Schema::table('ranks', function (Blueprint $table) { - $table->bigIncrements('rank_id', 128) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management.') - ->change(); - - $table->integer('rank_hierarchy', 11) - ->unsigned() - ->comment('Rank hierarchy.') - ->change(); - - $table->string('rank_name', 255) - ->comment('Display name of the rank.') - ->change(); - - $table->string('rank_multiple', 10) - ->nullable() - ->default(null) - ->comment('Used when addressing this rank as a multiple') - ->change(); - - $table->tinyInteger('rank_hidden', 1) - ->unsigned() - ->default(0) - ->comment("Don't show any public links to this rank.") - ->change(); - - $table->string('rank_colour', 255) - ->comment('Colour used for the username of a member of this rank.') - ->change(); - - $table->text('rank_description') - ->comment('A description of what a user of this rank can do/is supposed to do.') - ->change(); - - $table->string('rank_title', 64) - ->comment('Default user title if user has none set.') - ->change(); - }); - - Schema::table('sessions', function (Blueprint $table) { - $table->bigIncrements('session_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management. ') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user this session is spawned for. ') - ->change(); - - $table->string('user_ip', 255) - ->comment('IP of the user this session is spawned for.') - ->change(); - - $table->string('user_agent', 255) - ->nullable() - ->default(null) - ->comment('User agent of the user this session is spawned for.') - ->change(); - - $table->string('session_key', 255) - ->comment("Session key, allow direct access to the user's account. ") - ->change(); - - $table->integer('session_start', 16) - ->unsigned() - ->comment('The timestamp for when the session was started. ') - ->change(); - - $table->integer('session_expire', 16) - ->unsigned() - ->comment('The timestamp for when this session should end, -1 for permanent. ') - ->change(); - - $table->tinyInteger('session_remember', 1) - ->unsigned() - ->default(0) - ->comment('If set to 1 session will be extended each time a page is loaded.') - ->change(); - }); - - Schema::table('topics', function (Blueprint $table) { - $table->bigIncrements('topic_id', 255) - ->unsigned() - ->comment('ID of forum this topic was created in.') - ->change(); - - $table->bigInteger('forum_id', 255) - ->unsigned() - ->default(0) - ->comment('ID of forum this topic was created in.') - ->change(); - - $table->tinyInteger('topic_hidden', 1) - ->unsigned() - ->default(0) - ->comment('Boolean to set the topic as hidden.') - ->change(); - - $table->string('topic_title', 255) - ->comment('Title of the topic.') - ->change(); - - $table->integer('topic_time', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp when the topic was created.') - ->change(); - - $table->integer('topic_time_limit', 11) - ->unsigned() - ->default(0) - ->comment('After how long a topic should be locked.') - ->change(); - - $table->bigInteger('topic_views', 255) - ->unsigned() - ->default(0) - ->comment('Amount of times the topic has been viewed.') - ->change(); - - $table->tinyInteger('topic_status', 3) - ->unsigned() - ->default(0) - ->comment('Status of topic.') - ->change(); - - $table->integer('topic_status_change', 11) - ->unsigned() - ->default(0) - ->comment('Date the topic status was changed (used for deletion cooldown as well).') - ->change(); - - $table->tinyInteger('topic_type', 3) - ->unsigned() - ->default(0) - ->comment('Type of the topic.') - ->change(); - - $table->integer('topic_last_reply', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp of when the last reply made to this thread.') - ->change(); - - $table->bigInteger('topic_old_forum', 255) - ->unsigned() - ->default(0) - ->comment('Pre-move forum id.') - ->change(); - }); - - Schema::table('topics_track', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user this row applies to.') - ->change(); - - $table->bigInteger('topic_id', 255) - ->unsigned() - ->comment('ID of the thread in question.') - ->change(); - - $table->bigInteger('forum_id', 255) - ->unsigned() - ->comment('ID of the forum in question.') - ->change(); - - $table->integer('mark_time', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp of the event.') - ->change(); - }); - - Schema::table('uploads', function (Blueprint $table) { - $table->bigIncrements('file_id', 255) - ->unsigned() - ->comment('Automatically generated value for management') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('ID of the user that uploaded the file') - ->change(); - - $table->binary('file_data') - ->comment('Contents of the file') - ->change(); - - $table->string('file_name', 255) - ->comment('Name of the file') - ->change(); - - $table->string('file_mime', 255) - ->comment('Static mime type of the file') - ->change(); - - $table->integer('file_time', 11) - ->unsigned() - ->comment('Timestamp of when the file was uploaded') - ->change(); - - $table->integer('file_expire', 11) - ->unsigned() - ->comment('When should the file be removed, 0 for never') - ->change(); - }); - - Schema::table('user_optionfields', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User this field applies to') - ->change(); - - $table->string('field_name', 255) - ->comment('Identifier of the field') - ->change(); - - $table->string('field_value', 255) - ->comment('Value of the field') - ->change(); - }); - - Schema::table('user_profilefields', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User this field applies to') - ->change(); - - $table->string('field_name', 255) - ->comment('Identifier of the field') - ->change(); - - $table->string('field_value', 255) - ->comment('Value of the field') - ->change(); - }); - - Schema::table('user_ranks', function (Blueprint $table) { - $table->bigInteger('user_id', 255) - ->unsigned() - ->change(); - - $table->bigInteger('rank_id', 128) - ->unsigned() - ->change(); - }); - - Schema::table('username_history', function (Blueprint $table) { - $table->increments('change_id', 11) - ->unsigned() - ->comment('Identifier') - ->change(); - - $table->integer('change_time', 11) - ->unsigned() - ->comment('Timestamp of change') - ->change(); - - $table->bigInteger('user_id', 255) - ->unsigned() - ->comment('User ID') - ->change(); - - $table->string('username_new', 255) - ->comment('New username') - ->change(); - - $table->string('username_new_clean', 255) - ->comment('Clean new username') - ->change(); - - $table->string('username_old', 255) - ->comment('Old username') - ->change(); - - $table->string('username_old_clean', 255) - ->comment('Clean old username') - ->change(); - }); - - Schema::table('users', function (Blueprint $table) { - $table->bigIncrements('user_id', 255) - ->unsigned() - ->comment('Automatically generated ID by MySQL for management. ') - ->change(); - - $table->string('username', 255) - ->comment('Username set at registration.') - ->change(); - - $table->string('username_clean', 255) - ->unique() - ->comment('A more cleaned up version of the username for backend usage.') - ->change(); - - $table->string('password_hash', 255) - ->comment('Hashing algo used for the password hash.'); - - $table->string('password_salt', 255) - ->comment('Salt used for the password hash.'); - - $table->string('password_algo', 255) - ->comment('Algorithm used for the password hash.'); - - $table->integer('password_iter', 11) - ->unsigned() - ->comment('Password hash iterations.'); - - $table->integer('password_chan', 11) - ->unsigned() - ->default(0) - ->comment('Last time the user changed their password.') - ->change(); - - $table->string('email', 255) - ->comment('E-mail of the user for password restoring etc.') - ->change(); - - $table->mediumInteger('rank_main', 4) - ->unsigned() - ->default(0) - ->comment('Main rank of the user.') - ->change(); - - $table->string('user_colour', 255) - ->nullable() - ->default(null) - ->comment('Additional name colour, when empty colour defaults to group colour.') - ->change(); - - $table->string('register_ip', 255) - ->comment('IP used for the creation of this account.') - ->change(); - - $table->string('last_ip', 255) - ->comment('Last IP that was used to log into this account.') - ->change(); - - $table->string('user_title', 64) - ->nullable() - ->default(null) - ->comment('Custom user title of the user, when empty reverts to their derault group name.') - ->change(); - - $table->integer('user_register', 11) - ->unsigned() - ->default(0) - ->comment('Timestamp of account creation.') - ->change(); - - $table->integer('user_last_online', 11) - ->unsigned() - ->default(0) - ->comment('Last time anything was done on this account.') - ->change(); - - $table->date('user_birthday') - ->default('0000-00-00') - ->comment('Birthdate of the user.') - ->change(); - - $table->char('user_country', 2) - ->default('XX') - ->comment("Contains ISO 3166 country code of user's registration location.") - ->change(); - - $table->bigInteger('user_avatar', 255) - ->unsigned() - ->default(0) - ->comment('ID of the avatar in the uploads table.') - ->change(); - - $table->bigInteger('user_background', 255) - ->unsigned() - ->default(0) - ->comment('ID of the background in the uploads table.') - ->change(); - - $table->bigInteger('user_header', 255) - ->unsigned() - ->default(0) - ->comment('ID of the profile header in the uploads table.') - ->change(); - - $table->longText('user_page') - ->comment('Contents of the userpage.') - ->change(); - - $table->text('user_signature') - ->comment('Signature displayed below forum posts.') - ->change(); - - $table->string('password', 255) - ->nullable() - ->default(null) - ->change(); - }); - } -} diff --git a/gulpfile.js b/gulpfile.js index 7a35b8b..00c646a 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,12 +1,9 @@ var elixir = require('laravel-elixir'), elixirTypscript = require('elixir-typescript'), - nodePath = '../../node_modules/'; - -elixir.config.assetsPath = './assets'; + nodePath = '../../../node_modules/'; elixir(function(mix) { - mix .less('aitemu/master.less', 'public/css/aitemu.css') .less('yuuno/master.less', 'public/css/yuuno.css') @@ -14,6 +11,6 @@ elixir(function(mix) { .typescript('aitemu/**/*.ts', 'public/js/aitemu.js') .typescript('yuuno/**/*.ts', 'public/js/yuuno.js') .scripts([ - nodePath + 'turbolinks/dist/turbolinks.js' + nodePath + 'turbolinks/dist/turbolinks.js', ], 'public/js/libraries.js'); }); diff --git a/mahou b/mahou index 5afbfb0..70286a3 100644 --- a/mahou +++ b/mahou @@ -13,23 +13,15 @@ namespace Sakura; use Sakura\Console\Application; use GetOptionKit\Exception\InvalidOptionException; -// Define that this page won't require templating -define('SAKURA_NO_TPL', true); - // Include components require_once 'sakura.php'; -// Check if we're using console -if (php_sapi_name() === 'cli') { - // Create an instance - $console = new Application; +// Create an instance +$console = new Application; - // Attempt to run - try { - $console->run($argv); - } catch (InvalidOptionException $e) { - die($e->getMessage()); - } -} else { - echo 'Why would you even try to run a console app through a browser?'; +// Attempt to run +try { + $console->run($argv); +} catch (InvalidOptionException $e) { + die($e->getMessage()); } diff --git a/package.json b/package.json index 53e6d74..852018e 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "dev": "gulp watch" }, "dependencies": { + "elixir-typescript": "^2.0.0", "gulp": "^3.9.1", "laravel-elixir": "^5.0.0", - "elixir-typescript": "^2.0.0", "turbolinks": "^5.0.0" } } diff --git a/public/content/data/yuuno/css/error.css b/public/content/data/yuuno/css/error.css deleted file mode 100644 index a97e8bb..0000000 --- a/public/content/data/yuuno/css/error.css +++ /dev/null @@ -1,103 +0,0 @@ -html, -body { - min-height: 100%; - width: 90; -} - -html { - background: url('/content/images/satori-error.png') top right no-repeat #FFF; - font-family: 'verdana', sans-serif; - font-size: .8em; -} - -body { - margin: 0 2em; -} - -#wrap { - max-width: 34em; -} - -h1, -h2, -h3, -p { - margin: 0; - padding: 0; - font-size: 1em; - font-weight: normal; -} - -h1 { - font-size: 1.5em; - margin: 1.33em 0; -} - -h1 img { - margin: 0 .5em -.75em 0; -} - -p { - padding: 0; - margin: 2em 0; - line-height: 1.33em; -} - -hr { - margin: 1.9em 0; - background: #BBB; - border: none; -} - -ul { - padding: .75em 0 0 0; -} - -li { - margin: 0 0 .8em 3.46em; - line-height: 1.32em; -} - -a { - color: red; -} - -img+a:before { - content: " "; -} - -h3 { - margin: 2.5em 0; -} - -li:nth-child(3) img { - margin: -0.2em 0; -} - -li:nth-child(4) img { - margin: -0.5em 0; -} - -table { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - opacity: 0; - display: none; -} - -table, -tr, -td { - background: rgba(0, 0, 0, .2); - height: 100%; - width: 100%; - text-align: center; -} - -table img { - border-radius: 32px; - box-shadow: 0 4px 32px #888; -} diff --git a/public/content/data/yuuno/images/ban.png b/public/content/data/yuuno/images/ban.png deleted file mode 100644 index fa484dd..0000000 Binary files a/public/content/data/yuuno/images/ban.png and /dev/null differ diff --git a/public/content/data/yuuno/images/deactivated-av-old.png b/public/content/data/yuuno/images/deactivated-av-old.png deleted file mode 100644 index 1b52de4..0000000 Binary files a/public/content/data/yuuno/images/deactivated-av-old.png and /dev/null differ diff --git a/public/content/data/yuuno/images/deactivated-av.png b/public/content/data/yuuno/images/deactivated-av.png deleted file mode 100644 index c8d32ad..0000000 Binary files a/public/content/data/yuuno/images/deactivated-av.png and /dev/null differ diff --git a/public/content/data/yuuno/images/feedback-logo.png b/public/content/data/yuuno/images/feedback-logo.png deleted file mode 100644 index 65f062a..0000000 Binary files a/public/content/data/yuuno/images/feedback-logo.png and /dev/null differ diff --git a/public/content/data/yuuno/images/satorilogo.png b/public/content/data/yuuno/images/satorilogo.png deleted file mode 100644 index c6b3dc1..0000000 Binary files a/public/content/data/yuuno/images/satorilogo.png and /dev/null differ diff --git a/public/content/images/flags/catalonia.png b/public/content/images/flags/catalonia.png deleted file mode 100644 index 5041e30..0000000 Binary files a/public/content/images/flags/catalonia.png and /dev/null differ diff --git a/public/content/images/flags/england.png b/public/content/images/flags/england.png deleted file mode 100644 index 3a7311d..0000000 Binary files a/public/content/images/flags/england.png and /dev/null differ diff --git a/public/content/images/flags/europeanunion.png b/public/content/images/flags/europeanunion.png deleted file mode 100644 index d6d8711..0000000 Binary files a/public/content/images/flags/europeanunion.png and /dev/null differ diff --git a/public/content/images/flags/scotland.png b/public/content/images/flags/scotland.png deleted file mode 100644 index a0e57b4..0000000 Binary files a/public/content/images/flags/scotland.png and /dev/null differ diff --git a/public/content/images/flags/wales.png b/public/content/images/flags/wales.png deleted file mode 100644 index e0d7cee..0000000 Binary files a/public/content/images/flags/wales.png and /dev/null differ diff --git a/public/content/libraries/d3.js b/public/content/libraries/d3.js deleted file mode 100644 index 5ae5160..0000000 --- a/public/content/libraries/d3.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+="")===xa||n[0]===ba?ba+n:n}function f(n){return(n+="")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Ta,u="click"+r,i=oa.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==qa&&(qa="onselectstart"in e?!1:x(e.style,"userSelect")),qa){var a=n(e).style,o=a[qa];a[qa]="none"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(""+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch("beforesend","progress","load","error"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,"on"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||" ",a=e[2]||">",o=e[3]||"-",l=e[4]||"",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===a)&&(c=r="0",a="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===l&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===o?"":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===a?u+n+k:">"===a?k+u+n:"^"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++oo;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,"%":function(){return"%"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp("^(?:"+n.map(oa.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,"0",2)+Zn(u,"0",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)0?0:3:Ma(r[0]-e)0?2:1:Ma(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push("M",n,",",t,i)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function u(){a.push("Z")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){ -i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)Da?{x:f,y:Ma(t-f)Da?{x:Ma(e-p)Da?{x:h,y:Ma(t-h)Da?{x:Ma(e-g)=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.yd||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.yg){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.xi||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return"#"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+="",t+="";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return ir;++r)o[(e=l[r]).i]=e.x(n);return o.join("")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+""}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+""}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+""}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:mr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:mr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++ae;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.ra;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2]))}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),"s"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]="."+ti(i.scale(r[2]))),u[8]="f",e=oa.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+ei(u[8],r)),e=u.join("")}else e=",."+ti(r[2])+"f";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++0;h--)a.push(i(c)*h);for(c=0;a[c]l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return kl;arguments.length<2?t=kl:"function"!=typeof t&&(t=oa.format(t));var r,o=Math.max(.1,n/a.ticks().length),l=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(l(u(n)+r))<=o?t(n):""}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++ae?[NaN,NaN]:[e>0?o[e-1]:n[0],et?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push("M",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f1?n.join("L"):n+"Z"}function bi(n){return n.join("L")+"Z"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1&&u.push("H",r[0]),u.join("")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){o=t[1],i=n[l],l++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var c=2;c9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function ta(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:"3.5.10"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement("DIV").style.setProperty("opacity",0,"")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+"")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+"")},da.setProperty=function(n,t,e){ma.call(this,n,t+"",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ur&&(e=r)}else{for(;++u=r){e=r;break}for(;++ur&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=r){e=r;break}for(;++ue&&(e=r)}else{for(;++u=r){e=r;break}for(;++ue&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=r){e=u=r;break}for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,"\\$&")};var wa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++uu){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++rr;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++ii;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++or){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:"mouseover",mouseleave:"mouseout"});sa&&La.forEach(function(n){"on"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:"dragend"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),u=null,i=e(b,oa.mouse,t,"mousemove","mouseup"),a=e(G,oa.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,"on")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+oa.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return $a||($a="onwheel"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in sa?(Xa=function(){return oa.event.wheelDelta},"mousewheel"):(Xa=function(){return-oa.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,"on")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+""},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var o=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},oa.csv=oa.dsv(",","text/csv"),oa.tsv=oa.dsv(" ","text/tab-separated-values");var uo,io,ao,oo,lo=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+"s"]=e.range,ho[n+"s"].utc=e.utc.range,ho[n+"OfYear"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={"-":"",_:" ",0:"0"},mo=/^\s*\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], -shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nSo?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&("function"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),"function"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.xm&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,"g");return(oa.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++eo*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch("start","tick","end"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:"end",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:"tick",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:u=0})):n>0&&(c.start({type:"start",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",f)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],"function"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],"function"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],"function"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",nu)),arguments.length?void this.on("mouseover.force",tu).on("mouseout.force",eu).call(r):r},oa.rebind(l,c,"on")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++cf?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},"default":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.xp.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?c.dx:"dice"===g?c.dy:"slice-dice"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,"squarify"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++ae&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0; -if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++ie.dx)&&(s=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(".0e"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:"range",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",y,",",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",y,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",g," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-g," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll="auto";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,"linear-closed":bi,step:_i,"step-before":wi,"step-after":Si,basis:zi,"basis-open":Li,"basis-closed":qi,bundle:Ti,cardinal:Ei,"cardinal-open":ki,"cardinal-closed":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ja)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,"attr."+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if("string"!=typeof n){2>a&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ji(this,"style."+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Il.text=function(n){return Ji(this,"text",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch("start","end","interrupt"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),d=oa.transition(p.exit()).style("opacity",Da).remove(),m=oa.transition(p.order()).style("opacity",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),oa.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=m.select("line"),C=p.select("text").text(g),z=v.select("text"),L=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=na,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*i+"V0H"+x[1]+"V"+q*i)):(n=ta,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*i+","+x[0]+"H0V"+x[1]+"H"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+"":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl="bottom",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),a=t.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var o=t.selectAll(".resize").data(v,y);o.exit().remove(),o.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Xl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),o.style("display",n.empty()?"none":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),oa.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed("extent"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(oa.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",y):q.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),oa.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var a,o,l=N(n,"brushstart","brush","brushend"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each("start.brush",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,"on")};var Xl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$l=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl("%Y-%m-%dT%H:%M:%S.%LZ");Bl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,"application/json",ia,t)},oa.html=function(n,t){return Cn(n,"text/html",aa,t)},oa.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=oa,define(oa)):"object"==typeof module&&module.exports?module.exports=oa:this.d3=oa}(); \ No newline at end of file diff --git a/public/content/libraries/highlight.css b/public/content/libraries/highlight.css deleted file mode 100644 index 2864170..0000000 --- a/public/content/libraries/highlight.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - -Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #23241f; -} - -.hljs, -.hljs-tag, -.hljs-subst { - color: #f8f8f2; -} - -.hljs-strong, -.hljs-emphasis { - color: #a8a8a2; -} - -.hljs-bullet, -.hljs-quote, -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-link { - color: #ae81ff; -} - -.hljs-code, -.hljs-title, -.hljs-section, -.hljs-selector-class { - color: #a6e22e; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-name, -.hljs-attr { - color: #f92672; -} - -.hljs-symbol, -.hljs-attribute { - color: #66d9ef; -} - -.hljs-params, -.hljs-class .hljs-title { - color: #f8f8f2; -} - -.hljs-string, -.hljs-type, -.hljs-built_in, -.hljs-builtin-name, -.hljs-selector-id, -.hljs-selector-attr, -.hljs-selector-pseudo, -.hljs-addition, -.hljs-variable, -.hljs-template-variable { - color: #e6db74; -} - -.hljs-comment, -.hljs-deletion, -.hljs-meta { - color: #75715e; -} diff --git a/public/content/libraries/highlight.js b/public/content/libraries/highlight.js deleted file mode 100644 index dab2aaf..0000000 --- a/public/content/libraries/highlight.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! highlight.js v9.0.0 | BSD3 License | git.io/hljslicense */ -!function(e){"undefined"!=typeof exports?e(exports):(self.hljs=e({}),"function"==typeof define&&define.amd&&define("hljs",[],function(){return self.hljs}))}(function(e){function n(e){return e.replace(/&/gm,"&").replace(//gm,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function i(e){var n,t,r,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/i.exec(i))return E(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(E(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"==e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(o)}else"start"==g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\b\w+\b/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){for(var t=0;t";return i+=e+'">',i+n+o}function p(){if(!L.k)return n(M);var e="",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(M);r;){e+=n(M.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(M)}return e+n(M.substr(t))}function d(){var e="string"==typeof L.sL;if(e&&!R[L.sL])return n(M);var t=e?l(L.sL,M,!0,y[L.sL]):f(M,L.sL.length?L.sL:void 0);return L.r>0&&(B+=t.r),e&&(y[L.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){return void 0!==L.sL?d():p()}function v(e,t){var r=e.cN?h(e.cN,"",!0):"";e.rB?(k+=r,M=""):e.eB?(k+=n(t)+r,M=""):(k+=r,M=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(M+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(M+=t),k+=b();do L.cN&&(k+=""),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),M="",a.starts&&v(a.starts,""),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme "'+t+'" for mode "'+(L.cN||"")+'"');return M+=t,t.length||1}var N=E(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,L=i||N,y={},k="";for(w=L;w!=N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var M="",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),w=L;w.parent;w=w.parent)w.cN&&(k+="");return{r:B,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function f(e,t){t=t||x.languages||Object.keys(R);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(E(n)){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function g(e){return x.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return n.replace(/\t/g,x.tabReplace)})),x.useBR&&(e=e.replace(/\n/g,"
    ")),e}function h(e,n,t){var r=n?w[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n=i(e);if(!a(n)){var t;x.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):t=e;var r=t.textContent,o=n?l(n,r,!0):f(r),s=u(t);if(s.length){var p=document.createElementNS("http://www.w3.org/1999/xhtml","div");p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){x=o(x,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");Array.prototype.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e){w[e]=n})}function N(){return Object.keys(R)}function E(e){return e=(e||"").toLowerCase(),R[e]||R[w[e]]}var x={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},R={},w={};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=E,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e});hljs.registerLanguage("vbscript",function(e){return{aliases:["vbs"],cI:!0,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C(/'/,/$/,{r:0}),e.CNM]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},a={cN:"meta",b:/<\?(php)?|\?>/},i={cN:"string",c:[e.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},t={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.CLCM,e.HCM,e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"},a]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},a,c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,i,t]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},i,t]}});hljs.registerLanguage("avrasm",function(r){return{cI:!0,l:"\\.?"+r.IR,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",meta:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},c:[r.CBCM,r.C(";","$",{r:0}),r.CNM,r.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},r.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"symbol",b:"^[A-Za-z0-9_.$]+:"},{cN:"meta",b:"#",e:"$"},{cN:"subst",b:"@[0-9]+"}]}});hljs.registerLanguage("matlab",function(e){var a=[e.CNM,{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]}],s={r:0,c:[{b:/'['\.]*/}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{b:/[a-zA-Z_][a-zA-Z_0-9]*'['\.]*/,rB:!0,r:0,c:[{b:/[a-zA-Z_][a-zA-Z_0-9]*/,r:0},s.c[0]]},{b:"\\[",e:"\\]",c:a,r:0,starts:s},{b:"\\{",e:/}/,c:a,r:0,starts:s},{b:/\)/,r:0,starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")].concat(a)}});hljs.registerLanguage("brainfuck",function(r){var n={cN:"literal",b:"[\\+\\-]",r:0};return{aliases:["bf"],c:[r.C("[^\\[\\]\\.,\\+\\-<> \r\n]","[\\[\\]\\.,\\+\\-<> \r\n]",{rE:!0,r:0}),{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:!0,c:[n]},n]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:"^\\[.+\\]:",rB:!0,c:[{cN:"symbol",b:"\\[",e:"\\]:",eB:!0,eE:!0,starts:{cN:"link",e:"$"}}]}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("lua",function(e){var t="\\[=*\\[",a="\\]=*\\]",r={b:t,e:a,c:["self"]},n=[e.C("--(?!"+t+")","$"),e.C("--"+t,a,{c:[r],r:10})];return{l:e.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:n.concat([{cN:"function",bK:"function",e:"\\)",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:!0,c:n}].concat(n)},e.CNM,e.ASM,e.QSM,{cN:"string",b:t,e:a,c:[r],r:5}])}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},s=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{b:"`",e:"`",eB:!0,eE:!0,sL:"javascript"}];r.c=s;var i=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(s)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:s.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[i,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("vbnet",function(e){return{aliases:["vb"],cI:!0,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C("'","$",{rB:!0,c:[{cN:"doctag",b:"'''|",c:[e.PWM]},{cN:"doctag",b:"",c:[e.PWM]}]}),e.CNM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elseif end region externalsource"}}]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer cmd expose add copy entrypoint volume user workdir onbuild run env label",c:[e.HCM,{k:"run cmd entrypoint volume add copy workdir onbuild label",b:/^ *(onbuild +)?(run|cmd|entrypoint|volume|add|copy|workdir|label) +/,starts:{e:/[^\\]\n/,sL:"bash"}},{k:"from maintainer expose env user onbuild",b:/^ *(onbuild +)?(from|maintainer|expose|env|user|onbuild) +/,e:/[^\\]\n/,c:[e.ASM,e.QSM,e.NM,e.HCM]}]}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or equal less greater strless strgreater strequal matches"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("nsis",function(e){var t={cN:"variable",b:"\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)"},i={cN:"variable",b:"\\$+{[a-zA-Z0-9_]+}"},n={cN:"variable",b:"\\$+[a-zA-Z0-9_]+",i:"\\(\\){}"},r={cN:"variable",b:"\\$+\\([a-zA-Z0-9_]+\\)"},l={cN:"built_in",b:"(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)"},o={cN:"keyword",b:"\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)"};return{cI:!1,k:{keyword:"Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle",literal:"admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user "},c:[e.HCM,e.CBCM,{cN:"string",b:'"',e:'"',i:"\\n",c:[{b:"\\$(\\\\(n|r|t)|\\$)"},t,i,n,r]},e.C(";","$",{r:0}),{cN:"function",bK:"Function PageEx Section SectionGroup SubSection",e:"$"},o,i,n,r,l,e.NM,{b:e.IR+"::"+e.IR}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("javascript",function(e){return{aliases:["js"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b:/\s*[);\]]/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#/}});hljs.registerLanguage("julia",function(e){var r={keyword:"in abstract baremodule begin bitstype break catch ccall const continue do else elseif end export finally for function global if immutable import importall let local macro module quote return try type typealias using while",literal:"true false ARGS CPU_CORES C_NULL DL_LOAD_PATH DevNull ENDIAN_BOM ENV I|0 Inf Inf16 Inf32 InsertionSort JULIA_HOME LOAD_PATH MS_ASYNC MS_INVALIDATE MS_SYNC MergeSort NaN NaN16 NaN32 OS_NAME QuickSort RTLD_DEEPBIND RTLD_FIRST RTLD_GLOBAL RTLD_LAZY RTLD_LOCAL RTLD_NODELETE RTLD_NOLOAD RTLD_NOW RoundDown RoundFromZero RoundNearest RoundToZero RoundUp STDERR STDIN STDOUT VERSION WORD_SIZE catalan cglobal e|0 eu|0 eulergamma golden im nothing pi γ π φ Inf64 NaN64 RoundNearestTiesAway RoundNearestTiesUp ",built_in:"ANY ASCIIString AbstractArray AbstractRNG AbstractSparseArray Any ArgumentError Array Associative Base64Pipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError Box CFILE Cchar Cdouble Cfloat Char CharString Cint Clong Clonglong ClusterManager Cmd Coff_t Colon Complex Complex128 Complex32 Complex64 Condition Cptrdiff_t Cshort Csize_t Cssize_t Cuchar Cuint Culong Culonglong Cushort Cwchar_t DArray DataType DenseArray Diagonal Dict DimensionMismatch DirectIndexString Display DivideError DomainError EOFError EachLine Enumerate ErrorException Exception Expr Factorization FileMonitor FileOffset Filter Float16 Float32 Float64 FloatRange FloatingPoint Function GetfieldNode GotoNode Hermitian IO IOBuffer IOStream IPv4 IPv6 InexactError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException IntrinsicFunction KeyError LabelNode LambdaStaticData LineNumberNode LoadError LocalProcess MIME MathConst MemoryError MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode Nothing Number ObjectIdDict OrdinalRange OverflowError ParseError PollingFileWatcher ProcessExitedException ProcessGroup Ptr QuoteNode Range Range1 Ranges Rational RawFD Real Regex RegexMatch RemoteRef RepString RevString RopeString RoundingMode Set SharedArray Signed SparseMatrixCSC StackOverflowError Stat StatStruct StepRange String SubArray SubString SymTridiagonal Symbol SymbolNode Symmetric SystemError Task TextDisplay Timer TmStruct TopNode Triangular Tridiagonal Type TypeConstructor TypeError TypeName TypeVar UTF16String UTF32String UTF8String UdpSocket Uint Uint128 Uint16 Uint32 Uint64 Uint8 UndefRefError UndefVarError UniformScaling UnionType UnitRange Unsigned Vararg VersionNumber WString WeakKeyDict WeakRef Woodbury Zip AbstractChannel AbstractFloat AbstractString AssertionError Base64DecodePipe Base64EncodePipe BufferStream CapturedException CartesianIndex CartesianRange Channel Cintmax_t CompositeException Cstring Cuintmax_t Cwstring Date DateTime Dims Enum GenSym GlobalRef HTML InitError InvalidStateException Irrational LinSpace LowerTriangular NullException Nullable OutOfMemoryError Pair PartialQuickSort Pipe RandomDevice ReadOnlyMemoryError ReentrantLock Ref RemoteException SegmentationFault SerializationState SimpleVector TCPSocket Text Tuple UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UnicodeError Union UpperTriangular Val Void WorkerConfig AbstractMatrix AbstractSparseMatrix AbstractSparseVector AbstractVecOrMat AbstractVector DenseMatrix DenseVecOrMat DenseVector Matrix SharedMatrix SharedVector StridedArray StridedMatrix StridedVecOrMat StridedVector VecOrMat Vector "},t="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",a={l:t,k:r,i:/<\//},n={cN:"type",b:/::/},o={cN:"type",b:/<:/},i={cN:"number",b:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,r:0},l={cN:"string",b:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},c={cN:"subst",b:/\$\(/,e:/\)/,k:r},s={cN:"variable",b:"\\$"+t},d={cN:"string",c:[e.BE,c,s],v:[{b:/\w*"""/,e:/"""\w*/,r:10},{b:/\w*"/,e:/"\w*/}]},S={cN:"string",c:[e.BE,c,s],b:"`",e:"`"},u={cN:"meta",b:"@"+t},g={cN:"comment",v:[{b:"#=",e:"=#",r:10},{b:"#",e:"$"}]};return a.c=[i,l,n,o,d,S,u,g,e.HCM],c.c=a.c,a});hljs.registerLanguage("twig",function(e){var t={cN:"params",b:"\\(",e:"\\)"},a="attribute block constant cycle date dump include max min parent random range source template_from_string",r={bK:a,k:{name:a},r:0,c:[t]},c={b:/\|[A-Za-z_]+:?/,k:"abs batch capitalize convert_encoding date date_modify default escape first format join json_encode keys last length lower merge nl2br number_format raw replace reverse round slice sort split striptags title trim upper url_encode",c:[r]},s="autoescape block do embed extends filter flush for if import include macro sandbox set spaceless use verbatim";return s=s+" "+s.split(" ").map(function(e){return"end"+e}).join(" "),{aliases:["craftcms"],cI:!0,sL:"xml",c:[e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:s,starts:{eW:!0,c:[c,r],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:["self",c,r]}]}});hljs.registerLanguage("cs",function(e){var t="abstract as base bool break byte case catch char checked const continue decimal dynamic default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long null when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield",r=e.IR+"(<"+e.IR+">)?";return{aliases:["csharp"],k:t,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},e.ASM,e.QSM,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+r+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw d|0 delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu g|0 go gr grepa gu gv ha h|0 helpf helpg helpt hi hid his i|0 ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs n|0 new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf q|0 quita qa r|0 rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv s|0 sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync t|0 tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up v|0 ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"abs acos add and append argc argidx argv asin atan atan2 browse browsedir bufexists buflisted bufloaded bufname bufnr bufwinnr byte2line byteidx call ceil changenr char2nr cindent clearmatches col complete complete_add complete_check confirm copy cos cosh count cscope_connection cursor deepcopy delete did_filetype diff_filler diff_hlID empty escape eval eventhandler executable exists exp expand extend feedkeys filereadable filewritable filter finddir findfile float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreground function garbagecollect get getbufline getbufvar getchar getcharmod getcmdline getcmdpos getcmdtype getcwd getfontname getfperm getfsize getftime getftype getline getloclist getmatches getpid getpos getqflist getreg getregtype gettabvar gettabwinvar getwinposx getwinposy getwinvar glob globpath has has_key haslocaldir hasmapto histadd histdel histget histnr hlexists hlID hostname iconv indent index input inputdialog inputlist inputrestore inputsave inputsecret insert invert isdirectory islocked items join keys len libcall libcallnr line line2byte lispindent localtime log log10 luaeval map maparg mapcheck match matchadd matcharg matchdelete matchend matchlist matchstr max min mkdir mode mzeval nextnonblank nr2char or pathshorten pow prevnonblank printf pumvisible py3eval pyeval range readfile reltime reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remove rename repeat resolve reverse round screenattr screenchar screencol screenrow search searchdecl searchpair searchpairpos searchpos server2client serverlist setbufvar setcmdpos setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar setwinvar sha256 shellescape shiftwidth simplify sin sinh sort soundfold spellbadword spellsuggest split sqrt str2float str2nr strchars strdisplaywidth strftime stridx string strlen strpart strridx strtrans strwidth submatch substitute synconcealed synID synIDattr synIDtrans synstack system tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname tolower toupper tr trunc type undofile undotree values virtcol visualmode wildmenumode winbufnr wincol winheight winline winnr winrestcmd winrestview winsaveview winwidth writefile xor"},i:/[{:]/,c:[e.NM,e.ASM,{cN:"string",b:/"((\\")|[^"\n])*("|\n)/},{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]}]}});hljs.registerLanguage("mipsasm",function(s){return{cI:!0,aliases:["mips"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .ltorg ",built_in:"$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 zero at v0 v1 a0 a1 a2 a3 a4 a5 a6 a7 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 s0 s1 s2 s3 s4 s5 s6 s7 s8 k0 k1 gp sp fp ra $f0 $f1 $f2 $f2 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14 $f15 $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23 $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31 Context Random EntryLo0 EntryLo1 Context PageMask Wired EntryHi HWREna BadVAddr Count Compare SR IntCtl SRSCtl SRSMap Cause EPC PRId EBase Config Config1 Config2 Config3 LLAddr Debug DEPC DESAVE CacheErr ECC ErrorEPC TagLo DataLo TagHi DataHi WatchLo WatchHi PerfCtl PerfCnt "},c:[{cN:"keyword",b:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(.hb)?|jr(.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs.[sd]|add.[sd]|alnv.ps|bc1[ft]l?|c.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et]).[sd]|(ceil|floor|round|trunc).[lw].[sd]|cfc1|cvt.d.[lsw]|cvt.l.[dsw]|cvt.ps.s|cvt.s.[dlw]|cvt.s.p[lu]|cvt.w.[dls]|div.[ds]|ldx?c1|luxc1|lwx?c1|madd.[sd]|mfc1|mov[fntz]?.[ds]|msub.[sd]|mth?c1|mul.[ds]|neg.[ds]|nmadd.[ds]|nmsub.[ds]|p[lu][lu].ps|recip.fmt|r?sqrt.[ds]|sdx?c1|sub.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)",e:"\\s"},s.C("[;#]","$"),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"0x[0-9a-f]+"},{b:"\\b-?\\d+"}],r:0},{cN:"symbol",v:[{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"^\\s*[0-9]+:"},{b:"[0-9]+[bf]"}],r:0}],i:"/"}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("python",function(e){var r={cN:"meta",b:/^(>>>|\.\.\.) /},b={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},a={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",r,a,b]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[r,a,b,e.HCM,{v:[{cN:"function",bK:"def",r:10},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("x86asm",function(s){return{cI:!0,l:"[.%]?"+s.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[s.C(";","$",{r:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{b:"\\$[0-9][0-9A-Fa-f]*",r:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"},{b:"\\.[A-Za-z0-9]+"}],r:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],r:0},{cN:"subst",b:"%[0-9]+",r:0},{cN:"subst",b:"%!S+",r:0}]}});hljs.registerLanguage("glsl",function(e){return{k:{keyword:"break continue discard do else for if return whileattribute binding buffer ccw centroid centroid varying coherent column_major const cw depth_any depth_greater depth_less depth_unchanged early_fragment_tests equal_spacing flat fractional_even_spacing fractional_odd_spacing highp in index inout invariant invocations isolines layout line_strip lines lines_adjacency local_size_x local_size_y local_size_z location lowp max_vertices mediump noperspective offset origin_upper_left out packed patch pixel_center_integer point_mode points precise precision quads r11f_g11f_b10f r16 r16_snorm r16f r16i r16ui r32f r32i r32ui r8 r8_snorm r8i r8ui readonly restrict rg16 rg16_snorm rg16f rg16i rg16ui rg32f rg32i rg32ui rg8 rg8_snorm rg8i rg8ui rgb10_a2 rgb10_a2ui rgba16 rgba16_snorm rgba16f rgba16i rgba16ui rgba32f rgba32i rgba32ui rgba8 rgba8_snorm rgba8i rgba8ui row_major sample shared smooth std140 std430 stream triangle_strip triangles triangles_adjacency uniform varying vertices volatile writeonly",type:"atomic_uint bool bvec2 bvec3 bvec4 dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 double dvec2 dvec3 dvec4 float iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBufferiimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray int isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow image1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D samplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 vec2 vec3 vec4 void",built_in:"gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxComputeAtomicCounterBuffers gl_MaxComputeAtomicCounters gl_MaxComputeImageUniforms gl_MaxComputeTextureImageUnits gl_MaxComputeUniformComponents gl_MaxComputeWorkGroupCount gl_MaxComputeWorkGroupSize gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentInputVectors gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexOutputVectors gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_GlobalInvocationID gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_LocalInvocationID gl_LocalInvocationIndex gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_NumSamples gl_NumWorkGroups gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrix gl_TextureMatrixInverse gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_WorkGroupID gl_WorkGroupSize gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicAdd atomicAnd atomicCompSwap atomicCounter atomicCounterDecrement atomicCounterIncrement atomicExchange atomicMax atomicMin atomicOr atomicXor barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual groupMemoryBarrier imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageSize imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier memoryBarrierAtomicCounter memoryBarrierBuffer memoryBarrierImage memoryBarrierShared min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLevels textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow",literal:"true false"},i:'"',c:[e.CLCM,e.CBCM,e.CNM,{cN:"meta",b:"#",e:"$"}]}});hljs.registerLanguage("delphi",function(e){var r="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure",t=[e.CLCM,e.C(/\{/,/\}/,{r:0}),e.C(/\(\*/,/\*\)/,{r:10})],i={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]},c={cN:"string",b:/(#\d+)+/},o={b:e.IR+"\\s*=\\s*class\\s*\\(",rB:!0,c:[e.TM]},n={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:r,c:[i,c]}].concat(t)};return{cI:!0,k:r,i:/"|\$[G-Zg-z]|\/\*|<\/|\|/,c:[i,c,e.NM,o,n].concat(t)}});hljs.registerLanguage("swift",function(e){var i={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},t={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:i,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:i,c:[o,e.CLCM,n,t,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/,i:/\(/}),{b://,i:/>/},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:i,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:i,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("clojure",function(e){var t={"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},r="a-zA-Z_\\-!.?+*=<>&#'",n="["+r+"]["+r+"0-9/;:]*",a="[-+]?\\d+(\\.\\d+)?",o={b:n,r:0},s={cN:"number",b:a,r:0},i=e.inherit(e.QSM,{i:null}),c=e.C(";","$",{r:0}),d={cN:"literal",b:/\b(true|false|nil)\b/},l={b:"[\\[\\{]",e:"[\\]\\}]"},m={cN:"comment",b:"\\^"+n},p=e.C("\\^\\{","\\}"),u={cN:"symbol",b:"[:]"+n},f={b:"\\(",e:"\\)"},h={eW:!0,r:0},y={k:t,l:n,cN:"name",b:n,starts:h},b=[f,i,m,p,c,u,l,s,d,o];return f.c=[e.C("comment",""),y,h],h.c=b,l.c=b,{aliases:["clj"],i:/\S/,c:[f,i,m,p,c,u,l,s,d]}});hljs.registerLanguage("yaml",function(e){var a={literal:"{ } true false yes no Yes No True False null"},b="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:b+r+":"},{b:b+'"'+r+'":'},{b:b+"'"+r+"':"}]},c={cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]},l={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/}],c:[e.BE,c]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:l.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},l,e.HCM,e.CNM],k:a}});hljs.registerLanguage("makefile",function(e){var a={cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]};return{aliases:["mk","mak"],c:[e.HCM,{b:/^\w+\s*\W*=/,rB:!0,r:0,starts:{e:/\s*\W*=/,eE:!0,starts:{e:/$/,r:0,c:[a]}}},{cN:"section",b:/^[\w]+:\s*$/},{cN:"meta",b:/^\.PHONY:/,e:/$/,k:{"meta-keyword":".PHONY"},l:/[\.\w]+/},{b:/^\t+/,e:/$/,r:0,c:[e.QSM,a]}]}});hljs.registerLanguage("fortran",function(e){var t={cN:"params",b:"\\(",e:"\\)"},n={literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"};return{cI:!0,aliases:["f90","f95"],k:n,i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,t]},e.C("!","$",{r:0}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("typescript",function(e){var r={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void"};return{aliases:["ts"],k:r,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:r,c:["self",e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/\[|%/,r:0},{bK:"constructor",e:/\{/,eE:!0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0}]}});hljs.registerLanguage("lisp",function(b){var e="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",c="\\|[^]*?\\|",r="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",a={cN:"meta",b:"^#!",e:"$"},l={cN:"literal",b:"\\b(t{1}|nil)\\b"},n={cN:"number",v:[{b:r,r:0},{b:"#(b|B)[0-1]+(/[0-1]+)?"},{b:"#(o|O)[0-7]+(/[0-7]+)?"},{b:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{b:"#(c|C)\\("+r+" +"+r,e:"\\)"}]},i=b.inherit(b.QSM,{i:null}),t=b.C(";","$",{r:0}),s={b:"\\*",e:"\\*"},u={cN:"symbol",b:"[:&]"+e},d={b:e,r:0},f={b:c},m={b:"\\(",e:"\\)",c:["self",l,i,n,d]},o={c:[n,i,s,u,m,d],v:[{b:"['`]\\(",e:"\\)"},{b:"\\(quote ",e:"\\)",k:{name:"quote"}},{b:"'"+c}]},v={v:[{b:"'"+e},{b:"#'"+e+"(::"+e+")*"}]},N={b:"\\(\\s*",e:"\\)"},A={eW:!0,r:0};return N.c=[{cN:"name",v:[{b:e},{b:c}]},A],A.c=[o,v,N,l,n,i,t,s,u,f,d],{i:/\S/,c:[n,a,l,i,t,o,v,N,d]}});hljs.registerLanguage("autoit",function(e){var t="ByRef Case Const ContinueCase ContinueLoop Default Dim Do Else ElseIf EndFunc EndIf EndSelect EndSwitch EndWith Enum Exit ExitLoop For Func Global If In Local Next ReDim Return Select Static Step Switch Then To Until Volatile WEnd While With",r="True False And Null Not Or",i="Abs ACos AdlibRegister AdlibUnRegister Asc AscW ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle Beep Binary BinaryLen BinaryMid BinaryToString BitAND BitNOT BitOR BitRotate BitShift BitXOR BlockInput Break Call CDTray Ceiling Chr ChrW ClipGet ClipPut ConsoleRead ConsoleWrite ConsoleWriteError ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow ControlTreeView Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllCallAddress DllCallbackFree DllCallbackGetPtr DllCallbackRegister DllClose DllOpen DllStructCreate DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Execute Exp FileChangeDir FileClose FileCopy FileCreateNTFSLink FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileFlush FileGetAttrib FileGetEncoding FileGetLongName FileGetPos FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileReadToArray FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetEnd FileSetPos FileSetTime FileWrite FileWriteLine Floor FtpSetProxy FuncName GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetHandle GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlRegisterListViewSort GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetDefBkColor GUICtrlSetDefColor GUICtrlSetFont GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUIGetStyle GUIRegisterMsg GUISetAccelerators GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUISetStyle GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy HttpSetUserAgent HWnd InetClose InetGet InetGetInfo InetGetSize InetRead IniDelete IniRead IniReadSection IniReadSectionNames IniRenameSection IniWrite IniWriteSection InputBox Int IsAdmin IsArray IsBinary IsBool IsDeclared IsDllStruct IsFloat IsFunc IsHWnd IsInt IsKeyword IsNumber IsObj IsPtr IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number ObjCreate ObjCreateInterface ObjEvent ObjGet ObjName OnAutoItExitRegister OnAutoItExitUnRegister Opt Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessGetStats ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Ptr Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAs RunAsWait RunWait Send SendKeepActive SetError SetExtended ShellExecute ShellExecuteWait Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt SRandom StatusbarGetText StderrRead StdinWrite StdioClose StdoutRead String StringAddCR StringCompare StringFormat StringFromASCIIArray StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringRegExp StringRegExpReplace StringReplace StringReverse StringRight StringSplit StringStripCR StringStripWS StringToASCIIArray StringToBinary StringTrimLeft StringTrimRight StringUpper Tan TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIP TCPRecv TCPSend TCPShutdown TCPStartup TimerDiff TimerInit ToolTip TrayCreateItem TrayCreateMenu TrayGetMsg TrayItemDelete TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent TrayItemSetState TrayItemSetText TraySetClick TraySetIcon TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip UBound UDPBind UDPCloseSocket UDPOpen UDPRecv UDPSend UDPShutdown UDPStartup VarGetType WinActivate WinActive WinClose WinExists WinFlash WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait WinWaitActive WinWaitClose WinWaitNotActive Array1DToHistogram ArrayAdd ArrayBinarySearch ArrayColDelete ArrayColInsert ArrayCombinations ArrayConcatenate ArrayDelete ArrayDisplay ArrayExtract ArrayFindAll ArrayInsert ArrayMax ArrayMaxIndex ArrayMin ArrayMinIndex ArrayPermute ArrayPop ArrayPush ArrayReverse ArraySearch ArrayShuffle ArraySort ArraySwap ArrayToClip ArrayToString ArrayTranspose ArrayTrim ArrayUnique Assert ChooseColor ChooseFont ClipBoard_ChangeChain ClipBoard_Close ClipBoard_CountFormats ClipBoard_Empty ClipBoard_EnumFormats ClipBoard_FormatStr ClipBoard_GetData ClipBoard_GetDataEx ClipBoard_GetFormatName ClipBoard_GetOpenWindow ClipBoard_GetOwner ClipBoard_GetPriorityFormat ClipBoard_GetSequenceNumber ClipBoard_GetViewer ClipBoard_IsFormatAvailable ClipBoard_Open ClipBoard_RegisterFormat ClipBoard_SetData ClipBoard_SetDataEx ClipBoard_SetViewer ClipPutFile ColorConvertHSLtoRGB ColorConvertRGBtoHSL ColorGetBlue ColorGetCOLORREF ColorGetGreen ColorGetRed ColorGetRGB ColorSetCOLORREF ColorSetRGB Crypt_DecryptData Crypt_DecryptFile Crypt_DeriveKey Crypt_DestroyKey Crypt_EncryptData Crypt_EncryptFile Crypt_GenRandom Crypt_HashData Crypt_HashFile Crypt_Shutdown Crypt_Startup DateAdd DateDayOfWeek DateDaysInMonth DateDiff DateIsLeapYear DateIsValid DateTimeFormat DateTimeSplit DateToDayOfWeek DateToDayOfWeekISO DateToDayValue DateToMonth Date_Time_CompareFileTime Date_Time_DOSDateTimeToArray Date_Time_DOSDateTimeToFileTime Date_Time_DOSDateTimeToStr Date_Time_DOSDateToArray Date_Time_DOSDateToStr Date_Time_DOSTimeToArray Date_Time_DOSTimeToStr Date_Time_EncodeFileTime Date_Time_EncodeSystemTime Date_Time_FileTimeToArray Date_Time_FileTimeToDOSDateTime Date_Time_FileTimeToLocalFileTime Date_Time_FileTimeToStr Date_Time_FileTimeToSystemTime Date_Time_GetFileTime Date_Time_GetLocalTime Date_Time_GetSystemTime Date_Time_GetSystemTimeAdjustment Date_Time_GetSystemTimeAsFileTime Date_Time_GetSystemTimes Date_Time_GetTickCount Date_Time_GetTimeZoneInformation Date_Time_LocalFileTimeToFileTime Date_Time_SetFileTime Date_Time_SetLocalTime Date_Time_SetSystemTime Date_Time_SetSystemTimeAdjustment Date_Time_SetTimeZoneInformation Date_Time_SystemTimeToArray Date_Time_SystemTimeToDateStr Date_Time_SystemTimeToDateTimeStr Date_Time_SystemTimeToFileTime Date_Time_SystemTimeToTimeStr Date_Time_SystemTimeToTzSpecificLocalTime Date_Time_TzSpecificLocalTimeToSystemTime DayValueToDate DebugBugReportEnv DebugCOMError DebugOut DebugReport DebugReportEx DebugReportVar DebugSetup Degree EventLog__Backup EventLog__Clear EventLog__Close EventLog__Count EventLog__DeregisterSource EventLog__Full EventLog__Notify EventLog__Oldest EventLog__Open EventLog__OpenBackup EventLog__Read EventLog__RegisterSource EventLog__Report Excel_BookAttach Excel_BookClose Excel_BookList Excel_BookNew Excel_BookOpen Excel_BookOpenText Excel_BookSave Excel_BookSaveAs Excel_Close Excel_ColumnToLetter Excel_ColumnToNumber Excel_ConvertFormula Excel_Export Excel_FilterGet Excel_FilterSet Excel_Open Excel_PictureAdd Excel_Print Excel_RangeCopyPaste Excel_RangeDelete Excel_RangeFind Excel_RangeInsert Excel_RangeLinkAddRemove Excel_RangeRead Excel_RangeReplace Excel_RangeSort Excel_RangeValidate Excel_RangeWrite Excel_SheetAdd Excel_SheetCopyMove Excel_SheetDelete Excel_SheetList FileCountLines FileCreate FileListToArray FileListToArrayRec FilePrint FileReadToArray FileWriteFromArray FileWriteLog FileWriteToLine FTP_Close FTP_Command FTP_Connect FTP_DecodeInternetStatus FTP_DirCreate FTP_DirDelete FTP_DirGetCurrent FTP_DirPutContents FTP_DirSetCurrent FTP_FileClose FTP_FileDelete FTP_FileGet FTP_FileGetSize FTP_FileOpen FTP_FilePut FTP_FileRead FTP_FileRename FTP_FileTimeLoHiToStr FTP_FindFileClose FTP_FindFileFirst FTP_FindFileNext FTP_GetLastResponseInfo FTP_ListToArray FTP_ListToArray2D FTP_ListToArrayEx FTP_Open FTP_ProgressDownload FTP_ProgressUpload FTP_SetStatusCallback GDIPlus_ArrowCapCreate GDIPlus_ArrowCapDispose GDIPlus_ArrowCapGetFillState GDIPlus_ArrowCapGetHeight GDIPlus_ArrowCapGetMiddleInset GDIPlus_ArrowCapGetWidth GDIPlus_ArrowCapSetFillState GDIPlus_ArrowCapSetHeight GDIPlus_ArrowCapSetMiddleInset GDIPlus_ArrowCapSetWidth GDIPlus_BitmapApplyEffect GDIPlus_BitmapApplyEffectEx GDIPlus_BitmapCloneArea GDIPlus_BitmapConvertFormat GDIPlus_BitmapCreateApplyEffect GDIPlus_BitmapCreateApplyEffectEx GDIPlus_BitmapCreateDIBFromBitmap GDIPlus_BitmapCreateFromFile GDIPlus_BitmapCreateFromGraphics GDIPlus_BitmapCreateFromHBITMAP GDIPlus_BitmapCreateFromHICON GDIPlus_BitmapCreateFromHICON32 GDIPlus_BitmapCreateFromMemory GDIPlus_BitmapCreateFromResource GDIPlus_BitmapCreateFromScan0 GDIPlus_BitmapCreateFromStream GDIPlus_BitmapCreateHBITMAPFromBitmap GDIPlus_BitmapDispose GDIPlus_BitmapGetHistogram GDIPlus_BitmapGetHistogramEx GDIPlus_BitmapGetHistogramSize GDIPlus_BitmapGetPixel GDIPlus_BitmapLockBits GDIPlus_BitmapSetPixel GDIPlus_BitmapUnlockBits GDIPlus_BrushClone GDIPlus_BrushCreateSolid GDIPlus_BrushDispose GDIPlus_BrushGetSolidColor GDIPlus_BrushGetType GDIPlus_BrushSetSolidColor GDIPlus_ColorMatrixCreate GDIPlus_ColorMatrixCreateGrayScale GDIPlus_ColorMatrixCreateNegative GDIPlus_ColorMatrixCreateSaturation GDIPlus_ColorMatrixCreateScale GDIPlus_ColorMatrixCreateTranslate GDIPlus_CustomLineCapClone GDIPlus_CustomLineCapCreate GDIPlus_CustomLineCapDispose GDIPlus_CustomLineCapGetStrokeCaps GDIPlus_CustomLineCapSetStrokeCaps GDIPlus_Decoders GDIPlus_DecodersGetCount GDIPlus_DecodersGetSize GDIPlus_DrawImageFX GDIPlus_DrawImageFXEx GDIPlus_DrawImagePoints GDIPlus_EffectCreate GDIPlus_EffectCreateBlur GDIPlus_EffectCreateBrightnessContrast GDIPlus_EffectCreateColorBalance GDIPlus_EffectCreateColorCurve GDIPlus_EffectCreateColorLUT GDIPlus_EffectCreateColorMatrix GDIPlus_EffectCreateHueSaturationLightness GDIPlus_EffectCreateLevels GDIPlus_EffectCreateRedEyeCorrection GDIPlus_EffectCreateSharpen GDIPlus_EffectCreateTint GDIPlus_EffectDispose GDIPlus_EffectGetParameters GDIPlus_EffectSetParameters GDIPlus_Encoders GDIPlus_EncodersGetCLSID GDIPlus_EncodersGetCount GDIPlus_EncodersGetParamList GDIPlus_EncodersGetParamListSize GDIPlus_EncodersGetSize GDIPlus_FontCreate GDIPlus_FontDispose GDIPlus_FontFamilyCreate GDIPlus_FontFamilyCreateFromCollection GDIPlus_FontFamilyDispose GDIPlus_FontFamilyGetCellAscent GDIPlus_FontFamilyGetCellDescent GDIPlus_FontFamilyGetEmHeight GDIPlus_FontFamilyGetLineSpacing GDIPlus_FontGetHeight GDIPlus_FontPrivateAddFont GDIPlus_FontPrivateAddMemoryFont GDIPlus_FontPrivateCollectionDispose GDIPlus_FontPrivateCreateCollection GDIPlus_GraphicsClear GDIPlus_GraphicsCreateFromHDC GDIPlus_GraphicsCreateFromHWND GDIPlus_GraphicsDispose GDIPlus_GraphicsDrawArc GDIPlus_GraphicsDrawBezier GDIPlus_GraphicsDrawClosedCurve GDIPlus_GraphicsDrawClosedCurve2 GDIPlus_GraphicsDrawCurve GDIPlus_GraphicsDrawCurve2 GDIPlus_GraphicsDrawEllipse GDIPlus_GraphicsDrawImage GDIPlus_GraphicsDrawImagePointsRect GDIPlus_GraphicsDrawImageRect GDIPlus_GraphicsDrawImageRectRect GDIPlus_GraphicsDrawLine GDIPlus_GraphicsDrawPath GDIPlus_GraphicsDrawPie GDIPlus_GraphicsDrawPolygon GDIPlus_GraphicsDrawRect GDIPlus_GraphicsDrawString GDIPlus_GraphicsDrawStringEx GDIPlus_GraphicsFillClosedCurve GDIPlus_GraphicsFillClosedCurve2 GDIPlus_GraphicsFillEllipse GDIPlus_GraphicsFillPath GDIPlus_GraphicsFillPie GDIPlus_GraphicsFillPolygon GDIPlus_GraphicsFillRect GDIPlus_GraphicsFillRegion GDIPlus_GraphicsGetCompositingMode GDIPlus_GraphicsGetCompositingQuality GDIPlus_GraphicsGetDC GDIPlus_GraphicsGetInterpolationMode GDIPlus_GraphicsGetSmoothingMode GDIPlus_GraphicsGetTransform GDIPlus_GraphicsMeasureCharacterRanges GDIPlus_GraphicsMeasureString GDIPlus_GraphicsReleaseDC GDIPlus_GraphicsResetClip GDIPlus_GraphicsResetTransform GDIPlus_GraphicsRestore GDIPlus_GraphicsRotateTransform GDIPlus_GraphicsSave GDIPlus_GraphicsScaleTransform GDIPlus_GraphicsSetClipPath GDIPlus_GraphicsSetClipRect GDIPlus_GraphicsSetClipRegion GDIPlus_GraphicsSetCompositingMode GDIPlus_GraphicsSetCompositingQuality GDIPlus_GraphicsSetInterpolationMode GDIPlus_GraphicsSetPixelOffsetMode GDIPlus_GraphicsSetSmoothingMode GDIPlus_GraphicsSetTextRenderingHint GDIPlus_GraphicsSetTransform GDIPlus_GraphicsTransformPoints GDIPlus_GraphicsTranslateTransform GDIPlus_HatchBrushCreate GDIPlus_HICONCreateFromBitmap GDIPlus_ImageAttributesCreate GDIPlus_ImageAttributesDispose GDIPlus_ImageAttributesSetColorKeys GDIPlus_ImageAttributesSetColorMatrix GDIPlus_ImageDispose GDIPlus_ImageGetDimension GDIPlus_ImageGetFlags GDIPlus_ImageGetGraphicsContext GDIPlus_ImageGetHeight GDIPlus_ImageGetHorizontalResolution GDIPlus_ImageGetPixelFormat GDIPlus_ImageGetRawFormat GDIPlus_ImageGetThumbnail GDIPlus_ImageGetType GDIPlus_ImageGetVerticalResolution GDIPlus_ImageGetWidth GDIPlus_ImageLoadFromFile GDIPlus_ImageLoadFromStream GDIPlus_ImageResize GDIPlus_ImageRotateFlip GDIPlus_ImageSaveToFile GDIPlus_ImageSaveToFileEx GDIPlus_ImageSaveToStream GDIPlus_ImageScale GDIPlus_LineBrushCreate GDIPlus_LineBrushCreateFromRect GDIPlus_LineBrushCreateFromRectWithAngle GDIPlus_LineBrushGetColors GDIPlus_LineBrushGetRect GDIPlus_LineBrushMultiplyTransform GDIPlus_LineBrushResetTransform GDIPlus_LineBrushSetBlend GDIPlus_LineBrushSetColors GDIPlus_LineBrushSetGammaCorrection GDIPlus_LineBrushSetLinearBlend GDIPlus_LineBrushSetPresetBlend GDIPlus_LineBrushSetSigmaBlend GDIPlus_LineBrushSetTransform GDIPlus_MatrixClone GDIPlus_MatrixCreate GDIPlus_MatrixDispose GDIPlus_MatrixGetElements GDIPlus_MatrixInvert GDIPlus_MatrixMultiply GDIPlus_MatrixRotate GDIPlus_MatrixScale GDIPlus_MatrixSetElements GDIPlus_MatrixShear GDIPlus_MatrixTransformPoints GDIPlus_MatrixTranslate GDIPlus_PaletteInitialize GDIPlus_ParamAdd GDIPlus_ParamInit GDIPlus_ParamSize GDIPlus_PathAddArc GDIPlus_PathAddBezier GDIPlus_PathAddClosedCurve GDIPlus_PathAddClosedCurve2 GDIPlus_PathAddCurve GDIPlus_PathAddCurve2 GDIPlus_PathAddCurve3 GDIPlus_PathAddEllipse GDIPlus_PathAddLine GDIPlus_PathAddLine2 GDIPlus_PathAddPath GDIPlus_PathAddPie GDIPlus_PathAddPolygon GDIPlus_PathAddRectangle GDIPlus_PathAddString GDIPlus_PathBrushCreate GDIPlus_PathBrushCreateFromPath GDIPlus_PathBrushGetCenterPoint GDIPlus_PathBrushGetFocusScales GDIPlus_PathBrushGetPointCount GDIPlus_PathBrushGetRect GDIPlus_PathBrushGetWrapMode GDIPlus_PathBrushMultiplyTransform GDIPlus_PathBrushResetTransform GDIPlus_PathBrushSetBlend GDIPlus_PathBrushSetCenterColor GDIPlus_PathBrushSetCenterPoint GDIPlus_PathBrushSetFocusScales GDIPlus_PathBrushSetGammaCorrection GDIPlus_PathBrushSetLinearBlend GDIPlus_PathBrushSetPresetBlend GDIPlus_PathBrushSetSigmaBlend GDIPlus_PathBrushSetSurroundColor GDIPlus_PathBrushSetSurroundColorsWithCount GDIPlus_PathBrushSetTransform GDIPlus_PathBrushSetWrapMode GDIPlus_PathClone GDIPlus_PathCloseFigure GDIPlus_PathCreate GDIPlus_PathCreate2 GDIPlus_PathDispose GDIPlus_PathFlatten GDIPlus_PathGetData GDIPlus_PathGetFillMode GDIPlus_PathGetLastPoint GDIPlus_PathGetPointCount GDIPlus_PathGetPoints GDIPlus_PathGetWorldBounds GDIPlus_PathIsOutlineVisiblePoint GDIPlus_PathIsVisiblePoint GDIPlus_PathIterCreate GDIPlus_PathIterDispose GDIPlus_PathIterGetSubpathCount GDIPlus_PathIterNextMarkerPath GDIPlus_PathIterNextSubpathPath GDIPlus_PathIterRewind GDIPlus_PathReset GDIPlus_PathReverse GDIPlus_PathSetFillMode GDIPlus_PathSetMarker GDIPlus_PathStartFigure GDIPlus_PathTransform GDIPlus_PathWarp GDIPlus_PathWiden GDIPlus_PathWindingModeOutline GDIPlus_PenCreate GDIPlus_PenCreate2 GDIPlus_PenDispose GDIPlus_PenGetAlignment GDIPlus_PenGetColor GDIPlus_PenGetCustomEndCap GDIPlus_PenGetDashCap GDIPlus_PenGetDashStyle GDIPlus_PenGetEndCap GDIPlus_PenGetMiterLimit GDIPlus_PenGetWidth GDIPlus_PenSetAlignment GDIPlus_PenSetColor GDIPlus_PenSetCustomEndCap GDIPlus_PenSetDashCap GDIPlus_PenSetDashStyle GDIPlus_PenSetEndCap GDIPlus_PenSetLineCap GDIPlus_PenSetLineJoin GDIPlus_PenSetMiterLimit GDIPlus_PenSetStartCap GDIPlus_PenSetWidth GDIPlus_RectFCreate GDIPlus_RegionClone GDIPlus_RegionCombinePath GDIPlus_RegionCombineRect GDIPlus_RegionCombineRegion GDIPlus_RegionCreate GDIPlus_RegionCreateFromPath GDIPlus_RegionCreateFromRect GDIPlus_RegionDispose GDIPlus_RegionGetBounds GDIPlus_RegionGetHRgn GDIPlus_RegionTransform GDIPlus_RegionTranslate GDIPlus_Shutdown GDIPlus_Startup GDIPlus_StringFormatCreate GDIPlus_StringFormatDispose GDIPlus_StringFormatGetMeasurableCharacterRangeCount GDIPlus_StringFormatSetAlign GDIPlus_StringFormatSetLineAlign GDIPlus_StringFormatSetMeasurableCharacterRanges GDIPlus_TextureCreate GDIPlus_TextureCreate2 GDIPlus_TextureCreateIA GetIP GUICtrlAVI_Close GUICtrlAVI_Create GUICtrlAVI_Destroy GUICtrlAVI_IsPlaying GUICtrlAVI_Open GUICtrlAVI_OpenEx GUICtrlAVI_Play GUICtrlAVI_Seek GUICtrlAVI_Show GUICtrlAVI_Stop GUICtrlButton_Click GUICtrlButton_Create GUICtrlButton_Destroy GUICtrlButton_Enable GUICtrlButton_GetCheck GUICtrlButton_GetFocus GUICtrlButton_GetIdealSize GUICtrlButton_GetImage GUICtrlButton_GetImageList GUICtrlButton_GetNote GUICtrlButton_GetNoteLength GUICtrlButton_GetSplitInfo GUICtrlButton_GetState GUICtrlButton_GetText GUICtrlButton_GetTextMargin GUICtrlButton_SetCheck GUICtrlButton_SetDontClick GUICtrlButton_SetFocus GUICtrlButton_SetImage GUICtrlButton_SetImageList GUICtrlButton_SetNote GUICtrlButton_SetShield GUICtrlButton_SetSize GUICtrlButton_SetSplitInfo GUICtrlButton_SetState GUICtrlButton_SetStyle GUICtrlButton_SetText GUICtrlButton_SetTextMargin GUICtrlButton_Show GUICtrlComboBoxEx_AddDir GUICtrlComboBoxEx_AddString GUICtrlComboBoxEx_BeginUpdate GUICtrlComboBoxEx_Create GUICtrlComboBoxEx_CreateSolidBitMap GUICtrlComboBoxEx_DeleteString GUICtrlComboBoxEx_Destroy GUICtrlComboBoxEx_EndUpdate GUICtrlComboBoxEx_FindStringExact GUICtrlComboBoxEx_GetComboBoxInfo GUICtrlComboBoxEx_GetComboControl GUICtrlComboBoxEx_GetCount GUICtrlComboBoxEx_GetCurSel GUICtrlComboBoxEx_GetDroppedControlRect GUICtrlComboBoxEx_GetDroppedControlRectEx GUICtrlComboBoxEx_GetDroppedState GUICtrlComboBoxEx_GetDroppedWidth GUICtrlComboBoxEx_GetEditControl GUICtrlComboBoxEx_GetEditSel GUICtrlComboBoxEx_GetEditText GUICtrlComboBoxEx_GetExtendedStyle GUICtrlComboBoxEx_GetExtendedUI GUICtrlComboBoxEx_GetImageList GUICtrlComboBoxEx_GetItem GUICtrlComboBoxEx_GetItemEx GUICtrlComboBoxEx_GetItemHeight GUICtrlComboBoxEx_GetItemImage GUICtrlComboBoxEx_GetItemIndent GUICtrlComboBoxEx_GetItemOverlayImage GUICtrlComboBoxEx_GetItemParam GUICtrlComboBoxEx_GetItemSelectedImage GUICtrlComboBoxEx_GetItemText GUICtrlComboBoxEx_GetItemTextLen GUICtrlComboBoxEx_GetList GUICtrlComboBoxEx_GetListArray GUICtrlComboBoxEx_GetLocale GUICtrlComboBoxEx_GetLocaleCountry GUICtrlComboBoxEx_GetLocaleLang GUICtrlComboBoxEx_GetLocalePrimLang GUICtrlComboBoxEx_GetLocaleSubLang GUICtrlComboBoxEx_GetMinVisible GUICtrlComboBoxEx_GetTopIndex GUICtrlComboBoxEx_GetUnicode GUICtrlComboBoxEx_InitStorage GUICtrlComboBoxEx_InsertString GUICtrlComboBoxEx_LimitText GUICtrlComboBoxEx_ReplaceEditSel GUICtrlComboBoxEx_ResetContent GUICtrlComboBoxEx_SetCurSel GUICtrlComboBoxEx_SetDroppedWidth GUICtrlComboBoxEx_SetEditSel GUICtrlComboBoxEx_SetEditText GUICtrlComboBoxEx_SetExtendedStyle GUICtrlComboBoxEx_SetExtendedUI GUICtrlComboBoxEx_SetImageList GUICtrlComboBoxEx_SetItem GUICtrlComboBoxEx_SetItemEx GUICtrlComboBoxEx_SetItemHeight GUICtrlComboBoxEx_SetItemImage GUICtrlComboBoxEx_SetItemIndent GUICtrlComboBoxEx_SetItemOverlayImage GUICtrlComboBoxEx_SetItemParam GUICtrlComboBoxEx_SetItemSelectedImage GUICtrlComboBoxEx_SetMinVisible GUICtrlComboBoxEx_SetTopIndex GUICtrlComboBoxEx_SetUnicode GUICtrlComboBoxEx_ShowDropDown GUICtrlComboBox_AddDir GUICtrlComboBox_AddString GUICtrlComboBox_AutoComplete GUICtrlComboBox_BeginUpdate GUICtrlComboBox_Create GUICtrlComboBox_DeleteString GUICtrlComboBox_Destroy GUICtrlComboBox_EndUpdate GUICtrlComboBox_FindString GUICtrlComboBox_FindStringExact GUICtrlComboBox_GetComboBoxInfo GUICtrlComboBox_GetCount GUICtrlComboBox_GetCueBanner GUICtrlComboBox_GetCurSel GUICtrlComboBox_GetDroppedControlRect GUICtrlComboBox_GetDroppedControlRectEx GUICtrlComboBox_GetDroppedState GUICtrlComboBox_GetDroppedWidth GUICtrlComboBox_GetEditSel GUICtrlComboBox_GetEditText GUICtrlComboBox_GetExtendedUI GUICtrlComboBox_GetHorizontalExtent GUICtrlComboBox_GetItemHeight GUICtrlComboBox_GetLBText GUICtrlComboBox_GetLBTextLen GUICtrlComboBox_GetList GUICtrlComboBox_GetListArray GUICtrlComboBox_GetLocale GUICtrlComboBox_GetLocaleCountry GUICtrlComboBox_GetLocaleLang GUICtrlComboBox_GetLocalePrimLang GUICtrlComboBox_GetLocaleSubLang GUICtrlComboBox_GetMinVisible GUICtrlComboBox_GetTopIndex GUICtrlComboBox_InitStorage GUICtrlComboBox_InsertString GUICtrlComboBox_LimitText GUICtrlComboBox_ReplaceEditSel GUICtrlComboBox_ResetContent GUICtrlComboBox_SelectString GUICtrlComboBox_SetCueBanner GUICtrlComboBox_SetCurSel GUICtrlComboBox_SetDroppedWidth GUICtrlComboBox_SetEditSel GUICtrlComboBox_SetEditText GUICtrlComboBox_SetExtendedUI GUICtrlComboBox_SetHorizontalExtent GUICtrlComboBox_SetItemHeight GUICtrlComboBox_SetMinVisible GUICtrlComboBox_SetTopIndex GUICtrlComboBox_ShowDropDown GUICtrlDTP_Create GUICtrlDTP_Destroy GUICtrlDTP_GetMCColor GUICtrlDTP_GetMCFont GUICtrlDTP_GetMonthCal GUICtrlDTP_GetRange GUICtrlDTP_GetRangeEx GUICtrlDTP_GetSystemTime GUICtrlDTP_GetSystemTimeEx GUICtrlDTP_SetFormat GUICtrlDTP_SetMCColor GUICtrlDTP_SetMCFont GUICtrlDTP_SetRange GUICtrlDTP_SetRangeEx GUICtrlDTP_SetSystemTime GUICtrlDTP_SetSystemTimeEx GUICtrlEdit_AppendText GUICtrlEdit_BeginUpdate GUICtrlEdit_CanUndo GUICtrlEdit_CharFromPos GUICtrlEdit_Create GUICtrlEdit_Destroy GUICtrlEdit_EmptyUndoBuffer GUICtrlEdit_EndUpdate GUICtrlEdit_Find GUICtrlEdit_FmtLines GUICtrlEdit_GetCueBanner GUICtrlEdit_GetFirstVisibleLine GUICtrlEdit_GetLimitText GUICtrlEdit_GetLine GUICtrlEdit_GetLineCount GUICtrlEdit_GetMargins GUICtrlEdit_GetModify GUICtrlEdit_GetPasswordChar GUICtrlEdit_GetRECT GUICtrlEdit_GetRECTEx GUICtrlEdit_GetSel GUICtrlEdit_GetText GUICtrlEdit_GetTextLen GUICtrlEdit_HideBalloonTip GUICtrlEdit_InsertText GUICtrlEdit_LineFromChar GUICtrlEdit_LineIndex GUICtrlEdit_LineLength GUICtrlEdit_LineScroll GUICtrlEdit_PosFromChar GUICtrlEdit_ReplaceSel GUICtrlEdit_Scroll GUICtrlEdit_SetCueBanner GUICtrlEdit_SetLimitText GUICtrlEdit_SetMargins GUICtrlEdit_SetModify GUICtrlEdit_SetPasswordChar GUICtrlEdit_SetReadOnly GUICtrlEdit_SetRECT GUICtrlEdit_SetRECTEx GUICtrlEdit_SetRECTNP GUICtrlEdit_SetRectNPEx GUICtrlEdit_SetSel GUICtrlEdit_SetTabStops GUICtrlEdit_SetText GUICtrlEdit_ShowBalloonTip GUICtrlEdit_Undo GUICtrlHeader_AddItem GUICtrlHeader_ClearFilter GUICtrlHeader_ClearFilterAll GUICtrlHeader_Create GUICtrlHeader_CreateDragImage GUICtrlHeader_DeleteItem GUICtrlHeader_Destroy GUICtrlHeader_EditFilter GUICtrlHeader_GetBitmapMargin GUICtrlHeader_GetImageList GUICtrlHeader_GetItem GUICtrlHeader_GetItemAlign GUICtrlHeader_GetItemBitmap GUICtrlHeader_GetItemCount GUICtrlHeader_GetItemDisplay GUICtrlHeader_GetItemFlags GUICtrlHeader_GetItemFormat GUICtrlHeader_GetItemImage GUICtrlHeader_GetItemOrder GUICtrlHeader_GetItemParam GUICtrlHeader_GetItemRect GUICtrlHeader_GetItemRectEx GUICtrlHeader_GetItemText GUICtrlHeader_GetItemWidth GUICtrlHeader_GetOrderArray GUICtrlHeader_GetUnicodeFormat GUICtrlHeader_HitTest GUICtrlHeader_InsertItem GUICtrlHeader_Layout GUICtrlHeader_OrderToIndex GUICtrlHeader_SetBitmapMargin GUICtrlHeader_SetFilterChangeTimeout GUICtrlHeader_SetHotDivider GUICtrlHeader_SetImageList GUICtrlHeader_SetItem GUICtrlHeader_SetItemAlign GUICtrlHeader_SetItemBitmap GUICtrlHeader_SetItemDisplay GUICtrlHeader_SetItemFlags GUICtrlHeader_SetItemFormat GUICtrlHeader_SetItemImage GUICtrlHeader_SetItemOrder GUICtrlHeader_SetItemParam GUICtrlHeader_SetItemText GUICtrlHeader_SetItemWidth GUICtrlHeader_SetOrderArray GUICtrlHeader_SetUnicodeFormat GUICtrlIpAddress_ClearAddress GUICtrlIpAddress_Create GUICtrlIpAddress_Destroy GUICtrlIpAddress_Get GUICtrlIpAddress_GetArray GUICtrlIpAddress_GetEx GUICtrlIpAddress_IsBlank GUICtrlIpAddress_Set GUICtrlIpAddress_SetArray GUICtrlIpAddress_SetEx GUICtrlIpAddress_SetFocus GUICtrlIpAddress_SetFont GUICtrlIpAddress_SetRange GUICtrlIpAddress_ShowHide GUICtrlListBox_AddFile GUICtrlListBox_AddString GUICtrlListBox_BeginUpdate GUICtrlListBox_ClickItem GUICtrlListBox_Create GUICtrlListBox_DeleteString GUICtrlListBox_Destroy GUICtrlListBox_Dir GUICtrlListBox_EndUpdate GUICtrlListBox_FindInText GUICtrlListBox_FindString GUICtrlListBox_GetAnchorIndex GUICtrlListBox_GetCaretIndex GUICtrlListBox_GetCount GUICtrlListBox_GetCurSel GUICtrlListBox_GetHorizontalExtent GUICtrlListBox_GetItemData GUICtrlListBox_GetItemHeight GUICtrlListBox_GetItemRect GUICtrlListBox_GetItemRectEx GUICtrlListBox_GetListBoxInfo GUICtrlListBox_GetLocale GUICtrlListBox_GetLocaleCountry GUICtrlListBox_GetLocaleLang GUICtrlListBox_GetLocalePrimLang GUICtrlListBox_GetLocaleSubLang GUICtrlListBox_GetSel GUICtrlListBox_GetSelCount GUICtrlListBox_GetSelItems GUICtrlListBox_GetSelItemsText GUICtrlListBox_GetText GUICtrlListBox_GetTextLen GUICtrlListBox_GetTopIndex GUICtrlListBox_InitStorage GUICtrlListBox_InsertString GUICtrlListBox_ItemFromPoint GUICtrlListBox_ReplaceString GUICtrlListBox_ResetContent GUICtrlListBox_SelectString GUICtrlListBox_SelItemRange GUICtrlListBox_SelItemRangeEx GUICtrlListBox_SetAnchorIndex GUICtrlListBox_SetCaretIndex GUICtrlListBox_SetColumnWidth GUICtrlListBox_SetCurSel GUICtrlListBox_SetHorizontalExtent GUICtrlListBox_SetItemData GUICtrlListBox_SetItemHeight GUICtrlListBox_SetLocale GUICtrlListBox_SetSel GUICtrlListBox_SetTabStops GUICtrlListBox_SetTopIndex GUICtrlListBox_Sort GUICtrlListBox_SwapString GUICtrlListBox_UpdateHScroll GUICtrlListView_AddArray GUICtrlListView_AddColumn GUICtrlListView_AddItem GUICtrlListView_AddSubItem GUICtrlListView_ApproximateViewHeight GUICtrlListView_ApproximateViewRect GUICtrlListView_ApproximateViewWidth GUICtrlListView_Arrange GUICtrlListView_BeginUpdate GUICtrlListView_CancelEditLabel GUICtrlListView_ClickItem GUICtrlListView_CopyItems GUICtrlListView_Create GUICtrlListView_CreateDragImage GUICtrlListView_CreateSolidBitMap GUICtrlListView_DeleteAllItems GUICtrlListView_DeleteColumn GUICtrlListView_DeleteItem GUICtrlListView_DeleteItemsSelected GUICtrlListView_Destroy GUICtrlListView_DrawDragImage GUICtrlListView_EditLabel GUICtrlListView_EnableGroupView GUICtrlListView_EndUpdate GUICtrlListView_EnsureVisible GUICtrlListView_FindInText GUICtrlListView_FindItem GUICtrlListView_FindNearest GUICtrlListView_FindParam GUICtrlListView_FindText GUICtrlListView_GetBkColor GUICtrlListView_GetBkImage GUICtrlListView_GetCallbackMask GUICtrlListView_GetColumn GUICtrlListView_GetColumnCount GUICtrlListView_GetColumnOrder GUICtrlListView_GetColumnOrderArray GUICtrlListView_GetColumnWidth GUICtrlListView_GetCounterPage GUICtrlListView_GetEditControl GUICtrlListView_GetExtendedListViewStyle GUICtrlListView_GetFocusedGroup GUICtrlListView_GetGroupCount GUICtrlListView_GetGroupInfo GUICtrlListView_GetGroupInfoByIndex GUICtrlListView_GetGroupRect GUICtrlListView_GetGroupViewEnabled GUICtrlListView_GetHeader GUICtrlListView_GetHotCursor GUICtrlListView_GetHotItem GUICtrlListView_GetHoverTime GUICtrlListView_GetImageList GUICtrlListView_GetISearchString GUICtrlListView_GetItem GUICtrlListView_GetItemChecked GUICtrlListView_GetItemCount GUICtrlListView_GetItemCut GUICtrlListView_GetItemDropHilited GUICtrlListView_GetItemEx GUICtrlListView_GetItemFocused GUICtrlListView_GetItemGroupID GUICtrlListView_GetItemImage GUICtrlListView_GetItemIndent GUICtrlListView_GetItemParam GUICtrlListView_GetItemPosition GUICtrlListView_GetItemPositionX GUICtrlListView_GetItemPositionY GUICtrlListView_GetItemRect GUICtrlListView_GetItemRectEx GUICtrlListView_GetItemSelected GUICtrlListView_GetItemSpacing GUICtrlListView_GetItemSpacingX GUICtrlListView_GetItemSpacingY GUICtrlListView_GetItemState GUICtrlListView_GetItemStateImage GUICtrlListView_GetItemText GUICtrlListView_GetItemTextArray GUICtrlListView_GetItemTextString GUICtrlListView_GetNextItem GUICtrlListView_GetNumberOfWorkAreas GUICtrlListView_GetOrigin GUICtrlListView_GetOriginX GUICtrlListView_GetOriginY GUICtrlListView_GetOutlineColor GUICtrlListView_GetSelectedColumn GUICtrlListView_GetSelectedCount GUICtrlListView_GetSelectedIndices GUICtrlListView_GetSelectionMark GUICtrlListView_GetStringWidth GUICtrlListView_GetSubItemRect GUICtrlListView_GetTextBkColor GUICtrlListView_GetTextColor GUICtrlListView_GetToolTips GUICtrlListView_GetTopIndex GUICtrlListView_GetUnicodeFormat GUICtrlListView_GetView GUICtrlListView_GetViewDetails GUICtrlListView_GetViewLarge GUICtrlListView_GetViewList GUICtrlListView_GetViewRect GUICtrlListView_GetViewSmall GUICtrlListView_GetViewTile GUICtrlListView_HideColumn GUICtrlListView_HitTest GUICtrlListView_InsertColumn GUICtrlListView_InsertGroup GUICtrlListView_InsertItem GUICtrlListView_JustifyColumn GUICtrlListView_MapIDToIndex GUICtrlListView_MapIndexToID GUICtrlListView_RedrawItems GUICtrlListView_RegisterSortCallBack GUICtrlListView_RemoveAllGroups GUICtrlListView_RemoveGroup GUICtrlListView_Scroll GUICtrlListView_SetBkColor GUICtrlListView_SetBkImage GUICtrlListView_SetCallBackMask GUICtrlListView_SetColumn GUICtrlListView_SetColumnOrder GUICtrlListView_SetColumnOrderArray GUICtrlListView_SetColumnWidth GUICtrlListView_SetExtendedListViewStyle GUICtrlListView_SetGroupInfo GUICtrlListView_SetHotItem GUICtrlListView_SetHoverTime GUICtrlListView_SetIconSpacing GUICtrlListView_SetImageList GUICtrlListView_SetItem GUICtrlListView_SetItemChecked GUICtrlListView_SetItemCount GUICtrlListView_SetItemCut GUICtrlListView_SetItemDropHilited GUICtrlListView_SetItemEx GUICtrlListView_SetItemFocused GUICtrlListView_SetItemGroupID GUICtrlListView_SetItemImage GUICtrlListView_SetItemIndent GUICtrlListView_SetItemParam GUICtrlListView_SetItemPosition GUICtrlListView_SetItemPosition32 GUICtrlListView_SetItemSelected GUICtrlListView_SetItemState GUICtrlListView_SetItemStateImage GUICtrlListView_SetItemText GUICtrlListView_SetOutlineColor GUICtrlListView_SetSelectedColumn GUICtrlListView_SetSelectionMark GUICtrlListView_SetTextBkColor GUICtrlListView_SetTextColor GUICtrlListView_SetToolTips GUICtrlListView_SetUnicodeFormat GUICtrlListView_SetView GUICtrlListView_SetWorkAreas GUICtrlListView_SimpleSort GUICtrlListView_SortItems GUICtrlListView_SubItemHitTest GUICtrlListView_UnRegisterSortCallBack GUICtrlMenu_AddMenuItem GUICtrlMenu_AppendMenu GUICtrlMenu_CalculatePopupWindowPosition GUICtrlMenu_CheckMenuItem GUICtrlMenu_CheckRadioItem GUICtrlMenu_CreateMenu GUICtrlMenu_CreatePopup GUICtrlMenu_DeleteMenu GUICtrlMenu_DestroyMenu GUICtrlMenu_DrawMenuBar GUICtrlMenu_EnableMenuItem GUICtrlMenu_FindItem GUICtrlMenu_FindParent GUICtrlMenu_GetItemBmp GUICtrlMenu_GetItemBmpChecked GUICtrlMenu_GetItemBmpUnchecked GUICtrlMenu_GetItemChecked GUICtrlMenu_GetItemCount GUICtrlMenu_GetItemData GUICtrlMenu_GetItemDefault GUICtrlMenu_GetItemDisabled GUICtrlMenu_GetItemEnabled GUICtrlMenu_GetItemGrayed GUICtrlMenu_GetItemHighlighted GUICtrlMenu_GetItemID GUICtrlMenu_GetItemInfo GUICtrlMenu_GetItemRect GUICtrlMenu_GetItemRectEx GUICtrlMenu_GetItemState GUICtrlMenu_GetItemStateEx GUICtrlMenu_GetItemSubMenu GUICtrlMenu_GetItemText GUICtrlMenu_GetItemType GUICtrlMenu_GetMenu GUICtrlMenu_GetMenuBackground GUICtrlMenu_GetMenuBarInfo GUICtrlMenu_GetMenuContextHelpID GUICtrlMenu_GetMenuData GUICtrlMenu_GetMenuDefaultItem GUICtrlMenu_GetMenuHeight GUICtrlMenu_GetMenuInfo GUICtrlMenu_GetMenuStyle GUICtrlMenu_GetSystemMenu GUICtrlMenu_InsertMenuItem GUICtrlMenu_InsertMenuItemEx GUICtrlMenu_IsMenu GUICtrlMenu_LoadMenu GUICtrlMenu_MapAccelerator GUICtrlMenu_MenuItemFromPoint GUICtrlMenu_RemoveMenu GUICtrlMenu_SetItemBitmaps GUICtrlMenu_SetItemBmp GUICtrlMenu_SetItemBmpChecked GUICtrlMenu_SetItemBmpUnchecked GUICtrlMenu_SetItemChecked GUICtrlMenu_SetItemData GUICtrlMenu_SetItemDefault GUICtrlMenu_SetItemDisabled GUICtrlMenu_SetItemEnabled GUICtrlMenu_SetItemGrayed GUICtrlMenu_SetItemHighlighted GUICtrlMenu_SetItemID GUICtrlMenu_SetItemInfo GUICtrlMenu_SetItemState GUICtrlMenu_SetItemSubMenu GUICtrlMenu_SetItemText GUICtrlMenu_SetItemType GUICtrlMenu_SetMenu GUICtrlMenu_SetMenuBackground GUICtrlMenu_SetMenuContextHelpID GUICtrlMenu_SetMenuData GUICtrlMenu_SetMenuDefaultItem GUICtrlMenu_SetMenuHeight GUICtrlMenu_SetMenuInfo GUICtrlMenu_SetMenuStyle GUICtrlMenu_TrackPopupMenu GUICtrlMonthCal_Create GUICtrlMonthCal_Destroy GUICtrlMonthCal_GetCalendarBorder GUICtrlMonthCal_GetCalendarCount GUICtrlMonthCal_GetColor GUICtrlMonthCal_GetColorArray GUICtrlMonthCal_GetCurSel GUICtrlMonthCal_GetCurSelStr GUICtrlMonthCal_GetFirstDOW GUICtrlMonthCal_GetFirstDOWStr GUICtrlMonthCal_GetMaxSelCount GUICtrlMonthCal_GetMaxTodayWidth GUICtrlMonthCal_GetMinReqHeight GUICtrlMonthCal_GetMinReqRect GUICtrlMonthCal_GetMinReqRectArray GUICtrlMonthCal_GetMinReqWidth GUICtrlMonthCal_GetMonthDelta GUICtrlMonthCal_GetMonthRange GUICtrlMonthCal_GetMonthRangeMax GUICtrlMonthCal_GetMonthRangeMaxStr GUICtrlMonthCal_GetMonthRangeMin GUICtrlMonthCal_GetMonthRangeMinStr GUICtrlMonthCal_GetMonthRangeSpan GUICtrlMonthCal_GetRange GUICtrlMonthCal_GetRangeMax GUICtrlMonthCal_GetRangeMaxStr GUICtrlMonthCal_GetRangeMin GUICtrlMonthCal_GetRangeMinStr GUICtrlMonthCal_GetSelRange GUICtrlMonthCal_GetSelRangeMax GUICtrlMonthCal_GetSelRangeMaxStr GUICtrlMonthCal_GetSelRangeMin GUICtrlMonthCal_GetSelRangeMinStr GUICtrlMonthCal_GetToday GUICtrlMonthCal_GetTodayStr GUICtrlMonthCal_GetUnicodeFormat GUICtrlMonthCal_HitTest GUICtrlMonthCal_SetCalendarBorder GUICtrlMonthCal_SetColor GUICtrlMonthCal_SetCurSel GUICtrlMonthCal_SetDayState GUICtrlMonthCal_SetFirstDOW GUICtrlMonthCal_SetMaxSelCount GUICtrlMonthCal_SetMonthDelta GUICtrlMonthCal_SetRange GUICtrlMonthCal_SetSelRange GUICtrlMonthCal_SetToday GUICtrlMonthCal_SetUnicodeFormat GUICtrlRebar_AddBand GUICtrlRebar_AddToolBarBand GUICtrlRebar_BeginDrag GUICtrlRebar_Create GUICtrlRebar_DeleteBand GUICtrlRebar_Destroy GUICtrlRebar_DragMove GUICtrlRebar_EndDrag GUICtrlRebar_GetBandBackColor GUICtrlRebar_GetBandBorders GUICtrlRebar_GetBandBordersEx GUICtrlRebar_GetBandChildHandle GUICtrlRebar_GetBandChildSize GUICtrlRebar_GetBandCount GUICtrlRebar_GetBandForeColor GUICtrlRebar_GetBandHeaderSize GUICtrlRebar_GetBandID GUICtrlRebar_GetBandIdealSize GUICtrlRebar_GetBandLength GUICtrlRebar_GetBandLParam GUICtrlRebar_GetBandMargins GUICtrlRebar_GetBandMarginsEx GUICtrlRebar_GetBandRect GUICtrlRebar_GetBandRectEx GUICtrlRebar_GetBandStyle GUICtrlRebar_GetBandStyleBreak GUICtrlRebar_GetBandStyleChildEdge GUICtrlRebar_GetBandStyleFixedBMP GUICtrlRebar_GetBandStyleFixedSize GUICtrlRebar_GetBandStyleGripperAlways GUICtrlRebar_GetBandStyleHidden GUICtrlRebar_GetBandStyleHideTitle GUICtrlRebar_GetBandStyleNoGripper GUICtrlRebar_GetBandStyleTopAlign GUICtrlRebar_GetBandStyleUseChevron GUICtrlRebar_GetBandStyleVariableHeight GUICtrlRebar_GetBandText GUICtrlRebar_GetBarHeight GUICtrlRebar_GetBarInfo GUICtrlRebar_GetBKColor GUICtrlRebar_GetColorScheme GUICtrlRebar_GetRowCount GUICtrlRebar_GetRowHeight GUICtrlRebar_GetTextColor GUICtrlRebar_GetToolTips GUICtrlRebar_GetUnicodeFormat GUICtrlRebar_HitTest GUICtrlRebar_IDToIndex GUICtrlRebar_MaximizeBand GUICtrlRebar_MinimizeBand GUICtrlRebar_MoveBand GUICtrlRebar_SetBandBackColor GUICtrlRebar_SetBandForeColor GUICtrlRebar_SetBandHeaderSize GUICtrlRebar_SetBandID GUICtrlRebar_SetBandIdealSize GUICtrlRebar_SetBandLength GUICtrlRebar_SetBandLParam GUICtrlRebar_SetBandStyle GUICtrlRebar_SetBandStyleBreak GUICtrlRebar_SetBandStyleChildEdge GUICtrlRebar_SetBandStyleFixedBMP GUICtrlRebar_SetBandStyleFixedSize GUICtrlRebar_SetBandStyleGripperAlways GUICtrlRebar_SetBandStyleHidden GUICtrlRebar_SetBandStyleHideTitle GUICtrlRebar_SetBandStyleNoGripper GUICtrlRebar_SetBandStyleTopAlign GUICtrlRebar_SetBandStyleUseChevron GUICtrlRebar_SetBandStyleVariableHeight GUICtrlRebar_SetBandText GUICtrlRebar_SetBarInfo GUICtrlRebar_SetBKColor GUICtrlRebar_SetColorScheme GUICtrlRebar_SetTextColor GUICtrlRebar_SetToolTips GUICtrlRebar_SetUnicodeFormat GUICtrlRebar_ShowBand GUICtrlRichEdit_AppendText GUICtrlRichEdit_AutoDetectURL GUICtrlRichEdit_CanPaste GUICtrlRichEdit_CanPasteSpecial GUICtrlRichEdit_CanRedo GUICtrlRichEdit_CanUndo GUICtrlRichEdit_ChangeFontSize GUICtrlRichEdit_Copy GUICtrlRichEdit_Create GUICtrlRichEdit_Cut GUICtrlRichEdit_Deselect GUICtrlRichEdit_Destroy GUICtrlRichEdit_EmptyUndoBuffer GUICtrlRichEdit_FindText GUICtrlRichEdit_FindTextInRange GUICtrlRichEdit_GetBkColor GUICtrlRichEdit_GetCharAttributes GUICtrlRichEdit_GetCharBkColor GUICtrlRichEdit_GetCharColor GUICtrlRichEdit_GetCharPosFromXY GUICtrlRichEdit_GetCharPosOfNextWord GUICtrlRichEdit_GetCharPosOfPreviousWord GUICtrlRichEdit_GetCharWordBreakInfo GUICtrlRichEdit_GetFirstCharPosOnLine GUICtrlRichEdit_GetFont GUICtrlRichEdit_GetLineCount GUICtrlRichEdit_GetLineLength GUICtrlRichEdit_GetLineNumberFromCharPos GUICtrlRichEdit_GetNextRedo GUICtrlRichEdit_GetNextUndo GUICtrlRichEdit_GetNumberOfFirstVisibleLine GUICtrlRichEdit_GetParaAlignment GUICtrlRichEdit_GetParaAttributes GUICtrlRichEdit_GetParaBorder GUICtrlRichEdit_GetParaIndents GUICtrlRichEdit_GetParaNumbering GUICtrlRichEdit_GetParaShading GUICtrlRichEdit_GetParaSpacing GUICtrlRichEdit_GetParaTabStops GUICtrlRichEdit_GetPasswordChar GUICtrlRichEdit_GetRECT GUICtrlRichEdit_GetScrollPos GUICtrlRichEdit_GetSel GUICtrlRichEdit_GetSelAA GUICtrlRichEdit_GetSelText GUICtrlRichEdit_GetSpaceUnit GUICtrlRichEdit_GetText GUICtrlRichEdit_GetTextInLine GUICtrlRichEdit_GetTextInRange GUICtrlRichEdit_GetTextLength GUICtrlRichEdit_GetVersion GUICtrlRichEdit_GetXYFromCharPos GUICtrlRichEdit_GetZoom GUICtrlRichEdit_GotoCharPos GUICtrlRichEdit_HideSelection GUICtrlRichEdit_InsertText GUICtrlRichEdit_IsModified GUICtrlRichEdit_IsTextSelected GUICtrlRichEdit_Paste GUICtrlRichEdit_PasteSpecial GUICtrlRichEdit_PauseRedraw GUICtrlRichEdit_Redo GUICtrlRichEdit_ReplaceText GUICtrlRichEdit_ResumeRedraw GUICtrlRichEdit_ScrollLineOrPage GUICtrlRichEdit_ScrollLines GUICtrlRichEdit_ScrollToCaret GUICtrlRichEdit_SetBkColor GUICtrlRichEdit_SetCharAttributes GUICtrlRichEdit_SetCharBkColor GUICtrlRichEdit_SetCharColor GUICtrlRichEdit_SetEventMask GUICtrlRichEdit_SetFont GUICtrlRichEdit_SetLimitOnText GUICtrlRichEdit_SetModified GUICtrlRichEdit_SetParaAlignment GUICtrlRichEdit_SetParaAttributes GUICtrlRichEdit_SetParaBorder GUICtrlRichEdit_SetParaIndents GUICtrlRichEdit_SetParaNumbering GUICtrlRichEdit_SetParaShading GUICtrlRichEdit_SetParaSpacing GUICtrlRichEdit_SetParaTabStops GUICtrlRichEdit_SetPasswordChar GUICtrlRichEdit_SetReadOnly GUICtrlRichEdit_SetRECT GUICtrlRichEdit_SetScrollPos GUICtrlRichEdit_SetSel GUICtrlRichEdit_SetSpaceUnit GUICtrlRichEdit_SetTabStops GUICtrlRichEdit_SetText GUICtrlRichEdit_SetUndoLimit GUICtrlRichEdit_SetZoom GUICtrlRichEdit_StreamFromFile GUICtrlRichEdit_StreamFromVar GUICtrlRichEdit_StreamToFile GUICtrlRichEdit_StreamToVar GUICtrlRichEdit_Undo GUICtrlSlider_ClearSel GUICtrlSlider_ClearTics GUICtrlSlider_Create GUICtrlSlider_Destroy GUICtrlSlider_GetBuddy GUICtrlSlider_GetChannelRect GUICtrlSlider_GetChannelRectEx GUICtrlSlider_GetLineSize GUICtrlSlider_GetLogicalTics GUICtrlSlider_GetNumTics GUICtrlSlider_GetPageSize GUICtrlSlider_GetPos GUICtrlSlider_GetRange GUICtrlSlider_GetRangeMax GUICtrlSlider_GetRangeMin GUICtrlSlider_GetSel GUICtrlSlider_GetSelEnd GUICtrlSlider_GetSelStart GUICtrlSlider_GetThumbLength GUICtrlSlider_GetThumbRect GUICtrlSlider_GetThumbRectEx GUICtrlSlider_GetTic GUICtrlSlider_GetTicPos GUICtrlSlider_GetToolTips GUICtrlSlider_GetUnicodeFormat GUICtrlSlider_SetBuddy GUICtrlSlider_SetLineSize GUICtrlSlider_SetPageSize GUICtrlSlider_SetPos GUICtrlSlider_SetRange GUICtrlSlider_SetRangeMax GUICtrlSlider_SetRangeMin GUICtrlSlider_SetSel GUICtrlSlider_SetSelEnd GUICtrlSlider_SetSelStart GUICtrlSlider_SetThumbLength GUICtrlSlider_SetTic GUICtrlSlider_SetTicFreq GUICtrlSlider_SetTipSide GUICtrlSlider_SetToolTips GUICtrlSlider_SetUnicodeFormat GUICtrlStatusBar_Create GUICtrlStatusBar_Destroy GUICtrlStatusBar_EmbedControl GUICtrlStatusBar_GetBorders GUICtrlStatusBar_GetBordersHorz GUICtrlStatusBar_GetBordersRect GUICtrlStatusBar_GetBordersVert GUICtrlStatusBar_GetCount GUICtrlStatusBar_GetHeight GUICtrlStatusBar_GetIcon GUICtrlStatusBar_GetParts GUICtrlStatusBar_GetRect GUICtrlStatusBar_GetRectEx GUICtrlStatusBar_GetText GUICtrlStatusBar_GetTextFlags GUICtrlStatusBar_GetTextLength GUICtrlStatusBar_GetTextLengthEx GUICtrlStatusBar_GetTipText GUICtrlStatusBar_GetUnicodeFormat GUICtrlStatusBar_GetWidth GUICtrlStatusBar_IsSimple GUICtrlStatusBar_Resize GUICtrlStatusBar_SetBkColor GUICtrlStatusBar_SetIcon GUICtrlStatusBar_SetMinHeight GUICtrlStatusBar_SetParts GUICtrlStatusBar_SetSimple GUICtrlStatusBar_SetText GUICtrlStatusBar_SetTipText GUICtrlStatusBar_SetUnicodeFormat GUICtrlStatusBar_ShowHide GUICtrlTab_ActivateTab GUICtrlTab_ClickTab GUICtrlTab_Create GUICtrlTab_DeleteAllItems GUICtrlTab_DeleteItem GUICtrlTab_DeselectAll GUICtrlTab_Destroy GUICtrlTab_FindTab GUICtrlTab_GetCurFocus GUICtrlTab_GetCurSel GUICtrlTab_GetDisplayRect GUICtrlTab_GetDisplayRectEx GUICtrlTab_GetExtendedStyle GUICtrlTab_GetImageList GUICtrlTab_GetItem GUICtrlTab_GetItemCount GUICtrlTab_GetItemImage GUICtrlTab_GetItemParam GUICtrlTab_GetItemRect GUICtrlTab_GetItemRectEx GUICtrlTab_GetItemState GUICtrlTab_GetItemText GUICtrlTab_GetRowCount GUICtrlTab_GetToolTips GUICtrlTab_GetUnicodeFormat GUICtrlTab_HighlightItem GUICtrlTab_HitTest GUICtrlTab_InsertItem GUICtrlTab_RemoveImage GUICtrlTab_SetCurFocus GUICtrlTab_SetCurSel GUICtrlTab_SetExtendedStyle GUICtrlTab_SetImageList GUICtrlTab_SetItem GUICtrlTab_SetItemImage GUICtrlTab_SetItemParam GUICtrlTab_SetItemSize GUICtrlTab_SetItemState GUICtrlTab_SetItemText GUICtrlTab_SetMinTabWidth GUICtrlTab_SetPadding GUICtrlTab_SetToolTips GUICtrlTab_SetUnicodeFormat GUICtrlToolbar_AddBitmap GUICtrlToolbar_AddButton GUICtrlToolbar_AddButtonSep GUICtrlToolbar_AddString GUICtrlToolbar_ButtonCount GUICtrlToolbar_CheckButton GUICtrlToolbar_ClickAccel GUICtrlToolbar_ClickButton GUICtrlToolbar_ClickIndex GUICtrlToolbar_CommandToIndex GUICtrlToolbar_Create GUICtrlToolbar_Customize GUICtrlToolbar_DeleteButton GUICtrlToolbar_Destroy GUICtrlToolbar_EnableButton GUICtrlToolbar_FindToolbar GUICtrlToolbar_GetAnchorHighlight GUICtrlToolbar_GetBitmapFlags GUICtrlToolbar_GetButtonBitmap GUICtrlToolbar_GetButtonInfo GUICtrlToolbar_GetButtonInfoEx GUICtrlToolbar_GetButtonParam GUICtrlToolbar_GetButtonRect GUICtrlToolbar_GetButtonRectEx GUICtrlToolbar_GetButtonSize GUICtrlToolbar_GetButtonState GUICtrlToolbar_GetButtonStyle GUICtrlToolbar_GetButtonText GUICtrlToolbar_GetColorScheme GUICtrlToolbar_GetDisabledImageList GUICtrlToolbar_GetExtendedStyle GUICtrlToolbar_GetHotImageList GUICtrlToolbar_GetHotItem GUICtrlToolbar_GetImageList GUICtrlToolbar_GetInsertMark GUICtrlToolbar_GetInsertMarkColor GUICtrlToolbar_GetMaxSize GUICtrlToolbar_GetMetrics GUICtrlToolbar_GetPadding GUICtrlToolbar_GetRows GUICtrlToolbar_GetString GUICtrlToolbar_GetStyle GUICtrlToolbar_GetStyleAltDrag GUICtrlToolbar_GetStyleCustomErase GUICtrlToolbar_GetStyleFlat GUICtrlToolbar_GetStyleList GUICtrlToolbar_GetStyleRegisterDrop GUICtrlToolbar_GetStyleToolTips GUICtrlToolbar_GetStyleTransparent GUICtrlToolbar_GetStyleWrapable GUICtrlToolbar_GetTextRows GUICtrlToolbar_GetToolTips GUICtrlToolbar_GetUnicodeFormat GUICtrlToolbar_HideButton GUICtrlToolbar_HighlightButton GUICtrlToolbar_HitTest GUICtrlToolbar_IndexToCommand GUICtrlToolbar_InsertButton GUICtrlToolbar_InsertMarkHitTest GUICtrlToolbar_IsButtonChecked GUICtrlToolbar_IsButtonEnabled GUICtrlToolbar_IsButtonHidden GUICtrlToolbar_IsButtonHighlighted GUICtrlToolbar_IsButtonIndeterminate GUICtrlToolbar_IsButtonPressed GUICtrlToolbar_LoadBitmap GUICtrlToolbar_LoadImages GUICtrlToolbar_MapAccelerator GUICtrlToolbar_MoveButton GUICtrlToolbar_PressButton GUICtrlToolbar_SetAnchorHighlight GUICtrlToolbar_SetBitmapSize GUICtrlToolbar_SetButtonBitMap GUICtrlToolbar_SetButtonInfo GUICtrlToolbar_SetButtonInfoEx GUICtrlToolbar_SetButtonParam GUICtrlToolbar_SetButtonSize GUICtrlToolbar_SetButtonState GUICtrlToolbar_SetButtonStyle GUICtrlToolbar_SetButtonText GUICtrlToolbar_SetButtonWidth GUICtrlToolbar_SetCmdID GUICtrlToolbar_SetColorScheme GUICtrlToolbar_SetDisabledImageList GUICtrlToolbar_SetDrawTextFlags GUICtrlToolbar_SetExtendedStyle GUICtrlToolbar_SetHotImageList GUICtrlToolbar_SetHotItem GUICtrlToolbar_SetImageList GUICtrlToolbar_SetIndent GUICtrlToolbar_SetIndeterminate GUICtrlToolbar_SetInsertMark GUICtrlToolbar_SetInsertMarkColor GUICtrlToolbar_SetMaxTextRows GUICtrlToolbar_SetMetrics GUICtrlToolbar_SetPadding GUICtrlToolbar_SetParent GUICtrlToolbar_SetRows GUICtrlToolbar_SetStyle GUICtrlToolbar_SetStyleAltDrag GUICtrlToolbar_SetStyleCustomErase GUICtrlToolbar_SetStyleFlat GUICtrlToolbar_SetStyleList GUICtrlToolbar_SetStyleRegisterDrop GUICtrlToolbar_SetStyleToolTips GUICtrlToolbar_SetStyleTransparent GUICtrlToolbar_SetStyleWrapable GUICtrlToolbar_SetToolTips GUICtrlToolbar_SetUnicodeFormat GUICtrlToolbar_SetWindowTheme GUICtrlTreeView_Add GUICtrlTreeView_AddChild GUICtrlTreeView_AddChildFirst GUICtrlTreeView_AddFirst GUICtrlTreeView_BeginUpdate GUICtrlTreeView_ClickItem GUICtrlTreeView_Create GUICtrlTreeView_CreateDragImage GUICtrlTreeView_CreateSolidBitMap GUICtrlTreeView_Delete GUICtrlTreeView_DeleteAll GUICtrlTreeView_DeleteChildren GUICtrlTreeView_Destroy GUICtrlTreeView_DisplayRect GUICtrlTreeView_DisplayRectEx GUICtrlTreeView_EditText GUICtrlTreeView_EndEdit GUICtrlTreeView_EndUpdate GUICtrlTreeView_EnsureVisible GUICtrlTreeView_Expand GUICtrlTreeView_ExpandedOnce GUICtrlTreeView_FindItem GUICtrlTreeView_FindItemEx GUICtrlTreeView_GetBkColor GUICtrlTreeView_GetBold GUICtrlTreeView_GetChecked GUICtrlTreeView_GetChildCount GUICtrlTreeView_GetChildren GUICtrlTreeView_GetCount GUICtrlTreeView_GetCut GUICtrlTreeView_GetDropTarget GUICtrlTreeView_GetEditControl GUICtrlTreeView_GetExpanded GUICtrlTreeView_GetFirstChild GUICtrlTreeView_GetFirstItem GUICtrlTreeView_GetFirstVisible GUICtrlTreeView_GetFocused GUICtrlTreeView_GetHeight GUICtrlTreeView_GetImageIndex GUICtrlTreeView_GetImageListIconHandle GUICtrlTreeView_GetIndent GUICtrlTreeView_GetInsertMarkColor GUICtrlTreeView_GetISearchString GUICtrlTreeView_GetItemByIndex GUICtrlTreeView_GetItemHandle GUICtrlTreeView_GetItemParam GUICtrlTreeView_GetLastChild GUICtrlTreeView_GetLineColor GUICtrlTreeView_GetNext GUICtrlTreeView_GetNextChild GUICtrlTreeView_GetNextSibling GUICtrlTreeView_GetNextVisible GUICtrlTreeView_GetNormalImageList GUICtrlTreeView_GetParentHandle GUICtrlTreeView_GetParentParam GUICtrlTreeView_GetPrev GUICtrlTreeView_GetPrevChild GUICtrlTreeView_GetPrevSibling GUICtrlTreeView_GetPrevVisible GUICtrlTreeView_GetScrollTime GUICtrlTreeView_GetSelected GUICtrlTreeView_GetSelectedImageIndex GUICtrlTreeView_GetSelection GUICtrlTreeView_GetSiblingCount GUICtrlTreeView_GetState GUICtrlTreeView_GetStateImageIndex GUICtrlTreeView_GetStateImageList GUICtrlTreeView_GetText GUICtrlTreeView_GetTextColor GUICtrlTreeView_GetToolTips GUICtrlTreeView_GetTree GUICtrlTreeView_GetUnicodeFormat GUICtrlTreeView_GetVisible GUICtrlTreeView_GetVisibleCount GUICtrlTreeView_HitTest GUICtrlTreeView_HitTestEx GUICtrlTreeView_HitTestItem GUICtrlTreeView_Index GUICtrlTreeView_InsertItem GUICtrlTreeView_IsFirstItem GUICtrlTreeView_IsParent GUICtrlTreeView_Level GUICtrlTreeView_SelectItem GUICtrlTreeView_SelectItemByIndex GUICtrlTreeView_SetBkColor GUICtrlTreeView_SetBold GUICtrlTreeView_SetChecked GUICtrlTreeView_SetCheckedByIndex GUICtrlTreeView_SetChildren GUICtrlTreeView_SetCut GUICtrlTreeView_SetDropTarget GUICtrlTreeView_SetFocused GUICtrlTreeView_SetHeight GUICtrlTreeView_SetIcon GUICtrlTreeView_SetImageIndex GUICtrlTreeView_SetIndent GUICtrlTreeView_SetInsertMark GUICtrlTreeView_SetInsertMarkColor GUICtrlTreeView_SetItemHeight GUICtrlTreeView_SetItemParam GUICtrlTreeView_SetLineColor GUICtrlTreeView_SetNormalImageList GUICtrlTreeView_SetScrollTime GUICtrlTreeView_SetSelected GUICtrlTreeView_SetSelectedImageIndex GUICtrlTreeView_SetState GUICtrlTreeView_SetStateImageIndex GUICtrlTreeView_SetStateImageList GUICtrlTreeView_SetText GUICtrlTreeView_SetTextColor GUICtrlTreeView_SetToolTips GUICtrlTreeView_SetUnicodeFormat GUICtrlTreeView_Sort GUIImageList_Add GUIImageList_AddBitmap GUIImageList_AddIcon GUIImageList_AddMasked GUIImageList_BeginDrag GUIImageList_Copy GUIImageList_Create GUIImageList_Destroy GUIImageList_DestroyIcon GUIImageList_DragEnter GUIImageList_DragLeave GUIImageList_DragMove GUIImageList_Draw GUIImageList_DrawEx GUIImageList_Duplicate GUIImageList_EndDrag GUIImageList_GetBkColor GUIImageList_GetIcon GUIImageList_GetIconHeight GUIImageList_GetIconSize GUIImageList_GetIconSizeEx GUIImageList_GetIconWidth GUIImageList_GetImageCount GUIImageList_GetImageInfoEx GUIImageList_Remove GUIImageList_ReplaceIcon GUIImageList_SetBkColor GUIImageList_SetIconSize GUIImageList_SetImageCount GUIImageList_Swap GUIScrollBars_EnableScrollBar GUIScrollBars_GetScrollBarInfoEx GUIScrollBars_GetScrollBarRect GUIScrollBars_GetScrollBarRGState GUIScrollBars_GetScrollBarXYLineButton GUIScrollBars_GetScrollBarXYThumbBottom GUIScrollBars_GetScrollBarXYThumbTop GUIScrollBars_GetScrollInfo GUIScrollBars_GetScrollInfoEx GUIScrollBars_GetScrollInfoMax GUIScrollBars_GetScrollInfoMin GUIScrollBars_GetScrollInfoPage GUIScrollBars_GetScrollInfoPos GUIScrollBars_GetScrollInfoTrackPos GUIScrollBars_GetScrollPos GUIScrollBars_GetScrollRange GUIScrollBars_Init GUIScrollBars_ScrollWindow GUIScrollBars_SetScrollInfo GUIScrollBars_SetScrollInfoMax GUIScrollBars_SetScrollInfoMin GUIScrollBars_SetScrollInfoPage GUIScrollBars_SetScrollInfoPos GUIScrollBars_SetScrollRange GUIScrollBars_ShowScrollBar GUIToolTip_Activate GUIToolTip_AddTool GUIToolTip_AdjustRect GUIToolTip_BitsToTTF GUIToolTip_Create GUIToolTip_Deactivate GUIToolTip_DelTool GUIToolTip_Destroy GUIToolTip_EnumTools GUIToolTip_GetBubbleHeight GUIToolTip_GetBubbleSize GUIToolTip_GetBubbleWidth GUIToolTip_GetCurrentTool GUIToolTip_GetDelayTime GUIToolTip_GetMargin GUIToolTip_GetMarginEx GUIToolTip_GetMaxTipWidth GUIToolTip_GetText GUIToolTip_GetTipBkColor GUIToolTip_GetTipTextColor GUIToolTip_GetTitleBitMap GUIToolTip_GetTitleText GUIToolTip_GetToolCount GUIToolTip_GetToolInfo GUIToolTip_HitTest GUIToolTip_NewToolRect GUIToolTip_Pop GUIToolTip_PopUp GUIToolTip_SetDelayTime GUIToolTip_SetMargin GUIToolTip_SetMaxTipWidth GUIToolTip_SetTipBkColor GUIToolTip_SetTipTextColor GUIToolTip_SetTitle GUIToolTip_SetToolInfo GUIToolTip_SetWindowTheme GUIToolTip_ToolExists GUIToolTip_ToolToArray GUIToolTip_TrackActivate GUIToolTip_TrackPosition GUIToolTip_Update GUIToolTip_UpdateTipText HexToString IEAction IEAttach IEBodyReadHTML IEBodyReadText IEBodyWriteHTML IECreate IECreateEmbedded IEDocGetObj IEDocInsertHTML IEDocInsertText IEDocReadHTML IEDocWriteHTML IEErrorNotify IEFormElementCheckBoxSelect IEFormElementGetCollection IEFormElementGetObjByName IEFormElementGetValue IEFormElementOptionSelect IEFormElementRadioSelect IEFormElementSetValue IEFormGetCollection IEFormGetObjByName IEFormImageClick IEFormReset IEFormSubmit IEFrameGetCollection IEFrameGetObjByName IEGetObjById IEGetObjByName IEHeadInsertEventScript IEImgClick IEImgGetCollection IEIsFrameSet IELinkClickByIndex IELinkClickByText IELinkGetCollection IELoadWait IELoadWaitTimeout IENavigate IEPropertyGet IEPropertySet IEQuit IETableGetCollection IETableWriteToArray IETagNameAllGetCollection IETagNameGetCollection IE_Example IE_Introduction IE_VersionInfo INetExplorerCapable INetGetSource INetMail INetSmtpMail IsPressed MathCheckDiv Max MemGlobalAlloc MemGlobalFree MemGlobalLock MemGlobalSize MemGlobalUnlock MemMoveMemory MemVirtualAlloc MemVirtualAllocEx MemVirtualFree MemVirtualFreeEx Min MouseTrap NamedPipes_CallNamedPipe NamedPipes_ConnectNamedPipe NamedPipes_CreateNamedPipe NamedPipes_CreatePipe NamedPipes_DisconnectNamedPipe NamedPipes_GetNamedPipeHandleState NamedPipes_GetNamedPipeInfo NamedPipes_PeekNamedPipe NamedPipes_SetNamedPipeHandleState NamedPipes_TransactNamedPipe NamedPipes_WaitNamedPipe Net_Share_ConnectionEnum Net_Share_FileClose Net_Share_FileEnum Net_Share_FileGetInfo Net_Share_PermStr Net_Share_ResourceStr Net_Share_SessionDel Net_Share_SessionEnum Net_Share_SessionGetInfo Net_Share_ShareAdd Net_Share_ShareCheck Net_Share_ShareDel Net_Share_ShareEnum Net_Share_ShareGetInfo Net_Share_ShareSetInfo Net_Share_StatisticsGetSvr Net_Share_StatisticsGetWrk Now NowCalc NowCalcDate NowDate NowTime PathFull PathGetRelative PathMake PathSplit ProcessGetName ProcessGetPriority Radian ReplaceStringInFile RunDos ScreenCapture_Capture ScreenCapture_CaptureWnd ScreenCapture_SaveImage ScreenCapture_SetBMPFormat ScreenCapture_SetJPGQuality ScreenCapture_SetTIFColorDepth ScreenCapture_SetTIFCompression Security__AdjustTokenPrivileges Security__CreateProcessWithToken Security__DuplicateTokenEx Security__GetAccountSid Security__GetLengthSid Security__GetTokenInformation Security__ImpersonateSelf Security__IsValidSid Security__LookupAccountName Security__LookupAccountSid Security__LookupPrivilegeValue Security__OpenProcessToken Security__OpenThreadToken Security__OpenThreadTokenEx Security__SetPrivilege Security__SetTokenInformation Security__SidToStringSid Security__SidTypeStr Security__StringSidToSid SendMessage SendMessageA SetDate SetTime Singleton SoundClose SoundLength SoundOpen SoundPause SoundPlay SoundPos SoundResume SoundSeek SoundStatus SoundStop SQLite_Changes SQLite_Close SQLite_Display2DResult SQLite_Encode SQLite_ErrCode SQLite_ErrMsg SQLite_Escape SQLite_Exec SQLite_FastEncode SQLite_FastEscape SQLite_FetchData SQLite_FetchNames SQLite_GetTable SQLite_GetTable2d SQLite_LastInsertRowID SQLite_LibVersion SQLite_Open SQLite_Query SQLite_QueryFinalize SQLite_QueryReset SQLite_QuerySingleRow SQLite_SafeMode SQLite_SetTimeout SQLite_Shutdown SQLite_SQLiteExe SQLite_Startup SQLite_TotalChanges StringBetween StringExplode StringInsert StringProper StringRepeat StringTitleCase StringToHex TCPIpToName TempFile TicksToTime Timer_Diff Timer_GetIdleTime Timer_GetTimerID Timer_Init Timer_KillAllTimers Timer_KillTimer Timer_SetTimer TimeToTicks VersionCompare viClose viExecCommand viFindGpib viGpibBusReset viGTL viInteractiveControl viOpen viSetAttribute viSetTimeout WeekNumberISO WinAPI_AbortPath WinAPI_ActivateKeyboardLayout WinAPI_AddClipboardFormatListener WinAPI_AddFontMemResourceEx WinAPI_AddFontResourceEx WinAPI_AddIconOverlay WinAPI_AddIconTransparency WinAPI_AddMRUString WinAPI_AdjustBitmap WinAPI_AdjustTokenPrivileges WinAPI_AdjustWindowRectEx WinAPI_AlphaBlend WinAPI_AngleArc WinAPI_AnimateWindow WinAPI_Arc WinAPI_ArcTo WinAPI_ArrayToStruct WinAPI_AssignProcessToJobObject WinAPI_AssocGetPerceivedType WinAPI_AssocQueryString WinAPI_AttachConsole WinAPI_AttachThreadInput WinAPI_BackupRead WinAPI_BackupReadAbort WinAPI_BackupSeek WinAPI_BackupWrite WinAPI_BackupWriteAbort WinAPI_Beep WinAPI_BeginBufferedPaint WinAPI_BeginDeferWindowPos WinAPI_BeginPaint WinAPI_BeginPath WinAPI_BeginUpdateResource WinAPI_BitBlt WinAPI_BringWindowToTop WinAPI_BroadcastSystemMessage WinAPI_BrowseForFolderDlg WinAPI_BufferedPaintClear WinAPI_BufferedPaintInit WinAPI_BufferedPaintSetAlpha WinAPI_BufferedPaintUnInit WinAPI_CallNextHookEx WinAPI_CallWindowProc WinAPI_CallWindowProcW WinAPI_CascadeWindows WinAPI_ChangeWindowMessageFilterEx WinAPI_CharToOem WinAPI_ChildWindowFromPointEx WinAPI_ClientToScreen WinAPI_ClipCursor WinAPI_CloseDesktop WinAPI_CloseEnhMetaFile WinAPI_CloseFigure WinAPI_CloseHandle WinAPI_CloseThemeData WinAPI_CloseWindow WinAPI_CloseWindowStation WinAPI_CLSIDFromProgID WinAPI_CoInitialize WinAPI_ColorAdjustLuma WinAPI_ColorHLSToRGB WinAPI_ColorRGBToHLS WinAPI_CombineRgn WinAPI_CombineTransform WinAPI_CommandLineToArgv WinAPI_CommDlgExtendedError WinAPI_CommDlgExtendedErrorEx WinAPI_CompareString WinAPI_CompressBitmapBits WinAPI_CompressBuffer WinAPI_ComputeCrc32 WinAPI_ConfirmCredentials WinAPI_CopyBitmap WinAPI_CopyCursor WinAPI_CopyEnhMetaFile WinAPI_CopyFileEx WinAPI_CopyIcon WinAPI_CopyImage WinAPI_CopyRect WinAPI_CopyStruct WinAPI_CoTaskMemAlloc WinAPI_CoTaskMemFree WinAPI_CoTaskMemRealloc WinAPI_CoUninitialize WinAPI_Create32BitHBITMAP WinAPI_Create32BitHICON WinAPI_CreateANDBitmap WinAPI_CreateBitmap WinAPI_CreateBitmapIndirect WinAPI_CreateBrushIndirect WinAPI_CreateBuffer WinAPI_CreateBufferFromStruct WinAPI_CreateCaret WinAPI_CreateColorAdjustment WinAPI_CreateCompatibleBitmap WinAPI_CreateCompatibleBitmapEx WinAPI_CreateCompatibleDC WinAPI_CreateDesktop WinAPI_CreateDIB WinAPI_CreateDIBColorTable WinAPI_CreateDIBitmap WinAPI_CreateDIBSection WinAPI_CreateDirectory WinAPI_CreateDirectoryEx WinAPI_CreateEllipticRgn WinAPI_CreateEmptyIcon WinAPI_CreateEnhMetaFile WinAPI_CreateEvent WinAPI_CreateFile WinAPI_CreateFileEx WinAPI_CreateFileMapping WinAPI_CreateFont WinAPI_CreateFontEx WinAPI_CreateFontIndirect WinAPI_CreateGUID WinAPI_CreateHardLink WinAPI_CreateIcon WinAPI_CreateIconFromResourceEx WinAPI_CreateIconIndirect WinAPI_CreateJobObject WinAPI_CreateMargins WinAPI_CreateMRUList WinAPI_CreateMutex WinAPI_CreateNullRgn WinAPI_CreateNumberFormatInfo WinAPI_CreateObjectID WinAPI_CreatePen WinAPI_CreatePoint WinAPI_CreatePolygonRgn WinAPI_CreateProcess WinAPI_CreateProcessWithToken WinAPI_CreateRect WinAPI_CreateRectEx WinAPI_CreateRectRgn WinAPI_CreateRectRgnIndirect WinAPI_CreateRoundRectRgn WinAPI_CreateSemaphore WinAPI_CreateSize WinAPI_CreateSolidBitmap WinAPI_CreateSolidBrush WinAPI_CreateStreamOnHGlobal WinAPI_CreateString WinAPI_CreateSymbolicLink WinAPI_CreateTransform WinAPI_CreateWindowEx WinAPI_CreateWindowStation WinAPI_DecompressBuffer WinAPI_DecryptFile WinAPI_DeferWindowPos WinAPI_DefineDosDevice WinAPI_DefRawInputProc WinAPI_DefSubclassProc WinAPI_DefWindowProc WinAPI_DefWindowProcW WinAPI_DeleteDC WinAPI_DeleteEnhMetaFile WinAPI_DeleteFile WinAPI_DeleteObject WinAPI_DeleteObjectID WinAPI_DeleteVolumeMountPoint WinAPI_DeregisterShellHookWindow WinAPI_DestroyCaret WinAPI_DestroyCursor WinAPI_DestroyIcon WinAPI_DestroyWindow WinAPI_DeviceIoControl WinAPI_DisplayStruct WinAPI_DllGetVersion WinAPI_DllInstall WinAPI_DllUninstall WinAPI_DPtoLP WinAPI_DragAcceptFiles WinAPI_DragFinish WinAPI_DragQueryFileEx WinAPI_DragQueryPoint WinAPI_DrawAnimatedRects WinAPI_DrawBitmap WinAPI_DrawEdge WinAPI_DrawFocusRect WinAPI_DrawFrameControl WinAPI_DrawIcon WinAPI_DrawIconEx WinAPI_DrawLine WinAPI_DrawShadowText WinAPI_DrawText WinAPI_DrawThemeBackground WinAPI_DrawThemeEdge WinAPI_DrawThemeIcon WinAPI_DrawThemeParentBackground WinAPI_DrawThemeText WinAPI_DrawThemeTextEx WinAPI_DuplicateEncryptionInfoFile WinAPI_DuplicateHandle WinAPI_DuplicateTokenEx WinAPI_DwmDefWindowProc WinAPI_DwmEnableBlurBehindWindow WinAPI_DwmEnableComposition WinAPI_DwmExtendFrameIntoClientArea WinAPI_DwmGetColorizationColor WinAPI_DwmGetColorizationParameters WinAPI_DwmGetWindowAttribute WinAPI_DwmInvalidateIconicBitmaps WinAPI_DwmIsCompositionEnabled WinAPI_DwmQueryThumbnailSourceSize WinAPI_DwmRegisterThumbnail WinAPI_DwmSetColorizationParameters WinAPI_DwmSetIconicLivePreviewBitmap WinAPI_DwmSetIconicThumbnail WinAPI_DwmSetWindowAttribute WinAPI_DwmUnregisterThumbnail WinAPI_DwmUpdateThumbnailProperties WinAPI_DWordToFloat WinAPI_DWordToInt WinAPI_EjectMedia WinAPI_Ellipse WinAPI_EmptyWorkingSet WinAPI_EnableWindow WinAPI_EncryptFile WinAPI_EncryptionDisable WinAPI_EndBufferedPaint WinAPI_EndDeferWindowPos WinAPI_EndPaint WinAPI_EndPath WinAPI_EndUpdateResource WinAPI_EnumChildProcess WinAPI_EnumChildWindows WinAPI_EnumDesktops WinAPI_EnumDesktopWindows WinAPI_EnumDeviceDrivers WinAPI_EnumDisplayDevices WinAPI_EnumDisplayMonitors WinAPI_EnumDisplaySettings WinAPI_EnumDllProc WinAPI_EnumFiles WinAPI_EnumFileStreams WinAPI_EnumFontFamilies WinAPI_EnumHardLinks WinAPI_EnumMRUList WinAPI_EnumPageFiles WinAPI_EnumProcessHandles WinAPI_EnumProcessModules WinAPI_EnumProcessThreads WinAPI_EnumProcessWindows WinAPI_EnumRawInputDevices WinAPI_EnumResourceLanguages WinAPI_EnumResourceNames WinAPI_EnumResourceTypes WinAPI_EnumSystemGeoID WinAPI_EnumSystemLocales WinAPI_EnumUILanguages WinAPI_EnumWindows WinAPI_EnumWindowsPopup WinAPI_EnumWindowStations WinAPI_EnumWindowsTop WinAPI_EqualMemory WinAPI_EqualRect WinAPI_EqualRgn WinAPI_ExcludeClipRect WinAPI_ExpandEnvironmentStrings WinAPI_ExtCreatePen WinAPI_ExtCreateRegion WinAPI_ExtFloodFill WinAPI_ExtractIcon WinAPI_ExtractIconEx WinAPI_ExtSelectClipRgn WinAPI_FatalAppExit WinAPI_FatalExit WinAPI_FileEncryptionStatus WinAPI_FileExists WinAPI_FileIconInit WinAPI_FileInUse WinAPI_FillMemory WinAPI_FillPath WinAPI_FillRect WinAPI_FillRgn WinAPI_FindClose WinAPI_FindCloseChangeNotification WinAPI_FindExecutable WinAPI_FindFirstChangeNotification WinAPI_FindFirstFile WinAPI_FindFirstFileName WinAPI_FindFirstStream WinAPI_FindNextChangeNotification WinAPI_FindNextFile WinAPI_FindNextFileName WinAPI_FindNextStream WinAPI_FindResource WinAPI_FindResourceEx WinAPI_FindTextDlg WinAPI_FindWindow WinAPI_FlashWindow WinAPI_FlashWindowEx WinAPI_FlattenPath WinAPI_FloatToDWord WinAPI_FloatToInt WinAPI_FlushFileBuffers WinAPI_FlushFRBuffer WinAPI_FlushViewOfFile WinAPI_FormatDriveDlg WinAPI_FormatMessage WinAPI_FrameRect WinAPI_FrameRgn WinAPI_FreeLibrary WinAPI_FreeMemory WinAPI_FreeMRUList WinAPI_FreeResource WinAPI_GdiComment WinAPI_GetActiveWindow WinAPI_GetAllUsersProfileDirectory WinAPI_GetAncestor WinAPI_GetApplicationRestartSettings WinAPI_GetArcDirection WinAPI_GetAsyncKeyState WinAPI_GetBinaryType WinAPI_GetBitmapBits WinAPI_GetBitmapDimension WinAPI_GetBitmapDimensionEx WinAPI_GetBkColor WinAPI_GetBkMode WinAPI_GetBoundsRect WinAPI_GetBrushOrg WinAPI_GetBufferedPaintBits WinAPI_GetBufferedPaintDC WinAPI_GetBufferedPaintTargetDC WinAPI_GetBufferedPaintTargetRect WinAPI_GetBValue WinAPI_GetCaretBlinkTime WinAPI_GetCaretPos WinAPI_GetCDType WinAPI_GetClassInfoEx WinAPI_GetClassLongEx WinAPI_GetClassName WinAPI_GetClientHeight WinAPI_GetClientRect WinAPI_GetClientWidth WinAPI_GetClipboardSequenceNumber WinAPI_GetClipBox WinAPI_GetClipCursor WinAPI_GetClipRgn WinAPI_GetColorAdjustment WinAPI_GetCompressedFileSize WinAPI_GetCompression WinAPI_GetConnectedDlg WinAPI_GetCurrentDirectory WinAPI_GetCurrentHwProfile WinAPI_GetCurrentObject WinAPI_GetCurrentPosition WinAPI_GetCurrentProcess WinAPI_GetCurrentProcessExplicitAppUserModelID WinAPI_GetCurrentProcessID WinAPI_GetCurrentThemeName WinAPI_GetCurrentThread WinAPI_GetCurrentThreadId WinAPI_GetCursor WinAPI_GetCursorInfo WinAPI_GetDateFormat WinAPI_GetDC WinAPI_GetDCEx WinAPI_GetDefaultPrinter WinAPI_GetDefaultUserProfileDirectory WinAPI_GetDesktopWindow WinAPI_GetDeviceCaps WinAPI_GetDeviceDriverBaseName WinAPI_GetDeviceDriverFileName WinAPI_GetDeviceGammaRamp WinAPI_GetDIBColorTable WinAPI_GetDIBits WinAPI_GetDiskFreeSpaceEx WinAPI_GetDlgCtrlID WinAPI_GetDlgItem WinAPI_GetDllDirectory WinAPI_GetDriveBusType WinAPI_GetDriveGeometryEx WinAPI_GetDriveNumber WinAPI_GetDriveType WinAPI_GetDurationFormat WinAPI_GetEffectiveClientRect WinAPI_GetEnhMetaFile WinAPI_GetEnhMetaFileBits WinAPI_GetEnhMetaFileDescription WinAPI_GetEnhMetaFileDimension WinAPI_GetEnhMetaFileHeader WinAPI_GetErrorMessage WinAPI_GetErrorMode WinAPI_GetExitCodeProcess WinAPI_GetExtended WinAPI_GetFileAttributes WinAPI_GetFileID WinAPI_GetFileInformationByHandle WinAPI_GetFileInformationByHandleEx WinAPI_GetFilePointerEx WinAPI_GetFileSizeEx WinAPI_GetFileSizeOnDisk WinAPI_GetFileTitle WinAPI_GetFileType WinAPI_GetFileVersionInfo WinAPI_GetFinalPathNameByHandle WinAPI_GetFinalPathNameByHandleEx WinAPI_GetFocus WinAPI_GetFontMemoryResourceInfo WinAPI_GetFontName WinAPI_GetFontResourceInfo WinAPI_GetForegroundWindow WinAPI_GetFRBuffer WinAPI_GetFullPathName WinAPI_GetGeoInfo WinAPI_GetGlyphOutline WinAPI_GetGraphicsMode WinAPI_GetGuiResources WinAPI_GetGUIThreadInfo WinAPI_GetGValue WinAPI_GetHandleInformation WinAPI_GetHGlobalFromStream WinAPI_GetIconDimension WinAPI_GetIconInfo WinAPI_GetIconInfoEx WinAPI_GetIdleTime WinAPI_GetKeyboardLayout WinAPI_GetKeyboardLayoutList WinAPI_GetKeyboardState WinAPI_GetKeyboardType WinAPI_GetKeyNameText WinAPI_GetKeyState WinAPI_GetLastActivePopup WinAPI_GetLastError WinAPI_GetLastErrorMessage WinAPI_GetLayeredWindowAttributes WinAPI_GetLocaleInfo WinAPI_GetLogicalDrives WinAPI_GetMapMode WinAPI_GetMemorySize WinAPI_GetMessageExtraInfo WinAPI_GetModuleFileNameEx WinAPI_GetModuleHandle WinAPI_GetModuleHandleEx WinAPI_GetModuleInformation WinAPI_GetMonitorInfo WinAPI_GetMousePos WinAPI_GetMousePosX WinAPI_GetMousePosY WinAPI_GetMUILanguage WinAPI_GetNumberFormat WinAPI_GetObject WinAPI_GetObjectID WinAPI_GetObjectInfoByHandle WinAPI_GetObjectNameByHandle WinAPI_GetObjectType WinAPI_GetOpenFileName WinAPI_GetOutlineTextMetrics WinAPI_GetOverlappedResult WinAPI_GetParent WinAPI_GetParentProcess WinAPI_GetPerformanceInfo WinAPI_GetPEType WinAPI_GetPhysicallyInstalledSystemMemory WinAPI_GetPixel WinAPI_GetPolyFillMode WinAPI_GetPosFromRect WinAPI_GetPriorityClass WinAPI_GetProcAddress WinAPI_GetProcessAffinityMask WinAPI_GetProcessCommandLine WinAPI_GetProcessFileName WinAPI_GetProcessHandleCount WinAPI_GetProcessID WinAPI_GetProcessIoCounters WinAPI_GetProcessMemoryInfo WinAPI_GetProcessName WinAPI_GetProcessShutdownParameters WinAPI_GetProcessTimes WinAPI_GetProcessUser WinAPI_GetProcessWindowStation WinAPI_GetProcessWorkingDirectory WinAPI_GetProfilesDirectory WinAPI_GetPwrCapabilities WinAPI_GetRawInputBuffer WinAPI_GetRawInputBufferLength WinAPI_GetRawInputData WinAPI_GetRawInputDeviceInfo WinAPI_GetRegionData WinAPI_GetRegisteredRawInputDevices WinAPI_GetRegKeyNameByHandle WinAPI_GetRgnBox WinAPI_GetROP2 WinAPI_GetRValue WinAPI_GetSaveFileName WinAPI_GetShellWindow WinAPI_GetStartupInfo WinAPI_GetStdHandle WinAPI_GetStockObject WinAPI_GetStretchBltMode WinAPI_GetString WinAPI_GetSysColor WinAPI_GetSysColorBrush WinAPI_GetSystemDefaultLangID WinAPI_GetSystemDefaultLCID WinAPI_GetSystemDefaultUILanguage WinAPI_GetSystemDEPPolicy WinAPI_GetSystemInfo WinAPI_GetSystemMetrics WinAPI_GetSystemPowerStatus WinAPI_GetSystemTimes WinAPI_GetSystemWow64Directory WinAPI_GetTabbedTextExtent WinAPI_GetTempFileName WinAPI_GetTextAlign WinAPI_GetTextCharacterExtra WinAPI_GetTextColor WinAPI_GetTextExtentPoint32 WinAPI_GetTextFace WinAPI_GetTextMetrics WinAPI_GetThemeAppProperties WinAPI_GetThemeBackgroundContentRect WinAPI_GetThemeBackgroundExtent WinAPI_GetThemeBackgroundRegion WinAPI_GetThemeBitmap WinAPI_GetThemeBool WinAPI_GetThemeColor WinAPI_GetThemeDocumentationProperty WinAPI_GetThemeEnumValue WinAPI_GetThemeFilename WinAPI_GetThemeFont WinAPI_GetThemeInt WinAPI_GetThemeMargins WinAPI_GetThemeMetric WinAPI_GetThemePartSize WinAPI_GetThemePosition WinAPI_GetThemePropertyOrigin WinAPI_GetThemeRect WinAPI_GetThemeString WinAPI_GetThemeSysBool WinAPI_GetThemeSysColor WinAPI_GetThemeSysColorBrush WinAPI_GetThemeSysFont WinAPI_GetThemeSysInt WinAPI_GetThemeSysSize WinAPI_GetThemeSysString WinAPI_GetThemeTextExtent WinAPI_GetThemeTextMetrics WinAPI_GetThemeTransitionDuration WinAPI_GetThreadDesktop WinAPI_GetThreadErrorMode WinAPI_GetThreadLocale WinAPI_GetThreadUILanguage WinAPI_GetTickCount WinAPI_GetTickCount64 WinAPI_GetTimeFormat WinAPI_GetTopWindow WinAPI_GetUDFColorMode WinAPI_GetUpdateRect WinAPI_GetUpdateRgn WinAPI_GetUserDefaultLangID WinAPI_GetUserDefaultLCID WinAPI_GetUserDefaultUILanguage WinAPI_GetUserGeoID WinAPI_GetUserObjectInformation WinAPI_GetVersion WinAPI_GetVersionEx WinAPI_GetVolumeInformation WinAPI_GetVolumeInformationByHandle WinAPI_GetVolumeNameForVolumeMountPoint WinAPI_GetWindow WinAPI_GetWindowDC WinAPI_GetWindowDisplayAffinity WinAPI_GetWindowExt WinAPI_GetWindowFileName WinAPI_GetWindowHeight WinAPI_GetWindowInfo WinAPI_GetWindowLong WinAPI_GetWindowOrg WinAPI_GetWindowPlacement WinAPI_GetWindowRect WinAPI_GetWindowRgn WinAPI_GetWindowRgnBox WinAPI_GetWindowSubclass WinAPI_GetWindowText WinAPI_GetWindowTheme WinAPI_GetWindowThreadProcessId WinAPI_GetWindowWidth WinAPI_GetWorkArea WinAPI_GetWorldTransform WinAPI_GetXYFromPoint WinAPI_GlobalMemoryStatus WinAPI_GradientFill WinAPI_GUIDFromString WinAPI_GUIDFromStringEx WinAPI_HashData WinAPI_HashString WinAPI_HiByte WinAPI_HideCaret WinAPI_HiDWord WinAPI_HiWord WinAPI_InflateRect WinAPI_InitMUILanguage WinAPI_InProcess WinAPI_IntersectClipRect WinAPI_IntersectRect WinAPI_IntToDWord WinAPI_IntToFloat WinAPI_InvalidateRect WinAPI_InvalidateRgn WinAPI_InvertANDBitmap WinAPI_InvertColor WinAPI_InvertRect WinAPI_InvertRgn WinAPI_IOCTL WinAPI_IsAlphaBitmap WinAPI_IsBadCodePtr WinAPI_IsBadReadPtr WinAPI_IsBadStringPtr WinAPI_IsBadWritePtr WinAPI_IsChild WinAPI_IsClassName WinAPI_IsDoorOpen WinAPI_IsElevated WinAPI_IsHungAppWindow WinAPI_IsIconic WinAPI_IsInternetConnected WinAPI_IsLoadKBLayout WinAPI_IsMemory WinAPI_IsNameInExpression WinAPI_IsNetworkAlive WinAPI_IsPathShared WinAPI_IsProcessInJob WinAPI_IsProcessorFeaturePresent WinAPI_IsRectEmpty WinAPI_IsThemeActive WinAPI_IsThemeBackgroundPartiallyTransparent WinAPI_IsThemePartDefined WinAPI_IsValidLocale WinAPI_IsWindow WinAPI_IsWindowEnabled WinAPI_IsWindowUnicode WinAPI_IsWindowVisible WinAPI_IsWow64Process WinAPI_IsWritable WinAPI_IsZoomed WinAPI_Keybd_Event WinAPI_KillTimer WinAPI_LineDDA WinAPI_LineTo WinAPI_LoadBitmap WinAPI_LoadCursor WinAPI_LoadCursorFromFile WinAPI_LoadIcon WinAPI_LoadIconMetric WinAPI_LoadIconWithScaleDown WinAPI_LoadImage WinAPI_LoadIndirectString WinAPI_LoadKeyboardLayout WinAPI_LoadLibrary WinAPI_LoadLibraryEx WinAPI_LoadMedia WinAPI_LoadResource WinAPI_LoadShell32Icon WinAPI_LoadString WinAPI_LoadStringEx WinAPI_LoByte WinAPI_LocalFree WinAPI_LockDevice WinAPI_LockFile WinAPI_LockResource WinAPI_LockWindowUpdate WinAPI_LockWorkStation WinAPI_LoDWord WinAPI_LongMid WinAPI_LookupIconIdFromDirectoryEx WinAPI_LoWord WinAPI_LPtoDP WinAPI_MAKELANGID WinAPI_MAKELCID WinAPI_MakeLong WinAPI_MakeQWord WinAPI_MakeWord WinAPI_MapViewOfFile WinAPI_MapVirtualKey WinAPI_MaskBlt WinAPI_MessageBeep WinAPI_MessageBoxCheck WinAPI_MessageBoxIndirect WinAPI_MirrorIcon WinAPI_ModifyWorldTransform WinAPI_MonitorFromPoint WinAPI_MonitorFromRect WinAPI_MonitorFromWindow WinAPI_Mouse_Event WinAPI_MoveFileEx WinAPI_MoveMemory WinAPI_MoveTo WinAPI_MoveToEx WinAPI_MoveWindow WinAPI_MsgBox WinAPI_MulDiv WinAPI_MultiByteToWideChar WinAPI_MultiByteToWideCharEx WinAPI_NtStatusToDosError WinAPI_OemToChar WinAPI_OffsetClipRgn WinAPI_OffsetPoints WinAPI_OffsetRect WinAPI_OffsetRgn WinAPI_OffsetWindowOrg WinAPI_OpenDesktop WinAPI_OpenFileById WinAPI_OpenFileDlg WinAPI_OpenFileMapping WinAPI_OpenIcon WinAPI_OpenInputDesktop WinAPI_OpenJobObject WinAPI_OpenMutex WinAPI_OpenProcess WinAPI_OpenProcessToken WinAPI_OpenSemaphore WinAPI_OpenThemeData WinAPI_OpenWindowStation WinAPI_PageSetupDlg WinAPI_PaintDesktop WinAPI_PaintRgn WinAPI_ParseURL WinAPI_ParseUserName WinAPI_PatBlt WinAPI_PathAddBackslash WinAPI_PathAddExtension WinAPI_PathAppend WinAPI_PathBuildRoot WinAPI_PathCanonicalize WinAPI_PathCommonPrefix WinAPI_PathCompactPath WinAPI_PathCompactPathEx WinAPI_PathCreateFromUrl WinAPI_PathFindExtension WinAPI_PathFindFileName WinAPI_PathFindNextComponent WinAPI_PathFindOnPath WinAPI_PathGetArgs WinAPI_PathGetCharType WinAPI_PathGetDriveNumber WinAPI_PathIsContentType WinAPI_PathIsDirectory WinAPI_PathIsDirectoryEmpty WinAPI_PathIsExe WinAPI_PathIsFileSpec WinAPI_PathIsLFNFileSpec WinAPI_PathIsRelative WinAPI_PathIsRoot WinAPI_PathIsSameRoot WinAPI_PathIsSystemFolder WinAPI_PathIsUNC WinAPI_PathIsUNCServer WinAPI_PathIsUNCServerShare WinAPI_PathMakeSystemFolder WinAPI_PathMatchSpec WinAPI_PathParseIconLocation WinAPI_PathRelativePathTo WinAPI_PathRemoveArgs WinAPI_PathRemoveBackslash WinAPI_PathRemoveExtension WinAPI_PathRemoveFileSpec WinAPI_PathRenameExtension WinAPI_PathSearchAndQualify WinAPI_PathSkipRoot WinAPI_PathStripPath WinAPI_PathStripToRoot WinAPI_PathToRegion WinAPI_PathUndecorate WinAPI_PathUnExpandEnvStrings WinAPI_PathUnmakeSystemFolder WinAPI_PathUnquoteSpaces WinAPI_PathYetAnotherMakeUniqueName WinAPI_PickIconDlg WinAPI_PlayEnhMetaFile WinAPI_PlaySound WinAPI_PlgBlt WinAPI_PointFromRect WinAPI_PolyBezier WinAPI_PolyBezierTo WinAPI_PolyDraw WinAPI_Polygon WinAPI_PostMessage WinAPI_PrimaryLangId WinAPI_PrintDlg WinAPI_PrintDlgEx WinAPI_PrintWindow WinAPI_ProgIDFromCLSID WinAPI_PtInRect WinAPI_PtInRectEx WinAPI_PtInRegion WinAPI_PtVisible WinAPI_QueryDosDevice WinAPI_QueryInformationJobObject WinAPI_QueryPerformanceCounter WinAPI_QueryPerformanceFrequency WinAPI_RadialGradientFill WinAPI_ReadDirectoryChanges WinAPI_ReadFile WinAPI_ReadProcessMemory WinAPI_Rectangle WinAPI_RectInRegion WinAPI_RectIsEmpty WinAPI_RectVisible WinAPI_RedrawWindow WinAPI_RegCloseKey WinAPI_RegConnectRegistry WinAPI_RegCopyTree WinAPI_RegCopyTreeEx WinAPI_RegCreateKey WinAPI_RegDeleteEmptyKey WinAPI_RegDeleteKey WinAPI_RegDeleteKeyValue WinAPI_RegDeleteTree WinAPI_RegDeleteTreeEx WinAPI_RegDeleteValue WinAPI_RegDisableReflectionKey WinAPI_RegDuplicateHKey WinAPI_RegEnableReflectionKey WinAPI_RegEnumKey WinAPI_RegEnumValue WinAPI_RegFlushKey WinAPI_RegisterApplicationRestart WinAPI_RegisterClass WinAPI_RegisterClassEx WinAPI_RegisterHotKey WinAPI_RegisterPowerSettingNotification WinAPI_RegisterRawInputDevices WinAPI_RegisterShellHookWindow WinAPI_RegisterWindowMessage WinAPI_RegLoadMUIString WinAPI_RegNotifyChangeKeyValue WinAPI_RegOpenKey WinAPI_RegQueryInfoKey WinAPI_RegQueryLastWriteTime WinAPI_RegQueryMultipleValues WinAPI_RegQueryReflectionKey WinAPI_RegQueryValue WinAPI_RegRestoreKey WinAPI_RegSaveKey WinAPI_RegSetValue WinAPI_ReleaseCapture WinAPI_ReleaseDC WinAPI_ReleaseMutex WinAPI_ReleaseSemaphore WinAPI_ReleaseStream WinAPI_RemoveClipboardFormatListener WinAPI_RemoveDirectory WinAPI_RemoveFontMemResourceEx WinAPI_RemoveFontResourceEx WinAPI_RemoveWindowSubclass WinAPI_ReOpenFile WinAPI_ReplaceFile WinAPI_ReplaceTextDlg WinAPI_ResetEvent WinAPI_RestartDlg WinAPI_RestoreDC WinAPI_RGB WinAPI_RotatePoints WinAPI_RoundRect WinAPI_SaveDC WinAPI_SaveFileDlg WinAPI_SaveHBITMAPToFile WinAPI_SaveHICONToFile WinAPI_ScaleWindowExt WinAPI_ScreenToClient WinAPI_SearchPath WinAPI_SelectClipPath WinAPI_SelectClipRgn WinAPI_SelectObject WinAPI_SendMessageTimeout WinAPI_SetActiveWindow WinAPI_SetArcDirection WinAPI_SetBitmapBits WinAPI_SetBitmapDimensionEx WinAPI_SetBkColor WinAPI_SetBkMode WinAPI_SetBoundsRect WinAPI_SetBrushOrg WinAPI_SetCapture WinAPI_SetCaretBlinkTime WinAPI_SetCaretPos WinAPI_SetClassLongEx WinAPI_SetColorAdjustment WinAPI_SetCompression WinAPI_SetCurrentDirectory WinAPI_SetCurrentProcessExplicitAppUserModelID WinAPI_SetCursor WinAPI_SetDCBrushColor WinAPI_SetDCPenColor WinAPI_SetDefaultPrinter WinAPI_SetDeviceGammaRamp WinAPI_SetDIBColorTable WinAPI_SetDIBits WinAPI_SetDIBitsToDevice WinAPI_SetDllDirectory WinAPI_SetEndOfFile WinAPI_SetEnhMetaFileBits WinAPI_SetErrorMode WinAPI_SetEvent WinAPI_SetFileAttributes WinAPI_SetFileInformationByHandleEx WinAPI_SetFilePointer WinAPI_SetFilePointerEx WinAPI_SetFileShortName WinAPI_SetFileValidData WinAPI_SetFocus WinAPI_SetFont WinAPI_SetForegroundWindow WinAPI_SetFRBuffer WinAPI_SetGraphicsMode WinAPI_SetHandleInformation WinAPI_SetInformationJobObject WinAPI_SetKeyboardLayout WinAPI_SetKeyboardState WinAPI_SetLastError WinAPI_SetLayeredWindowAttributes WinAPI_SetLocaleInfo WinAPI_SetMapMode WinAPI_SetMessageExtraInfo WinAPI_SetParent WinAPI_SetPixel WinAPI_SetPolyFillMode WinAPI_SetPriorityClass WinAPI_SetProcessAffinityMask WinAPI_SetProcessShutdownParameters WinAPI_SetProcessWindowStation WinAPI_SetRectRgn WinAPI_SetROP2 WinAPI_SetSearchPathMode WinAPI_SetStretchBltMode WinAPI_SetSysColors WinAPI_SetSystemCursor WinAPI_SetTextAlign WinAPI_SetTextCharacterExtra WinAPI_SetTextColor WinAPI_SetTextJustification WinAPI_SetThemeAppProperties WinAPI_SetThreadDesktop WinAPI_SetThreadErrorMode WinAPI_SetThreadExecutionState WinAPI_SetThreadLocale WinAPI_SetThreadUILanguage WinAPI_SetTimer WinAPI_SetUDFColorMode WinAPI_SetUserGeoID WinAPI_SetUserObjectInformation WinAPI_SetVolumeMountPoint WinAPI_SetWindowDisplayAffinity WinAPI_SetWindowExt WinAPI_SetWindowLong WinAPI_SetWindowOrg WinAPI_SetWindowPlacement WinAPI_SetWindowPos WinAPI_SetWindowRgn WinAPI_SetWindowsHookEx WinAPI_SetWindowSubclass WinAPI_SetWindowText WinAPI_SetWindowTheme WinAPI_SetWinEventHook WinAPI_SetWorldTransform WinAPI_SfcIsFileProtected WinAPI_SfcIsKeyProtected WinAPI_ShellAboutDlg WinAPI_ShellAddToRecentDocs WinAPI_ShellChangeNotify WinAPI_ShellChangeNotifyDeregister WinAPI_ShellChangeNotifyRegister WinAPI_ShellCreateDirectory WinAPI_ShellEmptyRecycleBin WinAPI_ShellExecute WinAPI_ShellExecuteEx WinAPI_ShellExtractAssociatedIcon WinAPI_ShellExtractIcon WinAPI_ShellFileOperation WinAPI_ShellFlushSFCache WinAPI_ShellGetFileInfo WinAPI_ShellGetIconOverlayIndex WinAPI_ShellGetImageList WinAPI_ShellGetKnownFolderIDList WinAPI_ShellGetKnownFolderPath WinAPI_ShellGetLocalizedName WinAPI_ShellGetPathFromIDList WinAPI_ShellGetSetFolderCustomSettings WinAPI_ShellGetSettings WinAPI_ShellGetSpecialFolderLocation WinAPI_ShellGetSpecialFolderPath WinAPI_ShellGetStockIconInfo WinAPI_ShellILCreateFromPath WinAPI_ShellNotifyIcon WinAPI_ShellNotifyIconGetRect WinAPI_ShellObjectProperties WinAPI_ShellOpenFolderAndSelectItems WinAPI_ShellOpenWithDlg WinAPI_ShellQueryRecycleBin WinAPI_ShellQueryUserNotificationState WinAPI_ShellRemoveLocalizedName WinAPI_ShellRestricted WinAPI_ShellSetKnownFolderPath WinAPI_ShellSetLocalizedName WinAPI_ShellSetSettings WinAPI_ShellStartNetConnectionDlg WinAPI_ShellUpdateImage WinAPI_ShellUserAuthenticationDlg WinAPI_ShellUserAuthenticationDlgEx WinAPI_ShortToWord WinAPI_ShowCaret WinAPI_ShowCursor WinAPI_ShowError WinAPI_ShowLastError WinAPI_ShowMsg WinAPI_ShowOwnedPopups WinAPI_ShowWindow WinAPI_ShutdownBlockReasonCreate WinAPI_ShutdownBlockReasonDestroy WinAPI_ShutdownBlockReasonQuery WinAPI_SizeOfResource WinAPI_StretchBlt WinAPI_StretchDIBits WinAPI_StrFormatByteSize WinAPI_StrFormatByteSizeEx WinAPI_StrFormatKBSize WinAPI_StrFromTimeInterval WinAPI_StringFromGUID WinAPI_StringLenA WinAPI_StringLenW WinAPI_StrLen WinAPI_StrokeAndFillPath WinAPI_StrokePath WinAPI_StructToArray WinAPI_SubLangId WinAPI_SubtractRect WinAPI_SwapDWord WinAPI_SwapQWord WinAPI_SwapWord WinAPI_SwitchColor WinAPI_SwitchDesktop WinAPI_SwitchToThisWindow WinAPI_SystemParametersInfo WinAPI_TabbedTextOut WinAPI_TerminateJobObject WinAPI_TerminateProcess WinAPI_TextOut WinAPI_TileWindows WinAPI_TrackMouseEvent WinAPI_TransparentBlt WinAPI_TwipsPerPixelX WinAPI_TwipsPerPixelY WinAPI_UnhookWindowsHookEx WinAPI_UnhookWinEvent WinAPI_UnionRect WinAPI_UnionStruct WinAPI_UniqueHardwareID WinAPI_UnloadKeyboardLayout WinAPI_UnlockFile WinAPI_UnmapViewOfFile WinAPI_UnregisterApplicationRestart WinAPI_UnregisterClass WinAPI_UnregisterHotKey WinAPI_UnregisterPowerSettingNotification WinAPI_UpdateLayeredWindow WinAPI_UpdateLayeredWindowEx WinAPI_UpdateLayeredWindowIndirect WinAPI_UpdateResource WinAPI_UpdateWindow WinAPI_UrlApplyScheme WinAPI_UrlCanonicalize WinAPI_UrlCombine WinAPI_UrlCompare WinAPI_UrlCreateFromPath WinAPI_UrlFixup WinAPI_UrlGetPart WinAPI_UrlHash WinAPI_UrlIs WinAPI_UserHandleGrantAccess WinAPI_ValidateRect WinAPI_ValidateRgn WinAPI_VerQueryRoot WinAPI_VerQueryValue WinAPI_VerQueryValueEx WinAPI_WaitForInputIdle WinAPI_WaitForMultipleObjects WinAPI_WaitForSingleObject WinAPI_WideCharToMultiByte WinAPI_WidenPath WinAPI_WindowFromDC WinAPI_WindowFromPoint WinAPI_WordToShort WinAPI_Wow64EnableWow64FsRedirection WinAPI_WriteConsole WinAPI_WriteFile WinAPI_WriteProcessMemory WinAPI_ZeroMemory WinNet_AddConnection WinNet_AddConnection2 WinNet_AddConnection3 WinNet_CancelConnection WinNet_CancelConnection2 WinNet_CloseEnum WinNet_ConnectionDialog WinNet_ConnectionDialog1 WinNet_DisconnectDialog WinNet_DisconnectDialog1 WinNet_EnumResource WinNet_GetConnection WinNet_GetConnectionPerformance WinNet_GetLastError WinNet_GetNetworkInformation WinNet_GetProviderName WinNet_GetResourceInformation WinNet_GetResourceParent WinNet_GetUniversalName WinNet_GetUser WinNet_OpenEnum WinNet_RestoreConnection WinNet_UseConnection Word_Create Word_DocAdd Word_DocAttach Word_DocClose Word_DocExport Word_DocFind Word_DocFindReplace Word_DocGet Word_DocLinkAdd Word_DocLinkGet Word_DocOpen Word_DocPictureAdd Word_DocPrint Word_DocRangeSet Word_DocSave Word_DocSaveAs Word_DocTableRead Word_DocTableWrite Word_Quit",I={ -v:[e.C(";","$",{r:0}),e.C("#cs","#ce"),e.C("#comments-start","#comments-end")]},n={b:"\\$[A-z0-9_]+"},l={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},o={v:[e.BNM,e.CNM]},a={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"include include-once NoTrayIcon OnAutoItStartRegister RequireAdmin pragma Au3Stripper_Ignore_Funcs Au3Stripper_Ignore_Variables Au3Stripper_Off Au3Stripper_On Au3Stripper_Parameters AutoIt3Wrapper_Add_Constants AutoIt3Wrapper_Au3Check_Parameters AutoIt3Wrapper_Au3Check_Stop_OnWarning AutoIt3Wrapper_Aut2Exe AutoIt3Wrapper_AutoIt3 AutoIt3Wrapper_AutoIt3Dir AutoIt3Wrapper_Change2CUI AutoIt3Wrapper_Compile_Both AutoIt3Wrapper_Compression AutoIt3Wrapper_EndIf AutoIt3Wrapper_Icon AutoIt3Wrapper_If_Compile AutoIt3Wrapper_If_Run AutoIt3Wrapper_Jump_To_First_Error AutoIt3Wrapper_OutFile AutoIt3Wrapper_OutFile_Type AutoIt3Wrapper_OutFile_X64 AutoIt3Wrapper_PlugIn_Funcs AutoIt3Wrapper_Res_Comment Autoit3Wrapper_Res_Compatibility AutoIt3Wrapper_Res_Description AutoIt3Wrapper_Res_Field AutoIt3Wrapper_Res_File_Add AutoIt3Wrapper_Res_FileVersion AutoIt3Wrapper_Res_FileVersion_AutoIncrement AutoIt3Wrapper_Res_Icon_Add AutoIt3Wrapper_Res_Language AutoIt3Wrapper_Res_LegalCopyright AutoIt3Wrapper_Res_ProductVersion AutoIt3Wrapper_Res_requestedExecutionLevel AutoIt3Wrapper_Res_SaveSource AutoIt3Wrapper_Run_After AutoIt3Wrapper_Run_Au3Check AutoIt3Wrapper_Run_Au3Stripper AutoIt3Wrapper_Run_Before AutoIt3Wrapper_Run_Debug_Mode AutoIt3Wrapper_Run_SciTE_Minimized AutoIt3Wrapper_Run_SciTE_OutputPane_Minimized AutoIt3Wrapper_Run_Tidy AutoIt3Wrapper_ShowProgress AutoIt3Wrapper_Testing AutoIt3Wrapper_Tidy_Stop_OnError AutoIt3Wrapper_UPX_Parameters AutoIt3Wrapper_UseUPX AutoIt3Wrapper_UseX64 AutoIt3Wrapper_Version AutoIt3Wrapper_Versioning AutoIt3Wrapper_Versioning_Parameters Tidy_Off Tidy_On Tidy_Parameters EndRegion Region"},c:[{b:/\\\n/,r:0},{bK:"include",k:{"meta-keyword":"include"},e:"$",c:[l,{cN:"meta-string",v:[{b:"<",e:">"},{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]}]},l,I]},_={cN:"symbol",b:"@[A-z0-9_]+"},G={cN:"function",bK:"Func",e:"$",i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:[n,l,o]}]};return{cI:!0,i:/\/\*/,k:{keyword:t,built_in:i,literal:r},c:[I,n,l,o,a,_,G]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},r={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},o={cN:"literal",b:/\$(null|true|false)\b/},a={cN:"string",b:/"/,e:/"/,c:[t,r,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},i={cN:"string",b:/'/,e:/'/};return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Content Add-History Add-Member Add-PSSnapin Clear-Content Clear-Item Clear-Item Property Clear-Variable Compare-Object ConvertFrom-SecureString Convert-Path ConvertTo-Html ConvertTo-SecureString Copy-Item Copy-ItemProperty Export-Alias Export-Clixml Export-Console Export-Csv ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-Content Get-Credential Get-Culture Get-Date Get-EventLog Get-ExecutionPolicy Get-Help Get-History Get-Host Get-Item Get-ItemProperty Get-Location Get-Member Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider Get-PSSnapin Get-Service Get-TraceSource Get-UICulture Get-Unique Get-Variable Get-WmiObject Group-Object Import-Alias Import-Clixml Import-Csv Invoke-Expression Invoke-History Invoke-Item Join-Path Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Item New-ItemProperty New-Object New-PSDrive New-Service New-TimeSpan New-Variable Out-Default Out-File Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path Restart-Service Resume-Service Select-Object Select-String Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location Set-PSDebug Set-Service Set-TraceSource Set-Variable Sort-Object Split-Path Start-Service Start-Sleep Start-Transcript Stop-Process Stop-Service Stop-Transcript Suspend-Service Tee-Object Test-Path Trace-Command Update-FormatData Update-TypeData Where-Object Write-Debug Write-Error Write-Host Write-Output Write-Progress Write-Verbose Write-Warning",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[e.HCM,e.NM,a,i,o,r]}});hljs.registerLanguage("clojure-repl",function(e){return{c:[{cN:"meta",b:/^([\w.-]+|\s*#_)=>/,starts:{e:/$/,sL:"clojure"}}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("d",function(e){var t={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},r="(0|[1-9][\\d_]*)",a="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",i="0[bB][01_]+",n="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",_="0[xX]"+n,c="([eE][+-]?"+a+")",d="("+a+"(\\.\\d*|"+c+")|\\d+\\."+a+a+"|\\."+r+c+"?)",o="(0[xX]("+n+"\\."+n+"|\\.?"+n+")[pP][+-]?"+a+")",s="("+r+"|"+i+"|"+_+")",l="("+o+"|"+d+")",u="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",b={cN:"number",b:"\\b"+s+"(L|u|U|Lu|LU|uL|UL)?",r:0},f={cN:"number",b:"\\b("+l+"([fF]|L|i|[fF]i|Li)?|"+s+"(i|[fF]i|Li))",r:0},g={cN:"string",b:"'("+u+"|.)",e:"'",i:"."},h={b:u,r:0},p={cN:"string",b:'"',c:[h],e:'"[cwd]?'},m={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5},w={cN:"string",b:"`",e:"`[cwd]?"},N={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10},A={cN:"string",b:'q"\\{',e:'\\}"'},F={cN:"meta",b:"^#!",e:"$",r:5},y={cN:"meta",b:"#(line)",e:"$",r:5},L={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"},v=e.C("\\/\\+","\\+\\/",{c:["self"],r:10});return{l:e.UIR,k:t,c:[e.CLCM,e.CBCM,v,N,p,m,w,A,f,b,g,F,y,L]}});hljs.registerLanguage("armasm",function(s){return{cI:!0,aliases:["arm"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},c:[{cN:"keyword",b:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?",e:"\\s"},s.C("[;@]","$",{r:0}),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"[#$=]?0x[0-9a-f]+"},{b:"[#$=]?0b[01]+"},{b:"[#$=]\\d+"},{b:"\\b\\d+"}],r:0},{cN:"symbol",v:[{b:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"[=#]\\w+"}],r:0}]}});hljs.registerLanguage("json",function(e){var t={literal:"true false null"},i=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:i,k:t},s={b:"{",e:"}",c:[{cN:"attr",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[e.BE],i:"\\n",starts:r}],i:"\\S"},n={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return i.splice(i.length,0,s,n),{c:i,k:t,i:"\\S"}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl"],k:t,c:o}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("dos",function(e){var r=e.C(/@?rem\b/,/$/,{r:10}),t={cN:"symbol",b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",r:0};return{aliases:["bat","cmd"],cI:!0,i:/\/\*/,k:{keyword:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",built_in:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux shift cd dir echo setlocal endlocal set pause copy append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color comp compact convert date dir diskcomp diskcopy doskey erase fs find findstr format ftype graftabl help keyb label md mkdir mode more move path pause print popd pushd promt rd recover rem rename replace restore rmdir shiftsort start subst time title tree type ver verify vol ping net ipconfig taskkill xcopy ren del"},c:[{cN:"variable",b:/%%[^ ]|%[^ ]+?%|![^ ]+?!/},{cN:"function",b:t.b,e:"goto:eof",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),r]},{cN:"number",b:"\\b\\d+",r:0},r]}});hljs.registerLanguage("xml",function(s){var t="[A-Za-z0-9\\._:-]+",e={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php"},r={eW:!0,i:/]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[r],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[r],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},e,{cN:"meta",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},r]}]}});hljs.registerLanguage("tex",function(c){var e={cN:"tag",b:/\\/,r:0,c:[{cN:"name",v:[{b:/[a-zA-Zа-яА-я]+[*]?/},{b:/[^a-zA-Zа-яА-я0-9]/}],starts:{eW:!0,r:0,c:[{cN:"string",v:[{b:/\[/,e:/\]/},{b:/\{/,e:/\}/}]},{b:/\s*=\s*/,eW:!0,r:0,c:[{cN:"number",b:/-?\d*\.?\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?/}]}]}}]};return{c:[e,{cN:"formula",c:[e],r:0,v:[{b:/\$\$/,e:/\$\$/},{b:/\$/,e:/\$/}]},c.C("%","$",{r:0})]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[t.inherit(t.QSM,{b:'((u8?|U)|L)?"'}),{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},i={cN:"number",v:[{b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{b:t.CNR}],r:0},s={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:"<",e:">",i:"\\n"}]},r,t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"};return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{bK:"new throw return else",r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,i]},t.CLCM,t.CBCM,s]}]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\s*\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"']+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"(AV|CA|CF|CG|CI|MK|MP|NS|UI|XC)\\w+"},i={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},n=/[a-zA-Z@][a-zA-Z0-9_]*/,o="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:i,l:n,i:""}]}]},{cN:"class",b:"("+o.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:o,l:n,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]},s={b:"{",e:"}",c:n.c};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,s,i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("applescript",function(e){var t=e.inherit(e.QSM,{i:""}),r={cN:"params",b:"\\(",e:"\\)",c:["self",e.CNM,t]},i=e.C("--","$"),o=e.C("\\(\\*","\\*\\)",{c:["self",i]}),n=[i,o,e.HCM];return{aliases:["osascript"],k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without",literal:"AppleScript false linefeed return pi quote result space tab true",built_in:"alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[t,e.CNM,{cN:"built_in",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"literal",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference)|POSIX file|POSIX path|(date|time) string|quoted form)\\b"},{bK:"on",i:"[${=;\\n]",c:[e.UTM,r]}].concat(n),i:"//|->|=>|\\[\\["}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke",e:/;/,eW:!0,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes c cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle d data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration e each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract f failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function g general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http i id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists k keep keep_duplicates key keys kill l language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim m main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex n name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding p package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime t table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("fsharp",function(e){var t={b:"<",e:">",c:[e.inherit(e.TM,{b:/'[a-zA-Z0-9_]+/})]};return{aliases:["fs"],k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",i:/\/\*/,c:[{cN:"keyword",b:/\b(yield|return|let|do)!/},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},e.C("\\(\\*","\\*\\)"),{cN:"class",bK:"type",e:"\\(|=|$",eE:!0,c:[e.UTM,t]},{cN:"meta",b:"\\[<",e:">\\]",r:10},{cN:"symbol",b:"\\B('[A-Za-z])\\b",c:[e.BE]},e.CLCM,e.inherit(e.QSM,{i:null}),e.CNM]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",c="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",r={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[r]}),e.C("^\\=begin","^\\=end",{c:[r],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:c},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:c},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var o="[>?]>",l="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+o+"|"+l+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:c,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("java",function(e){var a=e.UIR+"(<("+e.UIR+"|\\s*,\\s*)+>)?",t="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private",r="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:r,r:0};return{aliases:["jsp"],k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+a+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("cos",function(e){var r={cN:"string",v:[{b:'"',e:'"',c:[{b:'""',r:0}]}]},t={cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)",r:0},s=(e.IR+"\\s*\\(",{keyword:["break","catch","close","continue","do","d","else","elseif","for","goto","halt","hang","h","if","job","j","kill","k","lock","l","merge","new","open","quit","q","read","r","return","set","s","tcommit","throw","trollback","try","tstart","use","view","while","write","w","xecute","x","zkill","znspace","zn","ztrap","zwrite","zw","zzdump","zzwrite","print","zbreak","zinsert","zload","zprint","zremove","zsave","zzprint","mv","mvcall","mvcrt","mvdim","mvprint","zquit","zsync","ascii"].join(" ")});return{cI:!0,aliases:["cos","cls"],k:s,c:[t,r,e.CLCM,e.CBCM,{cN:"built_in",b:/\$\$?[a-zA-Z]+/},{cN:"keyword",b:/\$\$\$[a-zA-Z]+/},{cN:"symbol",b:/\^%?[a-zA-Z][\w]*/},{cN:"keyword",b:/##class/},{b:/&sql\(/,e:/\)/,eB:!0,eE:!0,sL:"sql"},{b:/&(js|jscript|javascript)/,eB:!0,eE:!0,sL:"javascript"},{b:/&html<\s*\s*>/,sL:"xml"}]}}); \ No newline at end of file diff --git a/public/content/scripts/sakura.js b/public/content/scripts/sakura.js deleted file mode 100644 index 3d9f90c..0000000 --- a/public/content/scripts/sakura.js +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Shared client side code - */ -// Meta functions -var Sakura = (function () { - function Sakura() { - } - // Get or set a cookie value - Sakura.cookie = function (name, value) { - if (value === void 0) { value = null; } - // If value is null only get the cookie's value - if (value) { - // Delete the old instance - document.cookie = this.cookiePrefix + name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT; path=' + this.cookiePath; - // Assign the cookie - document.cookie = this.cookiePrefix + name + '=' + value + '; path=' + this.cookiePath; - // Pass the value through - return value; - } - else { - // Perform a regex on document.cookie - var get = new RegExp('(^|; )' + encodeURIComponent(this.cookiePrefix + name) + '=([^;]*)').exec(document.cookie); - // If anything was returned return it (professional phrasing) - return get ? get[2] : ''; - } - }; - // Unix timestamp - Sakura.epoch = function () { - return Math.floor(Date.now() / 1000); - }; - // Toggle a class - Sakura.toggleClass = function (element, name) { - // Check if the class already exists and if not add it - if (element.className.indexOf(name) < 0) { - element.className += ' ' + name; - } - else { - element.className = element.className.replace(name, '').trim(); - } - }; - // Remove every element with a specific class name - Sakura.removeByClass = function (name) { - // Get the elements - var objs = document.getElementsByClassName(name); - // Use a while loop to remove each element - while (objs.length > 0) { - objs[0].parentNode.removeChild(objs[0]); - } - }; - // Remove a single element with a specific id - Sakura.removeById = function (id) { - // Get the element - var obj = document.getElementById(id); - // If the element exists use the parent node to remove it - if (typeof (obj) != "undefined" && obj !== null) { - obj.parentNode.removeChild(obj); - } - }; - // Alternative for Math.log2() since it's still experimental - Sakura.log2 = function (num) { - return Math.log(num) / Math.log(2); - }; - // Get the number of unique characters in a string - Sakura.unique = function (string) { - // Store the already found character - var used = []; - // The amount of characters we've already found - var count = 0; - // Count the amount of unique characters - for (var i = 0; i < string.length; i++) { - // Check if we already counted this character - if (used.indexOf(string[i]) == -1) { - // Push the character into the used array - used.push(string[i]); - // Up the count - count++; - } - } - // Return the count - return count; - }; - // Calculate password entropy - Sakura.entropy = function (string) { - // Decode utf-8 encoded characters - string = utf8.decode(string); - // Count the unique characters in the string - var unique = this.unique(string); - // Do the entropy calculation - return unique * this.log2(256); - }; - // Validate string lengths - Sakura.stringLength = function (string, minimum, maximum) { - // Get length of string - var length = string.length; - // Check if it meets the minimum/maximum - if (length < minimum || length > maximum) { - return false; - } - // If it passes both return true - return true; - }; - // Validate email address formats - Sakura.validateEmail = function (email) { - // RFC compliant e-mail address regex - var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,48})+$/; - // Test it on the email var which'll return a boolean - return re.test(email); - }; - // Calculate the time that has elapsed since a certain data (doesn't take leap years in account). - Sakura.timeElapsed = function (timestamp, append, none) { - if (append === void 0) { append = ' ago'; } - if (none === void 0) { none = 'Just now'; } - // Subtract the entered timestamp from the current timestamp - var time = this.epoch() - timestamp; - // If the new timestamp is below 1 return a standard string - if (time < 1) { - return none; - } - // Times array - var times = { - 31536000: ['year', 'a'], - 2592000: ['month', 'a'], - 604800: ['week', 'a'], - 86400: ['day', 'a'], - 3600: ['hour', 'an'], - 60: ['minute', 'a'], - 1: ['second', 'a'] - }; - // - var timeKeys = Object.keys(times).reverse(); - // Iterate over the times - for (var i in timeKeys) { - // Do a devision to check if the given timestamp fits in the current "type" - var calc = time / parseInt(timeKeys[i]); - // Check if we have a match - if (calc >= 1) { - // Round the number - var display = Math.floor(calc); - // Return the formatted string - return (display === 1 ? times[timeKeys[i]][1] : display) + " " + times[timeKeys[i]][0] + (display === 1 ? '' : 's') + append; - } - } - // If everything fails just return none - return none; - }; - Sakura.cookiePrefix = ""; // Cookie prefix, gets prepended to cookie names - Sakura.cookiePath = "/"; // Cookie path, can in most cases be left untouched - return Sakura; -})(); -// UTF-8 functions -var utf8 = (function () { - function utf8() { - } - // Encode a utf-8 string - utf8.encode = function (string) { - return unescape(encodeURIComponent(string)); - }; - // Decode a utf-8 string - utf8.decode = function (string) { - return decodeURIComponent(escape(string)); - }; - return utf8; -})(); -// HTTP methods -var HTTPMethods; -(function (HTTPMethods) { - HTTPMethods[HTTPMethods["GET"] = 0] = "GET"; - HTTPMethods[HTTPMethods["HEAD"] = 1] = "HEAD"; - HTTPMethods[HTTPMethods["POST"] = 2] = "POST"; - HTTPMethods[HTTPMethods["PUT"] = 3] = "PUT"; - HTTPMethods[HTTPMethods["DELETE"] = 4] = "DELETE"; -})(HTTPMethods || (HTTPMethods = {})); -// AJAX functions -var AJAX = (function () { - // Prepares the XMLHttpRequest and stuff - function AJAX() { - this.send = null; - this.request = new XMLHttpRequest(); - this.callbacks = new Object(); - this.headers = new Object(); - } - // Start - AJAX.prototype.start = function (method) { - var _this = this; - // Open the connection - this.request.open(HTTPMethods[method], this.url, true); - // Set headers - this.prepareHeaders(); - // Watch the ready state - this.request.onreadystatechange = function () { - // Only invoke when complete - if (_this.request.readyState === 4) { - // Check if a callback if present - if ((typeof _this.callbacks[_this.request.status]).toLowerCase() === 'function') { - _this.callbacks[_this.request.status](); - } - else { - if ((typeof _this.callbacks['0']).toLowerCase() === 'function') { - // Call that - _this.callbacks['0'](); - } - } - } - }; - this.request.send(this.send); - }; - // Stop - AJAX.prototype.stop = function () { - this.request = null; - }; - // Add post data - AJAX.prototype.setSend = function (data) { - // Storage array - var store = new Array(); - // Iterate over the object and them in the array with an equals sign inbetween - for (var item in data) { - store.push(encodeURIComponent(item) + "=" + encodeURIComponent(data[item])); - } - // Assign to send - this.send = store.join('&'); - }; - // Set raw post - AJAX.prototype.setRawSend = function (data) { - this.send = data; - }; - // Get response - AJAX.prototype.response = function () { - return this.request.responseText; - }; - // Set charset - AJAX.prototype.contentType = function (type, charset) { - if (charset === void 0) { charset = null; } - this.addHeader('Content-Type', type + ';charset=' + (charset ? charset : 'utf-8')); - }; - // Add a header - AJAX.prototype.addHeader = function (name, value) { - // Attempt to remove a previous instance - this.removeHeader(name); - // Add the new header - this.headers[name] = value; - }; - // Remove a header - AJAX.prototype.removeHeader = function (name) { - if ((typeof this.headers[name]).toLowerCase() !== 'undefined') { - delete this.headers[name]; - } - }; - // Prepare request headers - AJAX.prototype.prepareHeaders = function () { - for (var header in this.headers) { - this.request.setRequestHeader(header, this.headers[header]); - } - }; - // Adds a callback - AJAX.prototype.addCallback = function (status, callback) { - // Attempt to remove previous instances - this.removeCallback(status); - // Add the new callback - this.callbacks[status] = callback; - }; - // Delete a callback - AJAX.prototype.removeCallback = function (status) { - // Delete the callback if present - if ((typeof this.callbacks[status]).toLowerCase() === 'function') { - delete this.callbacks[status]; - } - }; - // Sets the URL - AJAX.prototype.setUrl = function (url) { - this.url = url; - }; - return AJAX; -})(); diff --git a/public/content/sounds/dicks.mp3 b/public/content/sounds/dicks.mp3 deleted file mode 100644 index f423322..0000000 Binary files a/public/content/sounds/dicks.mp3 and /dev/null differ diff --git a/public/content/sounds/dicks.ogg b/public/content/sounds/dicks.ogg deleted file mode 100644 index 379fcfb..0000000 Binary files a/public/content/sounds/dicks.ogg and /dev/null differ diff --git a/public/content/sounds/mewow.mp3 b/public/content/sounds/mewow.mp3 deleted file mode 100644 index 0f83543..0000000 Binary files a/public/content/sounds/mewow.mp3 and /dev/null differ diff --git a/public/content/sounds/mewow.ogg b/public/content/sounds/mewow.ogg deleted file mode 100644 index 9034bed..0000000 Binary files a/public/content/sounds/mewow.ogg and /dev/null differ diff --git a/public/error.css b/public/error.css new file mode 100644 index 0000000..608c8a5 --- /dev/null +++ b/public/error.css @@ -0,0 +1,107 @@ +/* + * i'll just throw this here for now since i haven't properly figured out something yet + */ + +html, +body { + min-height: 100%; + width: 90; +} + +html { + background: url('/images/satori-error.png') top right no-repeat #FFF; + font-family: 'verdana', sans-serif; + font-size: .8em; +} + +body { + margin: 0 2em; +} + +#wrap { + max-width: 34em; +} + +h1, +h2, +h3, +p { + margin: 0; + padding: 0; + font-size: 1em; + font-weight: normal; +} + +h1 { + font-size: 1.5em; + margin: 1.33em 0; +} + +h1 img { + margin: 0 .5em -.75em 0; +} + +p { + padding: 0; + margin: 2em 0; + line-height: 1.33em; +} + +hr { + margin: 1.9em 0; + background: #BBB; + border: none; +} + +ul { + padding: .75em 0 0 0; +} + +li { + margin: 0 0 .8em 3.46em; + line-height: 1.32em; +} + +a { + color: red; +} + +img+a:before { + content: " "; +} + +h3 { + margin: 2.5em 0; +} + +li:nth-child(3) img { + margin: -0.2em 0; +} + +li:nth-child(4) img { + margin: -0.5em 0; +} + +table { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 0; + display: none; +} + +table, +tr, +td { + background: rgba(0, 0, 0, .2); + height: 100%; + width: 100%; + text-align: center; +} + +table img { + border-radius: 32px; + box-shadow: 0 4px 32px #888; +} diff --git a/public/content/data/yuuno/images/404-back.gif b/public/images/404-back.gif similarity index 100% rename from public/content/data/yuuno/images/404-back.gif rename to public/images/404-back.gif diff --git a/public/content/data/yuuno/images/404-info.gif b/public/images/404-info.gif similarity index 100% rename from public/content/data/yuuno/images/404-info.gif rename to public/images/404-info.gif diff --git a/public/content/data/yuuno/images/404-search.gif b/public/images/404-search.gif similarity index 100% rename from public/content/data/yuuno/images/404-search.gif rename to public/images/404-search.gif diff --git a/public/images/access-denied.png b/public/images/access-denied.png new file mode 100644 index 0000000..d5ca465 Binary files /dev/null and b/public/images/access-denied.png differ diff --git a/public/images/aitemu-ban.png b/public/images/aitemu-ban.png new file mode 100644 index 0000000..02863ff Binary files /dev/null and b/public/images/aitemu-ban.png differ diff --git a/public/images/aitemu-none.png b/public/images/aitemu-none.png new file mode 100644 index 0000000..fee93ba Binary files /dev/null and b/public/images/aitemu-none.png differ diff --git a/public/images/default-banner.png b/public/images/default-banner.png new file mode 100644 index 0000000..6dfa051 Binary files /dev/null and b/public/images/default-banner.png differ diff --git a/public/images/enable-javascript.png b/public/images/enable-javascript.png new file mode 100644 index 0000000..2be0223 Binary files /dev/null and b/public/images/enable-javascript.png differ diff --git a/public/content/images/flags/ad.png b/public/images/flags/ad.png similarity index 100% rename from public/content/images/flags/ad.png rename to public/images/flags/ad.png diff --git a/public/content/images/flags/ae.png b/public/images/flags/ae.png similarity index 100% rename from public/content/images/flags/ae.png rename to public/images/flags/ae.png diff --git a/public/content/images/flags/af.png b/public/images/flags/af.png similarity index 100% rename from public/content/images/flags/af.png rename to public/images/flags/af.png diff --git a/public/content/images/flags/ag.png b/public/images/flags/ag.png similarity index 100% rename from public/content/images/flags/ag.png rename to public/images/flags/ag.png diff --git a/public/content/images/flags/ai.png b/public/images/flags/ai.png similarity index 100% rename from public/content/images/flags/ai.png rename to public/images/flags/ai.png diff --git a/public/content/images/flags/al.png b/public/images/flags/al.png similarity index 100% rename from public/content/images/flags/al.png rename to public/images/flags/al.png diff --git a/public/content/images/flags/am.png b/public/images/flags/am.png similarity index 100% rename from public/content/images/flags/am.png rename to public/images/flags/am.png diff --git a/public/content/images/flags/an.png b/public/images/flags/an.png similarity index 100% rename from public/content/images/flags/an.png rename to public/images/flags/an.png diff --git a/public/content/images/flags/ao.png b/public/images/flags/ao.png similarity index 100% rename from public/content/images/flags/ao.png rename to public/images/flags/ao.png diff --git a/public/content/images/flags/ar.png b/public/images/flags/ar.png similarity index 100% rename from public/content/images/flags/ar.png rename to public/images/flags/ar.png diff --git a/public/content/images/flags/as.png b/public/images/flags/as.png similarity index 100% rename from public/content/images/flags/as.png rename to public/images/flags/as.png diff --git a/public/content/images/flags/at.png b/public/images/flags/at.png similarity index 100% rename from public/content/images/flags/at.png rename to public/images/flags/at.png diff --git a/public/content/images/flags/au.png b/public/images/flags/au.png similarity index 100% rename from public/content/images/flags/au.png rename to public/images/flags/au.png diff --git a/public/content/images/flags/aw.png b/public/images/flags/aw.png similarity index 100% rename from public/content/images/flags/aw.png rename to public/images/flags/aw.png diff --git a/public/content/images/flags/ax.png b/public/images/flags/ax.png similarity index 100% rename from public/content/images/flags/ax.png rename to public/images/flags/ax.png diff --git a/public/content/images/flags/az.png b/public/images/flags/az.png similarity index 100% rename from public/content/images/flags/az.png rename to public/images/flags/az.png diff --git a/public/content/images/flags/ba.png b/public/images/flags/ba.png similarity index 100% rename from public/content/images/flags/ba.png rename to public/images/flags/ba.png diff --git a/public/content/images/flags/bb.png b/public/images/flags/bb.png similarity index 100% rename from public/content/images/flags/bb.png rename to public/images/flags/bb.png diff --git a/public/content/images/flags/bd.png b/public/images/flags/bd.png similarity index 100% rename from public/content/images/flags/bd.png rename to public/images/flags/bd.png diff --git a/public/content/images/flags/be.png b/public/images/flags/be.png similarity index 100% rename from public/content/images/flags/be.png rename to public/images/flags/be.png diff --git a/public/content/images/flags/bf.png b/public/images/flags/bf.png similarity index 100% rename from public/content/images/flags/bf.png rename to public/images/flags/bf.png diff --git a/public/content/images/flags/bg.png b/public/images/flags/bg.png similarity index 100% rename from public/content/images/flags/bg.png rename to public/images/flags/bg.png diff --git a/public/content/images/flags/bh.png b/public/images/flags/bh.png similarity index 100% rename from public/content/images/flags/bh.png rename to public/images/flags/bh.png diff --git a/public/content/images/flags/bi.png b/public/images/flags/bi.png similarity index 100% rename from public/content/images/flags/bi.png rename to public/images/flags/bi.png diff --git a/public/content/images/flags/bj.png b/public/images/flags/bj.png similarity index 100% rename from public/content/images/flags/bj.png rename to public/images/flags/bj.png diff --git a/public/content/images/flags/bm.png b/public/images/flags/bm.png similarity index 100% rename from public/content/images/flags/bm.png rename to public/images/flags/bm.png diff --git a/public/content/images/flags/bn.png b/public/images/flags/bn.png similarity index 100% rename from public/content/images/flags/bn.png rename to public/images/flags/bn.png diff --git a/public/content/images/flags/bo.png b/public/images/flags/bo.png similarity index 100% rename from public/content/images/flags/bo.png rename to public/images/flags/bo.png diff --git a/public/content/images/flags/br.png b/public/images/flags/br.png similarity index 100% rename from public/content/images/flags/br.png rename to public/images/flags/br.png diff --git a/public/content/images/flags/bs.png b/public/images/flags/bs.png similarity index 100% rename from public/content/images/flags/bs.png rename to public/images/flags/bs.png diff --git a/public/content/images/flags/bt.png b/public/images/flags/bt.png similarity index 100% rename from public/content/images/flags/bt.png rename to public/images/flags/bt.png diff --git a/public/content/images/flags/bv.png b/public/images/flags/bv.png similarity index 100% rename from public/content/images/flags/bv.png rename to public/images/flags/bv.png diff --git a/public/content/images/flags/bw.png b/public/images/flags/bw.png similarity index 100% rename from public/content/images/flags/bw.png rename to public/images/flags/bw.png diff --git a/public/content/images/flags/by.png b/public/images/flags/by.png similarity index 100% rename from public/content/images/flags/by.png rename to public/images/flags/by.png diff --git a/public/content/images/flags/bz.png b/public/images/flags/bz.png similarity index 100% rename from public/content/images/flags/bz.png rename to public/images/flags/bz.png diff --git a/public/content/images/flags/ca.png b/public/images/flags/ca.png similarity index 100% rename from public/content/images/flags/ca.png rename to public/images/flags/ca.png diff --git a/public/content/images/flags/cc.png b/public/images/flags/cc.png similarity index 100% rename from public/content/images/flags/cc.png rename to public/images/flags/cc.png diff --git a/public/content/images/flags/cd.png b/public/images/flags/cd.png similarity index 100% rename from public/content/images/flags/cd.png rename to public/images/flags/cd.png diff --git a/public/content/images/flags/cf.png b/public/images/flags/cf.png similarity index 100% rename from public/content/images/flags/cf.png rename to public/images/flags/cf.png diff --git a/public/content/images/flags/cg.png b/public/images/flags/cg.png similarity index 100% rename from public/content/images/flags/cg.png rename to public/images/flags/cg.png diff --git a/public/content/images/flags/ch.png b/public/images/flags/ch.png similarity index 100% rename from public/content/images/flags/ch.png rename to public/images/flags/ch.png diff --git a/public/content/images/flags/ci.png b/public/images/flags/ci.png similarity index 100% rename from public/content/images/flags/ci.png rename to public/images/flags/ci.png diff --git a/public/content/images/flags/ck.png b/public/images/flags/ck.png similarity index 100% rename from public/content/images/flags/ck.png rename to public/images/flags/ck.png diff --git a/public/content/images/flags/cl.png b/public/images/flags/cl.png similarity index 100% rename from public/content/images/flags/cl.png rename to public/images/flags/cl.png diff --git a/public/content/images/flags/cm.png b/public/images/flags/cm.png similarity index 100% rename from public/content/images/flags/cm.png rename to public/images/flags/cm.png diff --git a/public/content/images/flags/cn.png b/public/images/flags/cn.png similarity index 100% rename from public/content/images/flags/cn.png rename to public/images/flags/cn.png diff --git a/public/content/images/flags/co.png b/public/images/flags/co.png similarity index 100% rename from public/content/images/flags/co.png rename to public/images/flags/co.png diff --git a/public/content/images/flags/cr.png b/public/images/flags/cr.png similarity index 100% rename from public/content/images/flags/cr.png rename to public/images/flags/cr.png diff --git a/public/content/images/flags/cs.png b/public/images/flags/cs.png similarity index 100% rename from public/content/images/flags/cs.png rename to public/images/flags/cs.png diff --git a/public/content/images/flags/cu.png b/public/images/flags/cu.png similarity index 100% rename from public/content/images/flags/cu.png rename to public/images/flags/cu.png diff --git a/public/content/images/flags/cv.png b/public/images/flags/cv.png similarity index 100% rename from public/content/images/flags/cv.png rename to public/images/flags/cv.png diff --git a/public/content/images/flags/cx.png b/public/images/flags/cx.png similarity index 100% rename from public/content/images/flags/cx.png rename to public/images/flags/cx.png diff --git a/public/content/images/flags/cy.png b/public/images/flags/cy.png similarity index 100% rename from public/content/images/flags/cy.png rename to public/images/flags/cy.png diff --git a/public/content/images/flags/cz.png b/public/images/flags/cz.png similarity index 100% rename from public/content/images/flags/cz.png rename to public/images/flags/cz.png diff --git a/public/content/images/flags/de.png b/public/images/flags/de.png similarity index 100% rename from public/content/images/flags/de.png rename to public/images/flags/de.png diff --git a/public/content/images/flags/dj.png b/public/images/flags/dj.png similarity index 100% rename from public/content/images/flags/dj.png rename to public/images/flags/dj.png diff --git a/public/content/images/flags/dk.png b/public/images/flags/dk.png similarity index 100% rename from public/content/images/flags/dk.png rename to public/images/flags/dk.png diff --git a/public/content/images/flags/dm.png b/public/images/flags/dm.png similarity index 100% rename from public/content/images/flags/dm.png rename to public/images/flags/dm.png diff --git a/public/content/images/flags/do.png b/public/images/flags/do.png similarity index 100% rename from public/content/images/flags/do.png rename to public/images/flags/do.png diff --git a/public/content/images/flags/dz.png b/public/images/flags/dz.png similarity index 100% rename from public/content/images/flags/dz.png rename to public/images/flags/dz.png diff --git a/public/content/images/flags/ec.png b/public/images/flags/ec.png similarity index 100% rename from public/content/images/flags/ec.png rename to public/images/flags/ec.png diff --git a/public/content/images/flags/ee.png b/public/images/flags/ee.png similarity index 100% rename from public/content/images/flags/ee.png rename to public/images/flags/ee.png diff --git a/public/content/images/flags/eg.png b/public/images/flags/eg.png similarity index 100% rename from public/content/images/flags/eg.png rename to public/images/flags/eg.png diff --git a/public/content/images/flags/eh.png b/public/images/flags/eh.png similarity index 100% rename from public/content/images/flags/eh.png rename to public/images/flags/eh.png diff --git a/public/content/images/flags/er.png b/public/images/flags/er.png similarity index 100% rename from public/content/images/flags/er.png rename to public/images/flags/er.png diff --git a/public/content/images/flags/es.png b/public/images/flags/es.png similarity index 100% rename from public/content/images/flags/es.png rename to public/images/flags/es.png diff --git a/public/content/images/flags/et.png b/public/images/flags/et.png similarity index 100% rename from public/content/images/flags/et.png rename to public/images/flags/et.png diff --git a/public/content/images/flags/fam.png b/public/images/flags/fam.png similarity index 100% rename from public/content/images/flags/fam.png rename to public/images/flags/fam.png diff --git a/public/content/images/flags/fi.png b/public/images/flags/fi.png similarity index 100% rename from public/content/images/flags/fi.png rename to public/images/flags/fi.png diff --git a/public/content/images/flags/fj.png b/public/images/flags/fj.png similarity index 100% rename from public/content/images/flags/fj.png rename to public/images/flags/fj.png diff --git a/public/content/images/flags/fk.png b/public/images/flags/fk.png similarity index 100% rename from public/content/images/flags/fk.png rename to public/images/flags/fk.png diff --git a/public/content/images/flags/fm.png b/public/images/flags/fm.png similarity index 100% rename from public/content/images/flags/fm.png rename to public/images/flags/fm.png diff --git a/public/content/images/flags/fo.png b/public/images/flags/fo.png similarity index 100% rename from public/content/images/flags/fo.png rename to public/images/flags/fo.png diff --git a/public/content/images/flags/fr.png b/public/images/flags/fr.png similarity index 100% rename from public/content/images/flags/fr.png rename to public/images/flags/fr.png diff --git a/public/content/images/flags/ga.png b/public/images/flags/ga.png similarity index 100% rename from public/content/images/flags/ga.png rename to public/images/flags/ga.png diff --git a/public/content/images/flags/gb.png b/public/images/flags/gb.png similarity index 100% rename from public/content/images/flags/gb.png rename to public/images/flags/gb.png diff --git a/public/content/images/flags/gd.png b/public/images/flags/gd.png similarity index 100% rename from public/content/images/flags/gd.png rename to public/images/flags/gd.png diff --git a/public/content/images/flags/ge.png b/public/images/flags/ge.png similarity index 100% rename from public/content/images/flags/ge.png rename to public/images/flags/ge.png diff --git a/public/content/images/flags/gf.png b/public/images/flags/gf.png similarity index 100% rename from public/content/images/flags/gf.png rename to public/images/flags/gf.png diff --git a/public/content/images/flags/gh.png b/public/images/flags/gh.png similarity index 100% rename from public/content/images/flags/gh.png rename to public/images/flags/gh.png diff --git a/public/content/images/flags/gi.png b/public/images/flags/gi.png similarity index 100% rename from public/content/images/flags/gi.png rename to public/images/flags/gi.png diff --git a/public/content/images/flags/gl.png b/public/images/flags/gl.png similarity index 100% rename from public/content/images/flags/gl.png rename to public/images/flags/gl.png diff --git a/public/content/images/flags/gm.png b/public/images/flags/gm.png similarity index 100% rename from public/content/images/flags/gm.png rename to public/images/flags/gm.png diff --git a/public/content/images/flags/gn.png b/public/images/flags/gn.png similarity index 100% rename from public/content/images/flags/gn.png rename to public/images/flags/gn.png diff --git a/public/content/images/flags/gp.png b/public/images/flags/gp.png similarity index 100% rename from public/content/images/flags/gp.png rename to public/images/flags/gp.png diff --git a/public/content/images/flags/gq.png b/public/images/flags/gq.png similarity index 100% rename from public/content/images/flags/gq.png rename to public/images/flags/gq.png diff --git a/public/content/images/flags/gr.png b/public/images/flags/gr.png similarity index 100% rename from public/content/images/flags/gr.png rename to public/images/flags/gr.png diff --git a/public/content/images/flags/gs.png b/public/images/flags/gs.png similarity index 100% rename from public/content/images/flags/gs.png rename to public/images/flags/gs.png diff --git a/public/content/images/flags/gt.png b/public/images/flags/gt.png similarity index 100% rename from public/content/images/flags/gt.png rename to public/images/flags/gt.png diff --git a/public/content/images/flags/gu.png b/public/images/flags/gu.png similarity index 100% rename from public/content/images/flags/gu.png rename to public/images/flags/gu.png diff --git a/public/content/images/flags/gw.png b/public/images/flags/gw.png similarity index 100% rename from public/content/images/flags/gw.png rename to public/images/flags/gw.png diff --git a/public/content/images/flags/gy.png b/public/images/flags/gy.png similarity index 100% rename from public/content/images/flags/gy.png rename to public/images/flags/gy.png diff --git a/public/content/images/flags/hk.png b/public/images/flags/hk.png similarity index 100% rename from public/content/images/flags/hk.png rename to public/images/flags/hk.png diff --git a/public/content/images/flags/hm.png b/public/images/flags/hm.png similarity index 100% rename from public/content/images/flags/hm.png rename to public/images/flags/hm.png diff --git a/public/content/images/flags/hn.png b/public/images/flags/hn.png similarity index 100% rename from public/content/images/flags/hn.png rename to public/images/flags/hn.png diff --git a/public/content/images/flags/hr.png b/public/images/flags/hr.png similarity index 100% rename from public/content/images/flags/hr.png rename to public/images/flags/hr.png diff --git a/public/content/images/flags/ht.png b/public/images/flags/ht.png similarity index 100% rename from public/content/images/flags/ht.png rename to public/images/flags/ht.png diff --git a/public/content/images/flags/hu.png b/public/images/flags/hu.png similarity index 100% rename from public/content/images/flags/hu.png rename to public/images/flags/hu.png diff --git a/public/content/images/flags/id.png b/public/images/flags/id.png similarity index 100% rename from public/content/images/flags/id.png rename to public/images/flags/id.png diff --git a/public/content/images/flags/ie.png b/public/images/flags/ie.png similarity index 100% rename from public/content/images/flags/ie.png rename to public/images/flags/ie.png diff --git a/public/content/images/flags/il.png b/public/images/flags/il.png similarity index 100% rename from public/content/images/flags/il.png rename to public/images/flags/il.png diff --git a/public/content/images/flags/in.png b/public/images/flags/in.png similarity index 100% rename from public/content/images/flags/in.png rename to public/images/flags/in.png diff --git a/public/content/images/flags/io.png b/public/images/flags/io.png similarity index 100% rename from public/content/images/flags/io.png rename to public/images/flags/io.png diff --git a/public/content/images/flags/iq.png b/public/images/flags/iq.png similarity index 100% rename from public/content/images/flags/iq.png rename to public/images/flags/iq.png diff --git a/public/content/images/flags/ir.png b/public/images/flags/ir.png similarity index 100% rename from public/content/images/flags/ir.png rename to public/images/flags/ir.png diff --git a/public/content/images/flags/is.png b/public/images/flags/is.png similarity index 100% rename from public/content/images/flags/is.png rename to public/images/flags/is.png diff --git a/public/content/images/flags/it.png b/public/images/flags/it.png similarity index 100% rename from public/content/images/flags/it.png rename to public/images/flags/it.png diff --git a/public/content/images/flags/jm.png b/public/images/flags/jm.png similarity index 100% rename from public/content/images/flags/jm.png rename to public/images/flags/jm.png diff --git a/public/content/images/flags/jo.png b/public/images/flags/jo.png similarity index 100% rename from public/content/images/flags/jo.png rename to public/images/flags/jo.png diff --git a/public/content/images/flags/jp.png b/public/images/flags/jp.png similarity index 100% rename from public/content/images/flags/jp.png rename to public/images/flags/jp.png diff --git a/public/content/images/flags/ke.png b/public/images/flags/ke.png similarity index 100% rename from public/content/images/flags/ke.png rename to public/images/flags/ke.png diff --git a/public/content/images/flags/kg.png b/public/images/flags/kg.png similarity index 100% rename from public/content/images/flags/kg.png rename to public/images/flags/kg.png diff --git a/public/content/images/flags/kh.png b/public/images/flags/kh.png similarity index 100% rename from public/content/images/flags/kh.png rename to public/images/flags/kh.png diff --git a/public/content/images/flags/ki.png b/public/images/flags/ki.png similarity index 100% rename from public/content/images/flags/ki.png rename to public/images/flags/ki.png diff --git a/public/content/images/flags/km.png b/public/images/flags/km.png similarity index 100% rename from public/content/images/flags/km.png rename to public/images/flags/km.png diff --git a/public/content/images/flags/kn.png b/public/images/flags/kn.png similarity index 100% rename from public/content/images/flags/kn.png rename to public/images/flags/kn.png diff --git a/public/content/images/flags/kp.png b/public/images/flags/kp.png similarity index 100% rename from public/content/images/flags/kp.png rename to public/images/flags/kp.png diff --git a/public/content/images/flags/kr.png b/public/images/flags/kr.png similarity index 100% rename from public/content/images/flags/kr.png rename to public/images/flags/kr.png diff --git a/public/content/images/flags/kw.png b/public/images/flags/kw.png similarity index 100% rename from public/content/images/flags/kw.png rename to public/images/flags/kw.png diff --git a/public/content/images/flags/ky.png b/public/images/flags/ky.png similarity index 100% rename from public/content/images/flags/ky.png rename to public/images/flags/ky.png diff --git a/public/content/images/flags/kz.png b/public/images/flags/kz.png similarity index 100% rename from public/content/images/flags/kz.png rename to public/images/flags/kz.png diff --git a/public/content/images/flags/la.png b/public/images/flags/la.png similarity index 100% rename from public/content/images/flags/la.png rename to public/images/flags/la.png diff --git a/public/content/images/flags/lb.png b/public/images/flags/lb.png similarity index 100% rename from public/content/images/flags/lb.png rename to public/images/flags/lb.png diff --git a/public/content/images/flags/lc.png b/public/images/flags/lc.png similarity index 100% rename from public/content/images/flags/lc.png rename to public/images/flags/lc.png diff --git a/public/content/images/flags/li.png b/public/images/flags/li.png similarity index 100% rename from public/content/images/flags/li.png rename to public/images/flags/li.png diff --git a/public/content/images/flags/lk.png b/public/images/flags/lk.png similarity index 100% rename from public/content/images/flags/lk.png rename to public/images/flags/lk.png diff --git a/public/content/images/flags/lr.png b/public/images/flags/lr.png similarity index 100% rename from public/content/images/flags/lr.png rename to public/images/flags/lr.png diff --git a/public/content/images/flags/ls.png b/public/images/flags/ls.png similarity index 100% rename from public/content/images/flags/ls.png rename to public/images/flags/ls.png diff --git a/public/content/images/flags/lt.png b/public/images/flags/lt.png similarity index 100% rename from public/content/images/flags/lt.png rename to public/images/flags/lt.png diff --git a/public/content/images/flags/lu.png b/public/images/flags/lu.png similarity index 100% rename from public/content/images/flags/lu.png rename to public/images/flags/lu.png diff --git a/public/content/images/flags/lv.png b/public/images/flags/lv.png similarity index 100% rename from public/content/images/flags/lv.png rename to public/images/flags/lv.png diff --git a/public/content/images/flags/ly.png b/public/images/flags/ly.png similarity index 100% rename from public/content/images/flags/ly.png rename to public/images/flags/ly.png diff --git a/public/content/images/flags/ma.png b/public/images/flags/ma.png similarity index 100% rename from public/content/images/flags/ma.png rename to public/images/flags/ma.png diff --git a/public/content/images/flags/mc.png b/public/images/flags/mc.png similarity index 100% rename from public/content/images/flags/mc.png rename to public/images/flags/mc.png diff --git a/public/content/images/flags/md.png b/public/images/flags/md.png similarity index 100% rename from public/content/images/flags/md.png rename to public/images/flags/md.png diff --git a/public/content/images/flags/me.png b/public/images/flags/me.png similarity index 100% rename from public/content/images/flags/me.png rename to public/images/flags/me.png diff --git a/public/content/images/flags/mg.png b/public/images/flags/mg.png similarity index 100% rename from public/content/images/flags/mg.png rename to public/images/flags/mg.png diff --git a/public/content/images/flags/mh.png b/public/images/flags/mh.png similarity index 100% rename from public/content/images/flags/mh.png rename to public/images/flags/mh.png diff --git a/public/content/images/flags/mk.png b/public/images/flags/mk.png similarity index 100% rename from public/content/images/flags/mk.png rename to public/images/flags/mk.png diff --git a/public/content/images/flags/ml.png b/public/images/flags/ml.png similarity index 100% rename from public/content/images/flags/ml.png rename to public/images/flags/ml.png diff --git a/public/content/images/flags/mm.png b/public/images/flags/mm.png similarity index 100% rename from public/content/images/flags/mm.png rename to public/images/flags/mm.png diff --git a/public/content/images/flags/mn.png b/public/images/flags/mn.png similarity index 100% rename from public/content/images/flags/mn.png rename to public/images/flags/mn.png diff --git a/public/content/images/flags/mo.png b/public/images/flags/mo.png similarity index 100% rename from public/content/images/flags/mo.png rename to public/images/flags/mo.png diff --git a/public/content/images/flags/mp.png b/public/images/flags/mp.png similarity index 100% rename from public/content/images/flags/mp.png rename to public/images/flags/mp.png diff --git a/public/content/images/flags/mq.png b/public/images/flags/mq.png similarity index 100% rename from public/content/images/flags/mq.png rename to public/images/flags/mq.png diff --git a/public/content/images/flags/mr.png b/public/images/flags/mr.png similarity index 100% rename from public/content/images/flags/mr.png rename to public/images/flags/mr.png diff --git a/public/content/images/flags/ms.png b/public/images/flags/ms.png similarity index 100% rename from public/content/images/flags/ms.png rename to public/images/flags/ms.png diff --git a/public/content/images/flags/mt.png b/public/images/flags/mt.png similarity index 100% rename from public/content/images/flags/mt.png rename to public/images/flags/mt.png diff --git a/public/content/images/flags/mu.png b/public/images/flags/mu.png similarity index 100% rename from public/content/images/flags/mu.png rename to public/images/flags/mu.png diff --git a/public/content/images/flags/mv.png b/public/images/flags/mv.png similarity index 100% rename from public/content/images/flags/mv.png rename to public/images/flags/mv.png diff --git a/public/content/images/flags/mw.png b/public/images/flags/mw.png similarity index 100% rename from public/content/images/flags/mw.png rename to public/images/flags/mw.png diff --git a/public/content/images/flags/mx.png b/public/images/flags/mx.png similarity index 100% rename from public/content/images/flags/mx.png rename to public/images/flags/mx.png diff --git a/public/content/images/flags/my.png b/public/images/flags/my.png similarity index 100% rename from public/content/images/flags/my.png rename to public/images/flags/my.png diff --git a/public/content/images/flags/mz.png b/public/images/flags/mz.png similarity index 100% rename from public/content/images/flags/mz.png rename to public/images/flags/mz.png diff --git a/public/content/images/flags/na.png b/public/images/flags/na.png similarity index 100% rename from public/content/images/flags/na.png rename to public/images/flags/na.png diff --git a/public/content/images/flags/nc.png b/public/images/flags/nc.png similarity index 100% rename from public/content/images/flags/nc.png rename to public/images/flags/nc.png diff --git a/public/content/images/flags/ne.png b/public/images/flags/ne.png similarity index 100% rename from public/content/images/flags/ne.png rename to public/images/flags/ne.png diff --git a/public/content/images/flags/nf.png b/public/images/flags/nf.png similarity index 100% rename from public/content/images/flags/nf.png rename to public/images/flags/nf.png diff --git a/public/content/images/flags/ng.png b/public/images/flags/ng.png similarity index 100% rename from public/content/images/flags/ng.png rename to public/images/flags/ng.png diff --git a/public/content/images/flags/ni.png b/public/images/flags/ni.png similarity index 100% rename from public/content/images/flags/ni.png rename to public/images/flags/ni.png diff --git a/public/content/images/flags/nl.png b/public/images/flags/nl.png similarity index 100% rename from public/content/images/flags/nl.png rename to public/images/flags/nl.png diff --git a/public/content/images/flags/no.png b/public/images/flags/no.png similarity index 100% rename from public/content/images/flags/no.png rename to public/images/flags/no.png diff --git a/public/content/images/flags/np.png b/public/images/flags/np.png similarity index 100% rename from public/content/images/flags/np.png rename to public/images/flags/np.png diff --git a/public/content/images/flags/nr.png b/public/images/flags/nr.png similarity index 100% rename from public/content/images/flags/nr.png rename to public/images/flags/nr.png diff --git a/public/content/images/flags/nu.png b/public/images/flags/nu.png similarity index 100% rename from public/content/images/flags/nu.png rename to public/images/flags/nu.png diff --git a/public/content/images/flags/nz.png b/public/images/flags/nz.png similarity index 100% rename from public/content/images/flags/nz.png rename to public/images/flags/nz.png diff --git a/public/content/images/flags/om.png b/public/images/flags/om.png similarity index 100% rename from public/content/images/flags/om.png rename to public/images/flags/om.png diff --git a/public/content/images/flags/pa.png b/public/images/flags/pa.png similarity index 100% rename from public/content/images/flags/pa.png rename to public/images/flags/pa.png diff --git a/public/content/images/flags/pe.png b/public/images/flags/pe.png similarity index 100% rename from public/content/images/flags/pe.png rename to public/images/flags/pe.png diff --git a/public/content/images/flags/pf.png b/public/images/flags/pf.png similarity index 100% rename from public/content/images/flags/pf.png rename to public/images/flags/pf.png diff --git a/public/content/images/flags/pg.png b/public/images/flags/pg.png similarity index 100% rename from public/content/images/flags/pg.png rename to public/images/flags/pg.png diff --git a/public/content/images/flags/ph.png b/public/images/flags/ph.png similarity index 100% rename from public/content/images/flags/ph.png rename to public/images/flags/ph.png diff --git a/public/content/images/flags/pk.png b/public/images/flags/pk.png similarity index 100% rename from public/content/images/flags/pk.png rename to public/images/flags/pk.png diff --git a/public/content/images/flags/pl.png b/public/images/flags/pl.png similarity index 100% rename from public/content/images/flags/pl.png rename to public/images/flags/pl.png diff --git a/public/content/images/flags/pm.png b/public/images/flags/pm.png similarity index 100% rename from public/content/images/flags/pm.png rename to public/images/flags/pm.png diff --git a/public/content/images/flags/pn.png b/public/images/flags/pn.png similarity index 100% rename from public/content/images/flags/pn.png rename to public/images/flags/pn.png diff --git a/public/content/images/flags/pr.png b/public/images/flags/pr.png similarity index 100% rename from public/content/images/flags/pr.png rename to public/images/flags/pr.png diff --git a/public/content/images/flags/ps.png b/public/images/flags/ps.png similarity index 100% rename from public/content/images/flags/ps.png rename to public/images/flags/ps.png diff --git a/public/content/images/flags/pt.png b/public/images/flags/pt.png similarity index 100% rename from public/content/images/flags/pt.png rename to public/images/flags/pt.png diff --git a/public/content/images/flags/pw.png b/public/images/flags/pw.png similarity index 100% rename from public/content/images/flags/pw.png rename to public/images/flags/pw.png diff --git a/public/content/images/flags/py.png b/public/images/flags/py.png similarity index 100% rename from public/content/images/flags/py.png rename to public/images/flags/py.png diff --git a/public/content/images/flags/qa.png b/public/images/flags/qa.png similarity index 100% rename from public/content/images/flags/qa.png rename to public/images/flags/qa.png diff --git a/public/content/images/flags/re.png b/public/images/flags/re.png similarity index 100% rename from public/content/images/flags/re.png rename to public/images/flags/re.png diff --git a/public/content/images/flags/ro.png b/public/images/flags/ro.png similarity index 100% rename from public/content/images/flags/ro.png rename to public/images/flags/ro.png diff --git a/public/content/images/flags/rs.png b/public/images/flags/rs.png similarity index 100% rename from public/content/images/flags/rs.png rename to public/images/flags/rs.png diff --git a/public/content/images/flags/ru.png b/public/images/flags/ru.png similarity index 100% rename from public/content/images/flags/ru.png rename to public/images/flags/ru.png diff --git a/public/content/images/flags/rw.png b/public/images/flags/rw.png similarity index 100% rename from public/content/images/flags/rw.png rename to public/images/flags/rw.png diff --git a/public/content/images/flags/sa.png b/public/images/flags/sa.png similarity index 100% rename from public/content/images/flags/sa.png rename to public/images/flags/sa.png diff --git a/public/content/images/flags/sb.png b/public/images/flags/sb.png similarity index 100% rename from public/content/images/flags/sb.png rename to public/images/flags/sb.png diff --git a/public/content/images/flags/sc.png b/public/images/flags/sc.png similarity index 100% rename from public/content/images/flags/sc.png rename to public/images/flags/sc.png diff --git a/public/content/images/flags/sd.png b/public/images/flags/sd.png similarity index 100% rename from public/content/images/flags/sd.png rename to public/images/flags/sd.png diff --git a/public/content/images/flags/se.png b/public/images/flags/se.png similarity index 100% rename from public/content/images/flags/se.png rename to public/images/flags/se.png diff --git a/public/content/images/flags/sg.png b/public/images/flags/sg.png similarity index 100% rename from public/content/images/flags/sg.png rename to public/images/flags/sg.png diff --git a/public/content/images/flags/sh.png b/public/images/flags/sh.png similarity index 100% rename from public/content/images/flags/sh.png rename to public/images/flags/sh.png diff --git a/public/content/images/flags/si.png b/public/images/flags/si.png similarity index 100% rename from public/content/images/flags/si.png rename to public/images/flags/si.png diff --git a/public/content/images/flags/sj.png b/public/images/flags/sj.png similarity index 100% rename from public/content/images/flags/sj.png rename to public/images/flags/sj.png diff --git a/public/content/images/flags/sk.png b/public/images/flags/sk.png similarity index 100% rename from public/content/images/flags/sk.png rename to public/images/flags/sk.png diff --git a/public/content/images/flags/sl.png b/public/images/flags/sl.png similarity index 100% rename from public/content/images/flags/sl.png rename to public/images/flags/sl.png diff --git a/public/content/images/flags/sm.png b/public/images/flags/sm.png similarity index 100% rename from public/content/images/flags/sm.png rename to public/images/flags/sm.png diff --git a/public/content/images/flags/sn.png b/public/images/flags/sn.png similarity index 100% rename from public/content/images/flags/sn.png rename to public/images/flags/sn.png diff --git a/public/content/images/flags/so.png b/public/images/flags/so.png similarity index 100% rename from public/content/images/flags/so.png rename to public/images/flags/so.png diff --git a/public/content/images/flags/sr.png b/public/images/flags/sr.png similarity index 100% rename from public/content/images/flags/sr.png rename to public/images/flags/sr.png diff --git a/public/content/images/flags/st.png b/public/images/flags/st.png similarity index 100% rename from public/content/images/flags/st.png rename to public/images/flags/st.png diff --git a/public/content/images/flags/sv.png b/public/images/flags/sv.png similarity index 100% rename from public/content/images/flags/sv.png rename to public/images/flags/sv.png diff --git a/public/content/images/flags/sy.png b/public/images/flags/sy.png similarity index 100% rename from public/content/images/flags/sy.png rename to public/images/flags/sy.png diff --git a/public/content/images/flags/sz.png b/public/images/flags/sz.png similarity index 100% rename from public/content/images/flags/sz.png rename to public/images/flags/sz.png diff --git a/public/content/images/flags/tc.png b/public/images/flags/tc.png similarity index 100% rename from public/content/images/flags/tc.png rename to public/images/flags/tc.png diff --git a/public/content/images/flags/td.png b/public/images/flags/td.png similarity index 100% rename from public/content/images/flags/td.png rename to public/images/flags/td.png diff --git a/public/content/images/flags/tf.png b/public/images/flags/tf.png similarity index 100% rename from public/content/images/flags/tf.png rename to public/images/flags/tf.png diff --git a/public/content/images/flags/tg.png b/public/images/flags/tg.png similarity index 100% rename from public/content/images/flags/tg.png rename to public/images/flags/tg.png diff --git a/public/content/images/flags/th.png b/public/images/flags/th.png similarity index 100% rename from public/content/images/flags/th.png rename to public/images/flags/th.png diff --git a/public/content/images/flags/tj.png b/public/images/flags/tj.png similarity index 100% rename from public/content/images/flags/tj.png rename to public/images/flags/tj.png diff --git a/public/content/images/flags/tk.png b/public/images/flags/tk.png similarity index 100% rename from public/content/images/flags/tk.png rename to public/images/flags/tk.png diff --git a/public/content/images/flags/tl.png b/public/images/flags/tl.png similarity index 100% rename from public/content/images/flags/tl.png rename to public/images/flags/tl.png diff --git a/public/content/images/flags/tm.png b/public/images/flags/tm.png similarity index 100% rename from public/content/images/flags/tm.png rename to public/images/flags/tm.png diff --git a/public/content/images/flags/tn.png b/public/images/flags/tn.png similarity index 100% rename from public/content/images/flags/tn.png rename to public/images/flags/tn.png diff --git a/public/content/images/flags/to.png b/public/images/flags/to.png similarity index 100% rename from public/content/images/flags/to.png rename to public/images/flags/to.png diff --git a/public/content/images/flags/tr.png b/public/images/flags/tr.png similarity index 100% rename from public/content/images/flags/tr.png rename to public/images/flags/tr.png diff --git a/public/content/images/flags/tt.png b/public/images/flags/tt.png similarity index 100% rename from public/content/images/flags/tt.png rename to public/images/flags/tt.png diff --git a/public/content/images/flags/tv.png b/public/images/flags/tv.png similarity index 100% rename from public/content/images/flags/tv.png rename to public/images/flags/tv.png diff --git a/public/content/images/flags/tw.png b/public/images/flags/tw.png similarity index 100% rename from public/content/images/flags/tw.png rename to public/images/flags/tw.png diff --git a/public/content/images/flags/tz.png b/public/images/flags/tz.png similarity index 100% rename from public/content/images/flags/tz.png rename to public/images/flags/tz.png diff --git a/public/content/images/flags/ua.png b/public/images/flags/ua.png similarity index 100% rename from public/content/images/flags/ua.png rename to public/images/flags/ua.png diff --git a/public/content/images/flags/ug.png b/public/images/flags/ug.png similarity index 100% rename from public/content/images/flags/ug.png rename to public/images/flags/ug.png diff --git a/public/content/images/flags/um.png b/public/images/flags/um.png similarity index 100% rename from public/content/images/flags/um.png rename to public/images/flags/um.png diff --git a/public/content/images/flags/us.png b/public/images/flags/us.png similarity index 100% rename from public/content/images/flags/us.png rename to public/images/flags/us.png diff --git a/public/content/images/flags/uy.png b/public/images/flags/uy.png similarity index 100% rename from public/content/images/flags/uy.png rename to public/images/flags/uy.png diff --git a/public/content/images/flags/uz.png b/public/images/flags/uz.png similarity index 100% rename from public/content/images/flags/uz.png rename to public/images/flags/uz.png diff --git a/public/content/images/flags/va.png b/public/images/flags/va.png similarity index 100% rename from public/content/images/flags/va.png rename to public/images/flags/va.png diff --git a/public/content/images/flags/vc.png b/public/images/flags/vc.png similarity index 100% rename from public/content/images/flags/vc.png rename to public/images/flags/vc.png diff --git a/public/content/images/flags/ve.png b/public/images/flags/ve.png similarity index 100% rename from public/content/images/flags/ve.png rename to public/images/flags/ve.png diff --git a/public/content/images/flags/vg.png b/public/images/flags/vg.png similarity index 100% rename from public/content/images/flags/vg.png rename to public/images/flags/vg.png diff --git a/public/content/images/flags/vi.png b/public/images/flags/vi.png similarity index 100% rename from public/content/images/flags/vi.png rename to public/images/flags/vi.png diff --git a/public/content/images/flags/vn.png b/public/images/flags/vn.png similarity index 100% rename from public/content/images/flags/vn.png rename to public/images/flags/vn.png diff --git a/public/content/images/flags/vu.png b/public/images/flags/vu.png similarity index 100% rename from public/content/images/flags/vu.png rename to public/images/flags/vu.png diff --git a/public/content/images/flags/wf.png b/public/images/flags/wf.png similarity index 100% rename from public/content/images/flags/wf.png rename to public/images/flags/wf.png diff --git a/public/content/images/flags/ws.png b/public/images/flags/ws.png similarity index 100% rename from public/content/images/flags/ws.png rename to public/images/flags/ws.png diff --git a/public/content/images/flags/xx.png b/public/images/flags/xx.png similarity index 100% rename from public/content/images/flags/xx.png rename to public/images/flags/xx.png diff --git a/public/content/images/flags/ye.png b/public/images/flags/ye.png similarity index 100% rename from public/content/images/flags/ye.png rename to public/images/flags/ye.png diff --git a/public/content/images/flags/yt.png b/public/images/flags/yt.png similarity index 100% rename from public/content/images/flags/yt.png rename to public/images/flags/yt.png diff --git a/public/content/images/flags/za.png b/public/images/flags/za.png similarity index 100% rename from public/content/images/flags/za.png rename to public/images/flags/za.png diff --git a/public/content/images/flags/zm.png b/public/images/flags/zm.png similarity index 100% rename from public/content/images/flags/zm.png rename to public/images/flags/zm.png diff --git a/public/content/images/flags/zw.png b/public/images/flags/zw.png similarity index 100% rename from public/content/images/flags/zw.png rename to public/images/flags/zw.png diff --git a/public/images/grid.png b/public/images/grid.png new file mode 100644 index 0000000..87894ee Binary files /dev/null and b/public/images/grid.png differ diff --git a/public/images/not-found.png b/public/images/not-found.png new file mode 100644 index 0000000..78b6658 Binary files /dev/null and b/public/images/not-found.png differ diff --git a/public/content/images/op.png b/public/images/op.png similarity index 100% rename from public/content/images/op.png rename to public/images/op.png diff --git a/public/content/pixel.png b/public/images/pixel.png similarity index 100% rename from public/content/pixel.png rename to public/images/pixel.png diff --git a/public/content/images/satori-error.png b/public/images/satori-error.png similarity index 100% rename from public/content/images/satori-error.png rename to public/images/satori-error.png diff --git a/public/content/images/tenshi.png b/public/images/tenshi.png similarity index 100% rename from public/content/images/tenshi.png rename to public/images/tenshi.png diff --git a/public/content/data/yuuno/images/banned-av.png b/public/images/yuuno-ban.png similarity index 100% rename from public/content/data/yuuno/images/banned-av.png rename to public/images/yuuno-ban.png diff --git a/public/content/data/yuuno/images/no-av.png b/public/images/yuuno-none.png similarity index 100% rename from public/content/data/yuuno/images/no-av.png rename to public/images/yuuno-none.png diff --git a/public/robots.txt b/public/robots.txt index d346249..eb05362 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,2 +1,2 @@ User-agent: * -Disallow: /api/ +Disallow: diff --git a/resources/assets/less/aitemu/base.less b/resources/assets/less/aitemu/base.less new file mode 100644 index 0000000..e110ae7 --- /dev/null +++ b/resources/assets/less/aitemu/base.less @@ -0,0 +1,24 @@ +* { + margin: 0; + position: relative; + box-sizing: border-box; +} + +html, +body { + height: 100%; + font: @base-font-size "Exo 2", sans-serif; +} + +.fa { + font-family: inherit; + + &:before { + font-family: FontAwesome; + } +} + +// .turbolinks-progress-bar { +// height: 5px; +// background-color: green; +// } diff --git a/resources/assets/less/aitemu/bem/auth.less b/resources/assets/less/aitemu/bem/auth.less new file mode 100644 index 0000000..eb464d2 --- /dev/null +++ b/resources/assets/less/aitemu/bem/auth.less @@ -0,0 +1,10 @@ +.auth { + &__avatar { + height: 100px; + width: 100px; + background: no-repeat center center / cover @grey-f; + border-radius: 100%; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + margin: 6px auto 10px; + } +} diff --git a/resources/assets/less/aitemu/bem/banner.less b/resources/assets/less/aitemu/bem/banner.less new file mode 100644 index 0000000..8e15505 --- /dev/null +++ b/resources/assets/less/aitemu/bem/banner.less @@ -0,0 +1,14 @@ +.banner { + height: 150px; + margin-top: @general-spacing; + background: no-repeat center center / cover @grey-2; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + + &--large { + height: 250px; + } + + &--insane { + height: 400px; + } +} diff --git a/resources/assets/less/aitemu/bem/button.less b/resources/assets/less/aitemu/bem/button.less new file mode 100644 index 0000000..7f0433c --- /dev/null +++ b/resources/assets/less/aitemu/bem/button.less @@ -0,0 +1,21 @@ +.button { + color: @grey-f; + text-decoration: none; + border: 0; + border-radius: 2px; + font-size: 1.5em; + font-family: inherit; + width: 100%; + background: darken(@purple, 20%); + padding: @general-spacing; + margin-bottom: 8px; + box-shadow: 0 8px 2px darken(@purple, 22%); + cursor: pointer; + transition: margin-bottom .2s, margin-top .2s, box-shadow .2s; + + &:active { + margin-bottom: 2px; + margin-top: 6px; + box-shadow: 0 2px 2px darken(@purple, 22%); + } +} diff --git a/resources/assets/less/aitemu/bem/container.less b/resources/assets/less/aitemu/bem/container.less new file mode 100644 index 0000000..6439aaa --- /dev/null +++ b/resources/assets/less/aitemu/bem/container.less @@ -0,0 +1,35 @@ +.container { + min-height: 100%; + color: @grey-f; + background: url(@grid) @purple; + // no-repeat center center / cover + text-align: center; + + &__wrapper { + margin: 0 auto; + padding: @general-spacing; + max-width: @container-max-width; + padding-bottom: 59px; // oddly specific number but it works + } + + &__footer { + position: absolute; + bottom: 0; + left: 0; + right: 0; + font-size: .7em; + height: 60px; + padding-top: 20px; + background: linear-gradient(0deg, fade(@grey-0, 60%) 70%, fade(@grey-0, 70%) 80%, fade(@grey-0, 40%) 80%, transparent 90%) transparent; + + &-link { + color: inherit; + text-decoration: none; + margin: 0 @general-spacing; + + &:hover { + text-decoration: underline; + } + } + } +} diff --git a/resources/assets/less/aitemu/bem/form.less b/resources/assets/less/aitemu/bem/form.less new file mode 100644 index 0000000..c214f55 --- /dev/null +++ b/resources/assets/less/aitemu/bem/form.less @@ -0,0 +1,52 @@ +.form { + &__text { + background: fade(@grey-0, 50%); + border: 0; + border-radius: 2px; + font-size: 1.5em; + margin-bottom: @general-spacing; + box-shadow: inset 0 @global-shadow-distance @global-inner-shadow-size fade(@grey-0, @global-shadow-opacity); + padding: @general-spacing; + color: @grey-f; + font-family: inherit; + width: 100%; + } + + &__status { + background: @grey-3; + margin: -@general-spacing; + margin-bottom: @general-spacing; + height: 40px; + display: flex; + align-items: center; + + &-icon { + width: 40px; + height: 40px; + background: fade(@grey-0, 50%); + font-family: FontAwesome; + display: inline-flex; + align-items: center; + justify-content: center; + + &:before { + content: "\f054"; + } + } + + &-text { + flex-grow: 1; + text-align: left; + padding: 0 (@general-spacing * 4); + font-size: .8em; + } + + &--fail { + background: @red; + + .form__status-icon:before { + content: "\f071"; + } + } + } +} diff --git a/resources/assets/less/aitemu/bem/header.less b/resources/assets/less/aitemu/bem/header.less new file mode 100644 index 0000000..ad3fcd1 --- /dev/null +++ b/resources/assets/less/aitemu/bem/header.less @@ -0,0 +1,42 @@ +.header { + width: 100%; + background: @grey-2; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + height: @header-height; + line-height: @header-height - 6px; + font-size: @header-font-size; + text-shadow: 0 @text-shadow-distance @text-shadow-size fade(@grey-0, @text-shadow-opacity); + padding: 2px; + + display: flex; + justify-content: space-between; + + &__entry { + padding-left: 12px; + text-decoration: none; + color: inherit; + + &:before { + font-family: FontAwesome; + padding-right: 5px; + } + } + + &__user { + display: inline-flex; + text-decoration: none; + color: inherit; + } + + &__username { + padding: 0 15px; + } + + &__avatar { + height: 46px; + width: 46px; + background: no-repeat center center / cover @grey-f; + border-radius: 1px; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + } +} diff --git a/resources/assets/less/aitemu/bem/landing.less b/resources/assets/less/aitemu/bem/landing.less new file mode 100644 index 0000000..db00f7b --- /dev/null +++ b/resources/assets/less/aitemu/bem/landing.less @@ -0,0 +1,44 @@ +.landing { + text-shadow: 0 @text-shadow-distance @text-shadow-size fade(@grey-0, @text-shadow-opacity); + + &__banner, + &__inner { + display: flex; + flex-flow: row-reverse; + } + + &__text { + max-width: 300px; + } + + &__buttons { + max-width: 200px; + display: inline-flex; + flex-flow: column; + justify-content: center; + } + + &__inner, + &__buttons { + background: fade(@grey-0, 80%); + align-items: center; + height: 100%; + } + + &__text, + &__button { + padding: 0 (@general-spacing * 4); + } + + &__button { + color: inherit; + text-decoration: none; + cursor: pointer; + flex-grow: 1; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 2em; + width: 100%; + } +} diff --git a/resources/assets/less/aitemu/bem/platform.less b/resources/assets/less/aitemu/bem/platform.less new file mode 100644 index 0000000..3c0a4d7 --- /dev/null +++ b/resources/assets/less/aitemu/bem/platform.less @@ -0,0 +1,11 @@ +.platform { + margin: @platform-margin; + background: no-repeat center center / cover @grey-2; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + padding: @general-spacing; + + &--thin { + margin: @platform-thin-margin; + display: inline-block; + } +} diff --git a/resources/assets/less/aitemu/bem/profile.less b/resources/assets/less/aitemu/bem/profile.less new file mode 100644 index 0000000..225979e --- /dev/null +++ b/resources/assets/less/aitemu/bem/profile.less @@ -0,0 +1,137 @@ +.profile { + text-shadow: 0 @text-shadow-distance @text-shadow-size fade(@grey-0, @text-shadow-opacity); + + &__banner { + display: flex; + flex-flow: column-reverse; + } + + &__header { + height: 60px; + background: fade(@grey-0, 80%); + padding-left: @avatar-big + (@general-spacing * 4); + padding-right: @general-spacing * 2; + display: inline-flex; + flex-flow: row; + align-items: center; + line-height: 1; + } + + &__names { + flex-grow: 1; + text-align: left; + font-weight: 200; + } + + &__username { + font-size: 2em; + } + + &__title { + font-size: .9em; + } + + &__dates { + font-weight: 300; + text-align: right; + font-size: .7em; + line-height: 1.3em; + } + + &__content { + display: flex; + flex-flow: row; + margin: 0 (@general-spacing * 2); + } + + &__container { + flex-grow: 1; + + &--left { + max-width: @avatar-big; + margin-right: @general-spacing; + top: -(@avatar-big - (@general-spacing * 2)); + } + } + + &__platform { + text-align: left; + margin: @general-spacing auto 0; + } + + &__avatar { + height: @avatar-big; + width: @avatar-big; + background: no-repeat center center / cover @grey-f; + border-radius: 1px; + box-shadow: 0 @global-shadow-distance @global-shadow-size fade(@grey-1, @global-shadow-opacity); + } + + &__hierarchies { + font-size: 1.8em; + font-style: italic; + font-weight: 200; + } + + &__hierarchy { + display: inline-flex; + align-items: center; + + &-icon { + font-family: FontAwesome; + font-style: normal; + padding-right: 5px; + color: @grey-f; + text-align: center; + width: 1.2em; + } + + &--founder { + color: #6c3082; + } + + &--staff { + color: #fa3703; + } + + &--developer { + color: #6eac0a; + } + + &--contributor { + color: #ff69b4; + } + + &--premium { + color: #ee9400; + } + + &--banned { + color: #888; + } + } + + &__accounts { + font-size: .9em; + } + + &__account { + display: flex; + line-height: 1.3em; + color: inherit; + text-decoration: none; + + &-text { + text-align: right; + flex-grow: 1; + font-style: italic; + font-weight: 200; + color: inherit; + } + + &-icon { + text-align: center; + font-family: FontAwesome; + } + } +} diff --git a/resources/assets/less/aitemu/colours.less b/resources/assets/less/aitemu/colours.less new file mode 100644 index 0000000..3e22e8e --- /dev/null +++ b/resources/assets/less/aitemu/colours.less @@ -0,0 +1,20 @@ +@purple: #5e3e71; + +@red: #b01116; + +@grey-0: #000; +@grey-1: #111; +@grey-2: #222; +@grey-3: #333; +@grey-4: #444; +@grey-5: #555; +@grey-6: #666; +@grey-7: #777; +@grey-8: #888; +@grey-9: #999; +@grey-a: #aaa; +@grey-b: #bbb; +@grey-c: #ccc; +@grey-d: #ddd; +@grey-e: #eee; +@grey-f: #fff; diff --git a/resources/assets/less/aitemu/master.less b/resources/assets/less/aitemu/master.less new file mode 100644 index 0000000..dee433f --- /dev/null +++ b/resources/assets/less/aitemu/master.less @@ -0,0 +1,14 @@ +@import "base"; + +@import "bem/auth"; +@import "bem/banner"; +@import "bem/button"; +@import "bem/container"; +@import "bem/form"; +@import "bem/header"; +@import "bem/landing"; +@import "bem/platform"; +@import "bem/profile"; + +@import "colours"; +@import "variables"; diff --git a/resources/assets/less/aitemu/variables.less b/resources/assets/less/aitemu/variables.less new file mode 100644 index 0000000..80770bb --- /dev/null +++ b/resources/assets/less/aitemu/variables.less @@ -0,0 +1,22 @@ +@grid: "/images/grid.png"; + +@container-max-width: 1366px; +@general-spacing: 4px; +@platform-margin: @general-spacing (@general-spacing * 2) 0; +@platform-thin-margin: @general-spacing auto 0; + +@avatar-big: 200px; + +@global-shadow-opacity: 80%; +@global-shadow-size: 5px; +@global-inner-shadow-size: 2px; +@global-shadow-distance: 1px; + +@text-shadow-opacity: 80%; +@text-shadow-size: 1px; +@text-shadow-distance: 1px; + +@base-font-size: 16px; + +@header-font-size: 1.5em; +@header-height: 50px; diff --git a/resources/assets/less/yuuno/bbcode.less b/resources/assets/less/yuuno/bbcode.less new file mode 100644 index 0000000..84d8386 --- /dev/null +++ b/resources/assets/less/yuuno/bbcode.less @@ -0,0 +1,88 @@ +.bbcode { + line-height: 1.4; + word-wrap: break-word; + + h1, + h2, + h3 { + text-shadow: 0 0 5px #8364A1; + color: #614390; + } + + ul { + margin-left: 2em; + list-style: square; + } + + .spoiler { + background: #000; + + &:hover { + background: inherit; + } + } + + blockquote { + border: 1px solid #9475b2; + border-bottom: 0; + border-right: 0; + background: #D8B9F6; + margin: .5em; + + > .quotee { + font-weight: bold; + border-bottom: 1px solid #9475b2; + border-right: 1px solid #9475b2; + background: #B697d4; + padding-left: .5em; + } + + > .quote { + margin-left: .5em; + padding-bottom: .2em; + } + } + + a { + color: #22E; + text-decoration: none; + + &:hover { + color: #22E; + text-decoration: underline; + } + + &:active { + color: #E22; + text-decoration: underline; + } + } + + .spoiler-box-container { + border: 1px solid #9475b2; + margin: .5em; + + > .spoiler-box-title { + text-align: center; + background: #B697d4; + font-weight: bold; + cursor: pointer; + padding: 4px 0; + } + + > .spoiler-box-content { + border-top: 1px solid #9475b2; + } + } + + img { + width: auto; + height: auto; + max-height: 100%; + max-width: 100%; + } + + code { + font-size: 1.1em; + } +} diff --git a/public/content/data/yuuno/css/yuuno.css b/resources/assets/less/yuuno/master.less similarity index 99% rename from public/content/data/yuuno/css/yuuno.css rename to resources/assets/less/yuuno/master.less index c8aed7a..249ac2b 100644 --- a/public/content/data/yuuno/css/yuuno.css +++ b/resources/assets/less/yuuno/master.less @@ -1,13 +1,10 @@ -/* +/* * Sakura Yuuno Stylesheet * By Flashwave */ -/* Define character set */ -@charset "utf-8"; - /* Import bbcode specific style */ -@import url('bbcode.css'); +@import('bbcode'); /* * Animation Keyframes @@ -2381,7 +2378,7 @@ button.forumbtn { #comments .comment > .comment-avatar { height: 60px; width: 60px; - background: rgba(0, 0, 0, .2) url("/content/pixel.png") no-repeat scroll left center / contain; + background: rgba(0, 0, 0, .2) url("/images/pixel.png") no-repeat scroll left center / contain; flex-shrink: 0; margin-right: 2px; border-radius: 4px; diff --git a/public/content/scripts/sakura.ts b/resources/assets/typescript/master/legacy.ts similarity index 99% rename from public/content/scripts/sakura.ts rename to resources/assets/typescript/master/legacy.ts index 9682980..f6e7888 100644 --- a/public/content/scripts/sakura.ts +++ b/resources/assets/typescript/master/legacy.ts @@ -173,6 +173,9 @@ class Sakura { } } +declare function unescape(a); +declare function escape(a); + // UTF-8 functions class utf8 { // Encode a utf-8 string diff --git a/resources/assets/typescript/yuuno/ybabstat.ts b/resources/assets/typescript/yuuno/ybabstat.ts new file mode 100644 index 0000000..a9c36c7 --- /dev/null +++ b/resources/assets/typescript/yuuno/ybabstat.ts @@ -0,0 +1,68 @@ +var illuminati: Array = new Array(); +var startTime: number = (new Date()).getTime(); + +function hideYourMind(conflictions: KeyboardEvent): void { + var twoThousandTwelveIsTheYearWeAscendToSpaceRobots: number = conflictions.keyCode; + + illuminati.push(twoThousandTwelveIsTheYearWeAscendToSpaceRobots); + + if (illuminati[0] == 68 && illuminati[1] == 73 && illuminati[2] == 67 && illuminati[3] == 75 && illuminati[4] == 83) { + var dicksAre: HTMLAudioElement = document.createElement('audio'); + var forMyFriends: HTMLSourceElement = document.createElement('source'); + var whenTheyCome: HTMLSourceElement = document.createElement('source'); + + forMyFriends.type = 'audio/mp3'; + whenTheyCome.type = 'audio/ogg'; + + forMyFriends.src = 'https://data.flashii.net/sounds/dicks.mp3'; + whenTheyCome.src = 'https://data.flashii.net/sounds/dicks.ogg'; + + dicksAre.appendChild(forMyFriends); + dicksAre.appendChild(whenTheyCome); + + var toMyHouse: HTMLAudioElement = dicksAre; + + toMyHouse.play(); + + illuminati = new Array(); + } + + if (illuminati[0] == 77 && illuminati[1] == 69 && illuminati[2] == 87 && illuminati[3] == 79 && illuminati[4] == 87) { + var noklz: HTMLAudioElement = document.createElement('audio'); + var von: HTMLSourceElement = document.createElement('source'); + var schnitzel: HTMLSourceElement = document.createElement('source'); + + von.type = 'audio/mp3'; + schnitzel.type = 'audio/ogg'; + + von.src = 'https://data.flashii.net/sounds/mewow.mp3'; + schnitzel.src = 'https://data.flashii.net/sounds/mewow.ogg'; + + noklz.appendChild(von); + noklz.appendChild(schnitzel); + + noklz.play(); + + document.body.style.animation = 'spin 5s infinite linear'; + + illuminati = new Array(); + } + + if (illuminati[0] == 83 && illuminati[1] == 79 && illuminati[2] == 67 && illuminati[3] == 75 && illuminati[4] == 67 && illuminati[5] == 72 && illuminati[6] == 65 && illuminati[7] == 84) { + setInterval(twoThousandSixteenIsTheYearWePhysicallyMergeWithCats, 20); + + illuminati = new Array(); + } +} + +function twoThousandSixteenIsTheYearWePhysicallyMergeWithCats() { + var diff: number = (new Date()).getTime() - startTime; + var vals: Array = [-7 / Math.cos((diff / 500) * (.85 * Math.PI)), -7 * Math.tan((diff / 250) * (.85 * Math.PI))]; + + document.body.style.position = 'absolute'; + document.body.style.left = vals[0] + 'px'; + document.body.style.top = vals[1] + 'px'; + document.body.style.fontSize = vals[0] + 'px'; +} + +document.addEventListener('keydown', hideYourMind, false); diff --git a/resources/assets/typescript/yuuno/yuuno.ts b/resources/assets/typescript/yuuno/yuuno.ts new file mode 100644 index 0000000..c18e2a7 --- /dev/null +++ b/resources/assets/typescript/yuuno/yuuno.ts @@ -0,0 +1,528 @@ +/* + * Sakura Yuuno + */ + + declare var Sakura: any; + declare var AJAX: any; + declare var HTTPMethods: any; + declare var sakuraVars: any; + +// Notification class +interface Notification { + read: boolean; + title: string; + text: string; + link: string; + image: string; + timeout: number; +} + +// Spawns a notification +function notifyUI(content: Notification): void { + // Grab the container and create an ID + var cont: HTMLElement = document.getElementById('notifications'); + var id: string = 'sakura-notification-' + Date.now(); + + // Create the elements + var alert: HTMLDivElement = document.createElement('div'); + var aIcon: HTMLDivElement = document.createElement('div'); + var aCont: HTMLDivElement = document.createElement('div'); + var aTitle: HTMLDivElement = document.createElement('div'); + var aText: HTMLDivElement = document.createElement('div'); + var aClose: HTMLDivElement = document.createElement('div'); + var aCIcon: HTMLDivElement = document.createElement('div'); + var aClear: HTMLDivElement = document.createElement('div'); + var aIconCont: any; + + // Add attributes to the main element + alert.className = 'notification-enter'; + alert.id = id; + + // Add the icon + if ((typeof content.image).toLowerCase() === 'undefined' || content.image == null || content.image.length < 2) { + aIconCont = document.createElement('div'); + aIconCont.className = 'font-icon fa fa-info fa-4x'; + } else if (content.image.substr(0, 5) == 'FONT:') { + aIconCont = document.createElement('div'); + aIconCont.className = 'font-icon fa ' + content.image.replace('FONT:', '') + ' fa-4x'; + } else { + aIconCont = document.createElement('img'); + aIconCont.alt = id; + aIconCont.src = content.image; + } + + aIcon.appendChild(aIconCont); + aIcon.className = 'notification-icon'; + alert.appendChild(aIcon); + + // Add the content + aCont.className = 'notification-content'; + aTitle.className = 'notification-title'; + aText.className = 'notifcation-text'; + aTitle.textContent = content.title; + aText.textContent = content.text; + + // Check if a link exists and add if it does + if ((typeof content.link).toLowerCase() !== 'undefined' && content.link !== null && content.link.length > 1) { + alert.setAttribute('sakurahref', content.link); + aCont.setAttribute('onclick', content.link.substr(0, 11) == 'javascript:' ? content.link.substring(11) : 'notifyOpen(this.parentNode.id);'); + } + + // Append stuff + aCont.appendChild(aTitle); + aCont.appendChild(aText); + alert.appendChild(aCont); + + // Add the close button + aClose.className = 'notification-close'; + aClose.setAttribute('onclick', 'notifyClose(this.parentNode.id);'); + aClose.appendChild(aCIcon); + alert.appendChild(aClose); + + // Append the notification to the document + cont.appendChild(alert); + + // If keepalive is 0 keep the notification open forever + if (content.timeout > 0) { + // Set a timeout and close after an amount + setTimeout(() => { + notifyClose(id); + }, content.timeout); + } +} + +// Closing a notification +function notifyClose(id: string): void { + // Get the element + var e: HTMLElement = document.getElementById(id); + + // Add the animation + e.className = 'notification-exit'; + + // Remove after 410 ms + setTimeout(() => { + Sakura.removeById(id); + }, 410); +} + +// Opening an alerted link +function notifyOpen(id: string): void { + var sakuraHref: string = document.getElementById(id).getAttribute('sakurahref'); + + if ((typeof sakuraHref).toLowerCase() !== 'undefined') { + window.location.assign(sakuraHref); + } +} + +// Request notifications +function notifyRequest(session: string): void { + // Check if the document isn't hidden + if (document.hidden) { + return; + } + + // Create AJAX object + var get: any = new AJAX(); + get.setUrl('/notifications'); + + // Add callbacks + get.addCallback(200, () => { + // Assign the parsed JSON + var data: Notification = JSON.parse(get.response()); + + // Check if nothing went wrong + if ((typeof data).toLowerCase() === 'undefined') { + // Inform the user + throw "No or invalid data was returned"; + } + + // Create an object for every notification + for (var id in data) { + notifyUI(data[id]); + } + }); + + get.start(HTTPMethods.GET); +} + +// Show the full page busy window +function ajaxBusyView(show: boolean, message: string = null, type: string = null): void { + // Get elements + var cont: HTMLElement = document.getElementById('ajaxBusy'); + var stat: HTMLElement = document.getElementById('ajaxStatus'); + var anim: HTMLElement = document.getElementById('ajaxAnimate'); + var body: HTMLElement = document.getElementById('contentwrapper'); + var icon: string = 'fa fa-4x '; + + // Select the proper icon + switch (type) { + case 'ok': + icon += 'fa-check'; + break; + case 'fail': + icon += 'fa-remove'; + break; + case 'busy': + default: + icon += 'fa-refresh fa-spin'; + break; + } + + // If request to show the window, build it + if (show) { + if ((typeof cont).toLowerCase() === 'undefined' || cont === null) { + // Container + var cCont = document.createElement('div'); + cCont.className = 'ajax-busy'; + cCont.id = 'ajaxBusy'; + + // Inner + var cInner = document.createElement('div'); + cInner.className = 'ajax-inner'; + cCont.appendChild(cInner); + + // Desc + var cMsg = document.createElement('h2'); + cMsg.id = 'ajaxStatus'; + cInner.appendChild(cMsg); + + // Icon + var cIco = document.createElement('div'); + cIco.id = 'ajaxAnimate'; + cInner.appendChild(cIco); + + // Append to document + body.appendChild(cCont); + + // Reassign + cont = document.getElementById('ajaxBusy'); + stat = document.getElementById('ajaxStatus'); + anim = document.getElementById('ajaxAnimate'); + } + + // Update the icon + anim.className = icon; + + // Update the message + stat.textContent = (message === null ? '' : message); + } else { + if (cont !== null) { + var out: any = setInterval(() => { + if (cont.style.opacity === null || cont.style.opacity === "") { + cont.style.opacity = "1"; + } + + // If the value isn't 0 yet subtract by .1 + if (parseInt(cont.style.opacity) > 0) { + cont.style.opacity = (parseInt(cont.style.opacity) - 0.1).toString(); + } else { + Sakura.removeById('ajaxBusy'); + clearInterval(out); + } + }, 10); + } + } +} + +// Making a post request using AJAX +function ajaxPost(url: string, data: Object, callback: Function) { + // Create AJAX + var request: any = new AJAX(); + + // Set url + request.setUrl(url); + + // Add callbacks + request.addCallback(200, function() { + callback.call(request.response()) + }); + request.addCallback(0, function() { + ajaxBusyView(false); + + throw "POST Request failed"; + }); + + // Add header + request.addHeader('Content-Type', 'application/x-www-form-urlencoded'); + + // Set the post data + request.setSend(data); + + // Make the request + request.start(HTTPMethods.POST); + + // Return the AJAX object + return request; +} + +// Convert a href attr to an object +function prepareAjaxLink(linkId: any, callback: Function, attrs: string = null): void { + // Get element + var link: HTMLElement = (typeof linkId).toLowerCase() === 'object' ? linkId : document.getElementById(linkId); + + // Catch null + if (link === null) { + return; + } + + // Get the raw HREF value + var href: string = link.getAttribute('href'); + + // Get the action + var action: string = href.split('?')[0]; + + // Split the request variables + var varEarly: string[] = href.split('?')[1].split('&'); + + // Create storage thing + var variables: Object = new Object(); + + // Split them + for (var k in varEarly) { + // Split + var newVar: string[] = varEarly[k].split('='); + + // Push + variables[newVar[0]] = newVar[1]; + } + + // Add ajax=true + variables['ajax'] = true; + + // Update link attributes + link.setAttribute('href', 'javascript:void(0);'); + link.setAttribute('onclick', callback + '(\'' + action + '\', JSON.parse(\'' + JSON.stringify(variables) + '\')' + (typeof attrs != 'undefined' ? attrs : '') + ');'); +} + +// Prepare a form for an AJAX request +function prepareAjaxForm(formId: string, message: string, resetCaptcha: boolean = false): void { + // Get the form + var form: HTMLElement = document.getElementById(formId); + + // Create hidden ajax input + var hide: HTMLInputElement = document.createElement('input'); + + // Set the attributes + hide.name = 'ajax'; + hide.value = 'true'; + hide.type = 'hidden'; + form.appendChild(hide); + + // Update form + form.setAttribute('onsubmit', 'submitPost(\'' + form.getAttribute('action') + '\', formToObject(\'' + formId + '\'), true, \'' + (message ? message : 'Please wait...') + '\', ' + (resetCaptcha ? 'true' : 'false') + ');'); + form.setAttribute('action', 'javascript:void(0);'); +} + +// Convert form to an object +function formToObject(formId: string): Object { + // Get the form + var form: any = document.getElementById(formId); + + // Make an object for the request parts + var requestParts: Object = new Object(); + + // Get all the children with a name attr + var children = form.querySelectorAll('[name]'); + + // Sort the children and make them ready for submission + for (var i in children) { + if ((typeof children[i]).toLowerCase() === 'object') { + requestParts[children[i].name] = ((typeof children[i].type !== "undefined" && children[i].type.toLowerCase() == "checkbox") ? (children[i].checked ? 1 : 0) : children[i].value); + } + } + + // Return the request parts + return requestParts; +} + +// Quickly building a form +function generateForm(formId: string, formAttr: Object, formData: Object, appendTo: string = null): HTMLFormElement { + // Create form element + var form: HTMLFormElement = document.createElement('form'); + form.id = formId; + + // Set additional attrs + for (var c in formAttr) { + form.setAttribute(c, formAttr[c]); + } + + // Set data + for (var a in formData) { + var b: HTMLInputElement = document.createElement('input'); + b.type = 'hidden'; + b.name = a; + b.value = formData[a]; + form.appendChild(b); + } + + // Append to something if requested + if (appendTo !== null) { + document.getElementById(appendTo).appendChild(form); + } + + return form; +} + +// Submitting a post using AJAX +function submitPost(action: string, requestParts: Object, busyView: boolean, msg: string, resetCaptcha: boolean): void { + // If requested display the busy thing + if (busyView) { + ajaxBusyView(true, msg, 'busy'); + } + + // Submit the AJAX + var request = ajaxPost(action, requestParts, () => { + submitPostHandler(request.response(), busyView, resetCaptcha); + }); +} + +// Handling a submitted form using AJAX +function submitPostHandler(data: string, busyView: boolean, resetCaptcha: boolean): void { + // Split the result + var result: string[] = data.split('|'); + + // If using the bust view thing update the text displayed to the return of the request + if (busyView) { + ajaxBusyView(true, result[0], (result[1] == '1' ? 'ok' : 'fail')); + } + + setTimeout(() => { + if (busyView) { + ajaxBusyView(false); + } + + if (result[1] == '1') { + window.location.assign(result[2]); + } + }, 2000); +} + +// Check if a password is within the minimum entropy value +function checkPwdEntropy(pwd: string): boolean { + return (Sakura.entropy(pwd) >= sakuraVars.minPwdEntropy); +} + +// Check registration variables +function registerVarCheck(id: string, mode: string, option: any = null): void { + // Get the element we're working with + var input: any = document.getElementById(id); + var check: boolean = null; + + // Use the proper mode + switch (mode) { + case 'confirmpw': + option = document.getElementById(option); + check = input.value === option.value; + break; + + case 'password': + check = checkPwdEntropy(input.value); + break; + + case 'email': + check = Sakura.validateEmail(input.value); + break; + + case 'username': + default: + check = Sakura.stringLength(input.value, sakuraVars.minUserLen, sakuraVars.maxUserLen); + break; + } + + if (input.className.indexOf(check ? 'green' : 'red') < 0) { + input.className = input.className + ' ' + (check ? 'green' : 'red'); + } + + if (input.className.indexOf(check ? 'red' : 'green') > 0) { + input.className = input.className.replace(check ? 'red' : 'green', ''); + } +} + +// Replace some special tags +function replaceTag(tag: string): string { + return { '&': '&', '<': '<', '>': '>' }[tag] || tag; +} + +// ^ +function safeTagsReplace(str: string): string { + return str.replace(/[&<>]/g, replaceTag); +} + +// Inserting text into text box +// Borrowed from http://stackoverflow.com/questions/1064089/inserting-a-text-where-cursor-is-using-javascript-jquery (therefore not in Typescript format, fix this later) +function insertText(areaId, text) { + var txtarea: any = document.getElementById(areaId); + var scrollPos: any = txtarea.scrollTop; + var strPos = 0; + var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? + "ff" : ((document).selection ? "ie" : false)); + if (br == "ie") { + txtarea.focus(); + var range = (document).selection.createRange(); + range.moveStart('character', -txtarea.value.length); + strPos = range.text.length; + } + else if (br == "ff") strPos = txtarea.selectionStart; + + var front = (txtarea.value).substring(0, strPos); + var back = (txtarea.value).substring(strPos, txtarea.value.length); + txtarea.value = front + text + back; + strPos = strPos + text.length; + if (br == "ie") { + txtarea.focus(); + var range = (document).selection.createRange(); + range.moveStart('character', -txtarea.value.length); + range.moveStart('character', strPos); + range.moveEnd('character', 0); + range.select(); + } + else if (br == "ff") { + txtarea.selectionStart = strPos; + txtarea.selectionEnd = strPos; + txtarea.focus(); + } + txtarea.scrollTop = scrollPos; +} + +// Inserting a bbcode +function insertBBcode(textarea: string, tag: string, arg: boolean = false): void { + var element: any = document.getElementById(textarea); + var before = "[" + tag + (arg ? "=" : "") + "]"; + var after = "[/" + tag + "]"; + + if ((document).selection) { + element.focus(); + var sel = (document).selection.createRange(); + sel.text = before + sel.text + after; + element.focus(); + } else if (element.selectionStart || element.selectionStart === 0) { + var startPos = element.selectionStart; + var endPos = element.selectionEnd; + var scrollTop = element.scrollTop; + element.value = element.value.substring(0, startPos) + before + element.value.substring(startPos, endPos) + after + element.value.substring(endPos, element.value.length); + element.focus(); + element.selectionStart = startPos + before.length; + element.selectionEnd = endPos + before.length; + element.scrollTop = scrollTop; + } else { + element.value += before + after; + element.focus(); + } +} + +interface Number { + formatMoney(u, c, k); +} + +// Formatting money +Number.prototype.formatMoney = function(u, c, k) { + var f = this, + u = isNaN(u = Math.abs(u)) ? 2 : u, + c = c == undefined ? "." : c, + k = k == undefined ? "," : k, + i = f < 0 ? "-" : "", + n: any = parseInt(f = Math.abs(+f || 0).toFixed(u)) + "", + g = (g = n.length) > 3 ? g % 3 : 0; + + return i + (g ? n.substr(0, g) + k : "") + n.substr(g).replace(/(\c{3})(?=\c)/g, "$1" + k) + (u ? c + Math.abs(f - n).toFixed(u).slice(2) : ""); +}; diff --git a/resources/views/aitemu/master.twig b/resources/views/aitemu/master.twig new file mode 100644 index 0000000..f539aac --- /dev/null +++ b/resources/views/aitemu/master.twig @@ -0,0 +1,74 @@ + + + + + + +{{ block('meta') }} + + {{ title|default(config('general.name')) }} + + + + {##} + + +{{ block('css') }} + + {##} + + + {##} +{{ block('js') }} + + +
    +
    + + + + + + + {{ block('content') }} + + {#
    + @include('misc.chat') +
    #} +
    + +
    + + diff --git a/resources/views/aitemu/meta/index.twig b/resources/views/aitemu/meta/index.twig new file mode 100644 index 0000000..5cc1d8d --- /dev/null +++ b/resources/views/aitemu/meta/index.twig @@ -0,0 +1,28 @@ +{% extends 'master.twig' %} + +{% set banner_classes = "banner--insane landing__banner" %} +{% set banner = "https://i.flash.moe/7131467636550.jpg" %} + +{% block banner_content %} +
    +
    + register + login +
    +
    +

    Welcome to my humble abode, it doesn't look like much but if you like rectangles this is the place for you.

    +

    Allow me to expound for five paragraphs on why you should join.

    +

    Paragraph 1.

    +

    Paragraph 2.

    +

    Paragraph 3.

    +

    Paragraph 4.

    +

    Paragraph 5.

    +
    +
    +{% endblock %} + +{% block content %} +
    + stuff here +
    +{% endblock %} diff --git a/resources/views/yuuno/auth/login.twig b/resources/views/yuuno/auth/login.twig new file mode 100644 index 0000000..b4c7194 --- /dev/null +++ b/resources/views/yuuno/auth/login.twig @@ -0,0 +1,39 @@ +{% extends 'global/master.twig' %} + +{% block title %}Login{% endblock %} + +{% block content %} +
    +
    +
    + Login +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/auth/reactivate.twig b/resources/views/yuuno/auth/reactivate.twig new file mode 100644 index 0000000..c5a7b2a --- /dev/null +++ b/resources/views/yuuno/auth/reactivate.twig @@ -0,0 +1,31 @@ +{% extends 'global/master.twig' %} + +{% block title %}Reactivate account{% endblock %} + +{% block content %} +
    +
    +
    + Reactivate account +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/auth/register.twig b/resources/views/yuuno/auth/register.twig new file mode 100644 index 0000000..2d6bb98 --- /dev/null +++ b/resources/views/yuuno/auth/register.twig @@ -0,0 +1,67 @@ +{% extends 'global/master.twig' %} + +{% block title %}Register{% endblock %} + +{% block content %} + {% if config('user.disable_registration') %} +
    +
    +
    +
    +

    Registration is disabled.

    +

    Please try again later.

    +
    +
    +
    + {% else %} +
    +
    +
    + Register +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    +
    +

    +

    Are you {{ haltName }}?

    +

    Making more than one account is not permitted.

    +

    If you lost your password please use the reset password form but if you don't already have an account you can go ahead and click the link below to show the registration form this check is based on your IP so in some cases someone may have registered/used the site on this IP already.

    +

    If we find out that you already have an account we may question you about it, if you can give a good reason we'll let it slide otherwise we may issue a temporary ban.

    +
    + +
    +
    +
    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/auth/resetpassword.twig b/resources/views/yuuno/auth/resetpassword.twig new file mode 100644 index 0000000..399bbea --- /dev/null +++ b/resources/views/yuuno/auth/resetpassword.twig @@ -0,0 +1,48 @@ +{% extends 'global/master.twig' %} + +{% block title %}Reset Password{% endblock %} + +{% block content %} +
    +
    +
    + Reset Password +
    +
    + + {% if get.u is defined and get.k is defined %} + + +
    + +
    +
    + +
    +
    + +
    + {% else %} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + {% endif %} +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/elements/comment.twig b/resources/views/yuuno/elements/comment.twig new file mode 100644 index 0000000..11dccd6 --- /dev/null +++ b/resources/views/yuuno/elements/comment.twig @@ -0,0 +1,29 @@ +
  • +
    + {{ comment.userData.username }} +
    +
    +
    + +
    +
    +
    + {{ comment.parsed|raw|nl2br }} +
    +
    +
    +
      + {% for comment in comment.replies %} + {% include 'elements/comment.twig' %} + {% endfor %} +
    +
  • diff --git a/resources/views/yuuno/elements/comments.twig b/resources/views/yuuno/elements/comments.twig new file mode 100644 index 0000000..80c00ec --- /dev/null +++ b/resources/views/yuuno/elements/comments.twig @@ -0,0 +1,301 @@ +
    +
    + {% if user.isActive %} +
    +
    +
    + + +
    + {% else %} +

    Log in to comment!

    + {% endif %} +
    +
    +
      + {% if comments %} + {% for comment in comments %} + {% include 'elements/comment.twig' %} + {% endfor %} + {% else %} +

      There are no comments yet!

      + {% endif %} +
    +
    +
    + +{% block js %} + +{% endblock %} diff --git a/resources/views/yuuno/elements/indexPanel.twig b/resources/views/yuuno/elements/indexPanel.twig new file mode 100644 index 0000000..3f4e472 --- /dev/null +++ b/resources/views/yuuno/elements/indexPanel.twig @@ -0,0 +1,29 @@ +
    + {% if user.isActive %} +
    +
    +
    +

    {{ user.username }}

    + {% set friendRequests = user.friends(-1, true)|length %} + {% if friendRequests %} + {{ friendRequests }} new friend requests + {% endif %} +
    +
    + {% endif %} +
    Stats
    + We have {{ stats.userCount }} user{% if stats.userCount != 1 %}s{% endif %}, + {{ stats.newestUser.username }} is the newest user, + it has been {{ stats.lastRegDate }} day{{ stats.lastRegDate == 1 ? '' : 's' }} since the last user registered and the forum has {{ stats.topicCount }} thread{% if stats.topicCount != 1 %}s{% endif %} and {{ stats.postCount }} post{% if stats.postCount != 1 %}s{% endif %}. +
    Online Users
    + {% if stats.onlineUsers %} + All active users in the past 2 minutes + + {% for amount,onlineUser in stats.onlineUsers %} + + {% endfor %} +
    {{ onlineUser.username }}
    + {% else %} + There were no online users in the past 2 minutes. + {% endif %} +
    diff --git a/resources/views/yuuno/elements/newsPost.twig b/resources/views/yuuno/elements/newsPost.twig new file mode 100644 index 0000000..eac73c3 --- /dev/null +++ b/resources/views/yuuno/elements/newsPost.twig @@ -0,0 +1,17 @@ +{% if newsHideTitle is not defined %}{{ post.title }}{% endif %} +
    + +
    + {{ post.userData.username }} +

    {{ post.userData.username }}

    +
    +
    +
    + {{ post.text|raw }} +
    +
    +
    +
    + Posted + {% if newsHideCommentCount is not defined %}{{ post.commentCount }} comment{% if post.commentCount != 1 %}s{% endif %}{% endif %} +
    diff --git a/resources/views/yuuno/elements/pagination.twig b/resources/views/yuuno/elements/pagination.twig new file mode 100644 index 0000000..a62e6cd --- /dev/null +++ b/resources/views/yuuno/elements/pagination.twig @@ -0,0 +1,24 @@ +{% set paginationSeparator %}{% if '%3F' in paginationUrl|url_encode %}&{% else %}?{% endif %}{% endset %} +{% set paginationPage = get.page|default(1) %} + +
    + {% if paginationPages|length > 1 %} + {% if paginationPage > 1 %} + {% if paginationPages|length > 2 %} + + {% endif %} + + {% endif %} + {% for id,page in paginationPages %} + {% if (id + 1) > (paginationPage - 3) and (id + 1) < (paginationPage + 3) %} + {{ id + 1 }} + {% endif %} + {% endfor %} + {% if paginationPage < paginationPages|length %} + + {% if paginationPages|length > 2 %} + + {% endif %} + {% endif %} + {% endif %} +
    diff --git a/resources/views/yuuno/forum/elements/forumBase.twig b/resources/views/yuuno/forum/elements/forumBase.twig new file mode 100644 index 0000000..82a5f5d --- /dev/null +++ b/resources/views/yuuno/forum/elements/forumBase.twig @@ -0,0 +1,55 @@ +
    {{ title }}
    +
    + {% for forum in forum.forums %} + {% if forum.type == 1 %} + {% if forum.forums|length and forum.permission(constant('Sakura\\Perms\\Forum::VIEW'), user.id) %} +
    + {% if forum.type != 1 %}Subforums{% else %}{{ forum.name }}{% endif %} +
    + {% for forum in forum.forums %} + {% include 'forum/elements/forumEntry.twig' %} + {% endfor %} + {% endif %} + {% else %} + {% include 'forum/elements/forumEntry.twig' %} + {% endif %} + {% endfor %} +
    +{% if not forum.type and forum.id > 0 %} + {% set threads = forum.threads|batch(25) %} + + {% set paginationPages = threads %} + {% set paginationUrl %}{{ route('forums.forum', forum.id) }}{% endset %} + + {% include 'forum/elements/forumBtns.twig' %} + {% if forum.threads %} + + + + + + + + + + + + + + + + + + + + + {% for thread in threads[get.page|default(1) - 1] %} + {% include 'forum/elements/topicEntry.twig' %} + {% endfor %} + +
    TopicAuthorLast post
    TopicAuthorLast post
    + {% else %} +

    There are no posts in this forum!

    + {% endif %} + {% include 'forum/elements/forumBtns.twig' %} +{% endif %} diff --git a/resources/views/yuuno/forum/elements/forumBtns.twig b/resources/views/yuuno/forum/elements/forumBtns.twig new file mode 100644 index 0000000..a5f45d2 --- /dev/null +++ b/resources/views/yuuno/forum/elements/forumBtns.twig @@ -0,0 +1,23 @@ +{% set paginationClass = 'rightSide' %} + + diff --git a/resources/views/yuuno/forum/elements/forumEntry.twig b/resources/views/yuuno/forum/elements/forumEntry.twig new file mode 100644 index 0000000..8231eb5 --- /dev/null +++ b/resources/views/yuuno/forum/elements/forumEntry.twig @@ -0,0 +1,35 @@ +{% if forum.permission(constant('Sakura\\Perms\\Forum::VIEW'), user.id) %} +
    +
    +
    + +
    + {{ forum.description }} + {% if forum.forums|length %} +
    + Subforums: + {% for forum in forum.forums %} + {% if forum.unread(user.id) %}[!]{% endif %} {{ forum.name }} + {% endfor %} +
    + {% endif %} +
    +
    + {% if forum.type != 2 %} +
    +
    {{ forum.threadCount }}
    +
    {{ forum.postCount }}
    +
    +
    +
    + {% if forum.lastPost.id %} + {{ forum.lastPost.subject|slice(0, 30) }}{% if forum.lastPost.subject|length > 30 %}...{% endif %}
    + by {% if forum.lastPost.poster.id %}{{ forum.lastPost.poster.username }}{% else %}[deleted user]{% endif %} + {% else %} + There are no posts in this forum.
      + {% endif %} +
    +
    + {% endif %} +
    +{% endif %} diff --git a/resources/views/yuuno/forum/elements/forumMod.twig b/resources/views/yuuno/forum/elements/forumMod.twig new file mode 100644 index 0000000..b77d41e --- /dev/null +++ b/resources/views/yuuno/forum/elements/forumMod.twig @@ -0,0 +1,18 @@ +
    + + {% if forumSticky is defined %} + + {% endif %} + {% if forumAnnounce is defined %} + + {% endif %} + {% if forumLock is defined %} + + {% endif %} + {% if forumRestore is defined %} + + {% endif %} + {% if forumTrash is defined or forumPrune is defined %} + + {% endif %} +
    diff --git a/resources/views/yuuno/forum/elements/replyForm.twig b/resources/views/yuuno/forum/elements/replyForm.twig new file mode 100644 index 0000000..d14f8e6 --- /dev/null +++ b/resources/views/yuuno/forum/elements/replyForm.twig @@ -0,0 +1,186 @@ +{% set bbcode = { + 'b': ['Bold: [b]text[/b]', 'bold'], + 'i': ['Italic: [i]text[/i]', 'italic'], + 'u': ['Underline: [u]text[/u]', 'underline'], + 's': ['Strikethrough: [s]text[/s]', 'strikethrough'], + 'header': ['Header: [header]text[/header]', 'header'], + 'url': ['URL: [url]link[/url] or [url=link]text[/url]', 'chain'], + 'code': ['Code: [code]text[/code] (bbcodes inside this tag are ignored!)', 'code'], + 'spoiler': ['Spoiler: [spoiler]text[/spoiler]', 'minus'], + 'box': ['Spoiler box: [box]text[/box] or [box=title]text[/box]', 'folder', true], + 'list': ['List: [list][*]item\r\n[*]another item[/list]', 'list-ul'], + 'img': ['Image: [img]image link[/img], please use https instead of http if possible', 'picture-o'], + 'youtube': ['YouTube video: [youtube]video id (in the link after ?v= up until the first &)[/youtube]', 'youtube-play'] +} %} + +
    +
    + +
    + +
    +
    +
    + {% for code,meta in bbcode %} + + {% endfor %} +
    +
    + + +
    +
    +
    +
    +
    + + diff --git a/resources/views/yuuno/forum/elements/topicEntry.twig b/resources/views/yuuno/forum/elements/topicEntry.twig new file mode 100644 index 0000000..06e7bc6 --- /dev/null +++ b/resources/views/yuuno/forum/elements/topicEntry.twig @@ -0,0 +1,27 @@ + + +
    + + + {{ thread.title }} + + + {% if thread.firstPost.poster.id %} + {{ thread.firstPost.poster.username }} + {% else %} + [deleted user] + {% endif %} + + +
    {{ thread.replyCount }}
    +
    {{ thread.views }}
    + + + {% if thread.lastPost.poster.id %} + {{ thread.lastPost.poster.username }} + {% else %} + [deleted user] + {% endif %}
    + + + diff --git a/resources/views/yuuno/forum/forum.twig b/resources/views/yuuno/forum/forum.twig new file mode 100644 index 0000000..668354a --- /dev/null +++ b/resources/views/yuuno/forum/forum.twig @@ -0,0 +1,17 @@ +{% extends 'global/master.twig' %} + +{% set title %}Forums / {{ forum.name }}{% endset %} + +{% set forumBackLink %}{{ route('forums.index') }}{% endset %} +{% set forumNewLink %}{{ route('forums.new', forum.id) }}{% endset %} +{% set forumMarkRead %}{{ route('forums.mark', forum.id) }}?s={{ session_id() }}{% endset %} + +{% block title %}{{ title }}{% endblock %} + +{% block content %} +
    +
    + {% include 'forum/elements/forumBase.twig' %} +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/forum/index.twig b/resources/views/yuuno/forum/index.twig new file mode 100644 index 0000000..023046e --- /dev/null +++ b/resources/views/yuuno/forum/index.twig @@ -0,0 +1,68 @@ +{% extends 'global/master.twig' %} + +{% set title = 'Forums' %} + +{% block title %}{{ title }}{% endblock %} + +{% block content %} +
    +
    +
    +
    Popular threads
    + + + + + + {% for _t in activeThreads %} + + + + + {% endfor %} +
    TitleLast reply
    + {{ _t.title }} +
    +
    +
    +
    Latest posts
    + + + + + + {% for _p in latestPosts %} + + + + + {% endfor %} +
    Title & userPosted
    + {{ _p.subject }} + by + {{ _p.poster.username }} +
    +
    +
    +
    Today's most active poster
    + {% if activePoster.id %} + +
    +
    +
    +

    {{ activePoster.username }}

    + {% if activePoster.isPremium %}Tenshi {% endif %}{{ activePoster.country }} {{ activePoster.title }} +
    +
    +
    + {% else %} +

    No one yet!

    + {% endif %} +
    +
    +
    + {% include 'forum/elements/forumBase.twig' %} +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/forum/thread.twig b/resources/views/yuuno/forum/thread.twig new file mode 100644 index 0000000..9645a45 --- /dev/null +++ b/resources/views/yuuno/forum/thread.twig @@ -0,0 +1,168 @@ +{% extends 'global/master.twig' %} + +{% set forumBackLink %}{{ route('forums.forum', forum.id) }}{% endset %} + +{% block title %}{% if thread is defined %}{{ thread.title }}{% else %}Creating thread in {{ forum.name }}{% endif %}{% endblock %} + +{% if thread is defined %} + {% if forum.permission(constant('Sakura\\Perms\\Forum::REPLY'), user.id) + and ( + thread.status != 1 + or forum.permission(constant('Sakura\\Perms\\Forum::LOCK'), user.id) + ) %} + {% set forumReplyLink %}#reply{% endset %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::STICKY'), user.id) + or forum.permission(constant('Sakura\\Perms\\Forum::ANNOUNCEMENT'), user.id) + or forum.permission(constant('Sakura\\Perms\\Forum::LOCK'), user.id) + or forum.permission(constant('Sakura\\Perms\\Forum::MOVE'), user.id) + or forum.permission(constant('Sakura\\Perms\\Forum::DELETE_ANY'), user.id) %} + {% set showMod = true %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::STICKY'), user.id) %} + {% set forumSticky = thread.type == 1 ? true : false %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::ANNOUNCEMENT'), user.id) %} + {% set forumAnnounce = thread.type == 2 ? true : false %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::LOCK'), user.id) %} + {% set forumLock = thread.status == 1 ? true : false %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::MOVE'), user.id) %} + {% if thread.oldForum %} + {% set forumRestore = true %} + {% endif %} + + {% if thread.forum != config('forum_trash_id') %} + {% set forumTrash = true %} + {% endif %} + {% endif %} + + {% if forum.permission(constant('Sakura\\Perms\\Forum::DELETE_ANY'), user.id) %} + {% if thread.forum == config('forum_trash_id') %} + {% set forumPrune = true %} + {% endif %} + {% endif %} + + {% set posts = thread.posts|batch(10) %} + + {% set paginationPages = posts %} + {% set paginationUrl %}{{ route('forums.thread', thread.id) }}{% endset %} +{% endif %} + +{% block css %} + +{% endblock %} + +{% block js %} + + +{% endblock %} + +{% block content %} +
    +
    +
    {{ forum.name }} / {{ thread.title }}
    + {% include 'forum/elements/forumBtns.twig' %} + + {% if thread is defined %} + {% set textCache = session.replyText['t' ~ thread.id] %} + {% set postingAction = route('forums.thread.reply', thread.id) %} + + {% for post in posts[get.page|default(1) - 1] %} + + + + + {% endfor %} + {% else %} + {% set titleCache = session.replyText['f' ~ forum.id].title %} + {% set textCache = session.replyText['f' ~ forum.id].text %} + {% set postingAction = route('forums.new', forum.id) %} + {% endif %} + {% if forumReplyLink is defined or thread is not defined %} + + + + + {% endif %} +
    + {% if not post.poster.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) or post.poster.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %}{{ post.poster.username }} + {{ post.poster.username }} + {% else %} + [deleted user] + {% endif %} +
    +
    {{ post.poster.title }}
    + Tenshi {{ post.poster.country(true) }}{% if post.poster.id == (thread.posts|first).poster.id %} OP{% endif %} + {% if user.isActive %} +
    + {% if (user.id == post.poster.id and forum.permission(constant('Sakura\\Perms\\Forum::EDIT_OWN'), user.id)) or forum.permission(constant('Sakura\\Perms\\Forum::EDIT_ANY'), user.id) %} + + {% endif %} + {% if (user.id == post.poster.id and forum.permission(constant('Sakura\\Perms\\Forum::DELETE_OWN'), user.id)) or forum.permission(constant('Sakura\\Perms\\Forum::DELETE_ANY'), user.id) %} + + {% endif %} + {% if not (post.poster.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) or post.poster.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) or user.id == post.poster.id) %} + + + + {% endif %} + +
    + {% endif %} +
    +
    + +
    + {{ post.parsed|raw }} +
    + {% if post.poster.signature and post.poster.permission(constant('Sakura\\Perms\\Site::CHANGE_SIGNATURE')) %} +
    +
    + {{ post.poster.signature()|raw|nl2br }} +
    + {% endif %} +
    + {% if forumReplyLink is defined or thread is not defined %} + {% include 'forum/elements/replyForm.twig' %} + {% endif %} + {% include 'forum/elements/forumBtns.twig' %} +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/global/confirm.twig b/resources/views/yuuno/global/confirm.twig new file mode 100644 index 0000000..cb5691f --- /dev/null +++ b/resources/views/yuuno/global/confirm.twig @@ -0,0 +1,22 @@ +{% extends 'global/master.twig' %} + +{% block title %}Confirmation{% endblock %} + +{% block content %} +
    +
    +

    {% block header %}Confirmation{% endblock %}

    +
    + {{ message }} +
    + + + {% for key,value in conditions %} + + {% endfor %} + + +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/global/information.twig b/resources/views/yuuno/global/information.twig new file mode 100644 index 0000000..3e1b29d --- /dev/null +++ b/resources/views/yuuno/global/information.twig @@ -0,0 +1,14 @@ +{% extends 'global/master.twig' %} + +{% block title %}Information{% endblock %} + +{% block content %} +
    +
    +

    Information

    +
    + {{ message }} + {% if redirect %}
    Click here if you aren't being redirected.{% endif %} +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/global/maintenance.twig b/resources/views/yuuno/global/maintenance.twig new file mode 100644 index 0000000..65fef37 --- /dev/null +++ b/resources/views/yuuno/global/maintenance.twig @@ -0,0 +1,28 @@ + + + + + Service unavailable + + + +
    +

    + + The page is currently unavailable +

    +

    + The page you are looking for is temporarily unavailable. +

    +
    +

    + {{ message }} +

    +

    + HTTP 503 - Service unavailable +
    + Internet Explorer +

    +
    + + diff --git a/resources/views/yuuno/global/master.twig b/resources/views/yuuno/global/master.twig new file mode 100644 index 0000000..1ecda4d --- /dev/null +++ b/resources/views/yuuno/global/master.twig @@ -0,0 +1,337 @@ + + + + + + {{ title|default(config('general.name')) }} + + +{% if redirect %} + +{% endif %} +{{ block('meta') }} + + + + +{{ block('css') }} + + + +{{ block('js') }} + + +
    + + +
    +
    + {% if profile is defined ? profile.background : (user.permission(constant('Sakura\\Perms\\Site::CHANGE_BACKGROUND')) and user.optionFields.profileBackgroundSiteWide and user.background) %} +
    + {% endif %} + {% if not user.isActive and server['REQUEST_URI'] != route('auth.login') %} +
    +
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    + {% endif %} + {% if user.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %} +
    +

    Your account is currently in restricted mode!

    +
    A staff member has set your account to restricted mode most likely due to violation of the rules. While restricted you won't be able to use most public features of the site. If you think this is a mistake please get in touch with one of our staff members.
    +
    + {% endif %} + + + + {% if config('general.cover') %} +
    + {% endif %} + + {% block content %} +

    There is nothing here!

    + {% endblock %} +
    + +
    + + {% if config('dev.show_changelog', true) and stats %} + + {% endif %} + + diff --git a/resources/views/yuuno/global/notfound.twig b/resources/views/yuuno/global/notfound.twig new file mode 100644 index 0000000..fdae55f --- /dev/null +++ b/resources/views/yuuno/global/notfound.twig @@ -0,0 +1,47 @@ + + + + + Cannot find page + + + +
    +

    + + The page cannot be found +

    +

    + The page you are looking for might have been removed, had its + name changed, or is temporarily unavailable. +

    +
    +

    + Please try the following: +

    +
      +
    • + If you typed the page address in the Address bar, make + sure that it is spelled correctly. +
    • +
    • + Open the flashii.net + home page, and then look for links to the information you want. +
    • +
    • + Click the Back + button to try another link. +
    • +
    • + Click Search + to look for information on the Internet. +
    • +
    +

    + HTTP 404 - File not found +
    + Internet Explorer +

    +
    + + diff --git a/resources/views/yuuno/global/restricted.twig b/resources/views/yuuno/global/restricted.twig new file mode 100644 index 0000000..c545cbe --- /dev/null +++ b/resources/views/yuuno/global/restricted.twig @@ -0,0 +1,12 @@ +{% extends 'global/master.twig' %} + +{% block title %}Restricted{% endblock %} + +{% block content %} +
    +
    +

    You aren't allowed to view this page!

    + Please make sure that you're logged in and are supposed to be able to access this page. If you think this was a mistake please contact a staff member. +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/group/index.twig b/resources/views/yuuno/group/index.twig new file mode 100644 index 0000000..38b9115 --- /dev/null +++ b/resources/views/yuuno/group/index.twig @@ -0,0 +1 @@ +{% extends 'global/master.twig' %} diff --git a/resources/views/yuuno/meta/banned.twig b/resources/views/yuuno/meta/banned.twig new file mode 100644 index 0000000..aedd870 --- /dev/null +++ b/resources/views/yuuno/meta/banned.twig @@ -0,0 +1,30 @@ +{% extends 'global/master.twig' %} + +{% block title %}You are banned!{% endblock %} + +{% block content %} +
    +
    +
    +

    You got dunked on!

    + {% if ban.reason %} +

    The following reason was supplied:

    +

    + {{ ban.reason|raw }} +

    + {% else %} +

    No reason was supplied.

    + {% endif %} +
    +

    Additional information

    +
      +
    • You were banned on {{ ban.issued|date('D Y-m-d H:i:s T') }}.
    • +
    • {% if ban.expires %}This ban expires on {{ ban.expires|date('D Y-m-d H:i:s T') }}.{% else %}You are permanently banned.{% endif %}
    • + {% if ban.expires %} +
    • You were banned by {{ ban.issuer.username }}.
    • + {% endif %} +
    +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/meta/faq.twig b/resources/views/yuuno/meta/faq.twig new file mode 100644 index 0000000..95d6d82 --- /dev/null +++ b/resources/views/yuuno/meta/faq.twig @@ -0,0 +1,28 @@ +{% extends 'global/master.twig' %} + +{% block title %}Frequently Asked Questions{% endblock %} + +{% block content %} +
    +
    +
    + Frequently Asked Questions +
    +
    + {% for question in page.questions %} + {{ question.faq_question }} + {% endfor %} +
    +
    +
    + {% for question in page.questions %} +
    + {{ question.faq_question }} + +
    +

    {{ question.faq_answer }}

    + {% endfor %} +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/meta/index.twig b/resources/views/yuuno/meta/index.twig new file mode 100644 index 0000000..c401a1b --- /dev/null +++ b/resources/views/yuuno/meta/index.twig @@ -0,0 +1,20 @@ +{% extends 'global/master.twig' %} + +{% block content %} +
    +
    + {% include 'elements/indexPanel.twig' %} +
    +
    +
    News
    + {% for post in news %} + {% include 'elements/newsPost.twig' %} + {% endfor %} +
    +
    +
    +{% endblock %} + +{% block js %} + +{% endblock %} diff --git a/resources/views/yuuno/meta/infopage.twig b/resources/views/yuuno/meta/infopage.twig new file mode 100644 index 0000000..fe7b7e3 --- /dev/null +++ b/resources/views/yuuno/meta/infopage.twig @@ -0,0 +1,11 @@ +{% extends 'global/master.twig' %} + +{% block title %}{% if page.title %}{{ page.title }}{% else %}Not found!{% endif %}{% endblock %} + +{% block content %} +
    +
    + {{ include(template_from_string(page.content|raw)) }} +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/meta/report.twig b/resources/views/yuuno/meta/report.twig new file mode 100644 index 0000000..38b9115 --- /dev/null +++ b/resources/views/yuuno/meta/report.twig @@ -0,0 +1 @@ +{% extends 'global/master.twig' %} diff --git a/resources/views/yuuno/meta/search.twig b/resources/views/yuuno/meta/search.twig new file mode 100644 index 0000000..060c8b0 --- /dev/null +++ b/resources/views/yuuno/meta/search.twig @@ -0,0 +1,24 @@ +{% extends 'global/master.twig' %} + +{% block title %}Search{% endblock %} + +{% block content %} +
    +
    +
    Search
    + + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/meta/settings.twig b/resources/views/yuuno/meta/settings.twig new file mode 100644 index 0000000..ab84265 --- /dev/null +++ b/resources/views/yuuno/meta/settings.twig @@ -0,0 +1,23 @@ +{% extends 'global/master.twig' %} + +{% block title %}{{ page.category }} / {{ page.mode }}{% endblock %} + +{% block content %} +
    +
    + {% include 'elements/settingsNav.twig' %} +
    +
    +
    + {{ page.category }} / {{ page.mode }} +
    +
    + {% for descline in page.description %} +
    {{ include(template_from_string(descline)) }}
    + {% endfor %} +
    + {% include templates ~ '/' ~ current ~ '.twig' %} +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/news/category.twig b/resources/views/yuuno/news/category.twig new file mode 100644 index 0000000..2c54453 --- /dev/null +++ b/resources/views/yuuno/news/category.twig @@ -0,0 +1,33 @@ +{% extends 'global/master.twig' %} + +{% block title %}News{% endblock %} + +{% block css %} + +{% endblock %} + +{% set posts = category.posts|batch(3) %} + +{% set paginationPages = posts|keys %} +{% set paginationUrl %}{{ route('news.category', category.name) }}{% endset %} + +{% block content %} +
    +
    +
    News
    + {% for post in posts[get.page|default(1) - 1] %} + {% include 'elements/newsPost.twig' %} + {% endfor %} + {% if posts|length > 1 %} +
    + {% include 'elements/pagination.twig' %} +
    +
    + {% endif %} +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/news/post.twig b/resources/views/yuuno/news/post.twig new file mode 100644 index 0000000..85c5ce5 --- /dev/null +++ b/resources/views/yuuno/news/post.twig @@ -0,0 +1,20 @@ +{% extends 'global/master.twig' %} + +{% block title %}{{ post.title }}{% endblock %} + +{% set commentsCategory = 'news-' ~ post.category ~ '-' ~ post.id %} +{% set comments = post.comments %} + +{% set newsHideTitle = true %} +{% set newsHideCommentCount = true %} + +{% block content %} +
    +
    +
    {{ post.title }}
    + {% include 'elements/newsPost.twig' %} + {% include 'elements/comments.twig' %} +
    +
    +{% endblock %} + diff --git a/resources/views/yuuno/premium/complete.twig b/resources/views/yuuno/premium/complete.twig new file mode 100644 index 0000000..10a1bd2 --- /dev/null +++ b/resources/views/yuuno/premium/complete.twig @@ -0,0 +1,11 @@ +{% extends 'global/master.twig' %} + +{% block title %}Purchase complete!{% endblock %} + +{% block content %} +
    +

    Thank you for your contribution!

    +

    +

    Your Tenshi will expire on {{ user.isPremium|date('D Y-m-d H:i:s T') }}.

    +
    +{% endblock %} diff --git a/resources/views/yuuno/premium/index.twig b/resources/views/yuuno/premium/index.twig new file mode 100644 index 0000000..b8a6af5 --- /dev/null +++ b/resources/views/yuuno/premium/index.twig @@ -0,0 +1,99 @@ +{% extends 'global/master.twig' %} + +{% block title %}Support {{ config('general.name') }}{% endblock %} + +{% set persistentPremium = user.permission(constant('Sakura\\Perms\\Site::STATIC_PREMIUM')) %} + +{% set features = { + "money": "Helping us pay for the bills to survive", + "certificate": "A special name colour to stand out in the crowd", + "magic": "The ability to change your username once a month", + "pencil": "You can set a custom user title", + "lock": "Access to some exclusive forums", + "picture-o": "You get the ability to set a profile background" +} %} + +{% block content %} + {% if get.fail %} +
    +

    The payment failed or was cancelled!

    +

    Something went wrong while processing the transaction, your PayPal account wasn't charged.

    +
    + {% endif %} +
    +
    Support {{ config('general.name') }}
    +
    +

    To keep the site and everything surrounding it running I need money to pay the bills, however instead of just having a donate button I decided on adding a premium system to the site which gives you a few extras. The premium rank is indentified on the site by Tenshi. More stuff that literally doesn't exist yet will be added to the list of featuring down the line but in order, the stuff that already exist can be seen further down on this page. With your help we can keep adding new stuff, get new hardware and keep the site awesome!

    +
    + {% if user.isPremium %} +
    + Your current Tenshi tag +
    +
    +

    {% if persistentPremium %}Your rank has persistent Tenshi.{% else %}Your Tenshi tag is valid till {{ user.premiumInfo.expire|date('D Y-m-d H:i:s T') }}.{% endif %}

    + +
    + {% endif %} +
    + Why should I get Tenshi? +
    +
    + {% for k,v in features %} +
    +
    +
    {{ v|raw }}
    +
    +
    + {% endfor %} +
    +
    +
    +
    The good feeling of helping the staff of your favourite site keep it up and awesome
    +
    +
    +
    +
    + Payment Options +
    + Our transactions are handled through PayPal. +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + {% if user.isActive and user.permission(constant('Sakura\\Perms\\Site::OBTAIN_PREMIUM')) %} +
    + +
    +
    +
    +

    Total: €

    +
    +
    + +
    +
    +
    + {% elseif user.isActive %} +

    You can't get Tenshi at the current moment!

    + {% else %} +

    You need to be logged in to get Tenshi!

    + {% endif %} +
    + {% if user.isActive and user.permission(constant('Sakura\\Perms\\Site::OBTAIN_PREMIUM')) %} + + + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/profile/comments.twig b/resources/views/yuuno/profile/comments.twig new file mode 100644 index 0000000..c468a7d --- /dev/null +++ b/resources/views/yuuno/profile/comments.twig @@ -0,0 +1,6 @@ +{% set comments = profile.profileComments %} +{% set commentsCategory = 'profile-' ~ profile.id %} +
    +

    Comments

    +
    +{% include 'elements/comments.twig' %} diff --git a/resources/views/yuuno/profile/friends.twig b/resources/views/yuuno/profile/friends.twig new file mode 100644 index 0000000..a0068fc --- /dev/null +++ b/resources/views/yuuno/profile/friends.twig @@ -0,0 +1,24 @@ +{% set friends = profile.friends(2)|batch(12) %} + +{% set paginationPages = friends %} +{% set paginationUrl %}{{ route('user.profile', profile.id) }}{% endset %} + +
    +

    Friends

    +
    +
    + {% for friend in friends[get.page|default(1) - 1] %} + + {% endfor %} +
    +
    +{% if friends|length > 1 %} +
    + {% include 'elements/pagination.twig' %} +
    +{% endif %} diff --git a/resources/views/yuuno/profile/groups.twig b/resources/views/yuuno/profile/groups.twig new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/yuuno/profile/posts.twig b/resources/views/yuuno/profile/posts.twig new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/yuuno/profile/threads.twig b/resources/views/yuuno/profile/threads.twig new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/yuuno/profile/userpage.twig b/resources/views/yuuno/profile/userpage.twig new file mode 100644 index 0000000..2387986 --- /dev/null +++ b/resources/views/yuuno/profile/userpage.twig @@ -0,0 +1,3 @@ +
    + {{ profile.userPage|raw }} +
    diff --git a/resources/views/yuuno/settings/account/email.twig b/resources/views/yuuno/settings/account/email.twig new file mode 100644 index 0000000..bc55dcc --- /dev/null +++ b/resources/views/yuuno/settings/account/email.twig @@ -0,0 +1,21 @@ +{% extends 'settings/account/master.twig' %} + +{% set mode = 'E-mail address' %} + +{% block description %} +

    You e-mail address is used for password recovery and stuff like that!

    +{% endblock %} + +{% block settingsContent %} +
    +

    Your e-mail address is currently set to {{ user.email }}.

    +
    +

    E-mail address

    +
    +
    +
    + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/account/master.twig b/resources/views/yuuno/settings/account/master.twig new file mode 100644 index 0000000..3748acb --- /dev/null +++ b/resources/views/yuuno/settings/account/master.twig @@ -0,0 +1,3 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'Account' %} diff --git a/resources/views/yuuno/settings/account/password.twig b/resources/views/yuuno/settings/account/password.twig new file mode 100644 index 0000000..df9fd3c --- /dev/null +++ b/resources/views/yuuno/settings/account/password.twig @@ -0,0 +1,24 @@ +{% extends 'settings/account/master.twig' %} + +{% set mode = 'Password' %} + +{% block description %} +

    Used to authenticate with the site and certain related services.

    +{% endblock %} + +{% block settingsContent %} +
    +
    +

    Current Password

    +
    +
    +
    +

    New Password

    +
    +
    +
    + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/account/ranks.twig b/resources/views/yuuno/settings/account/ranks.twig new file mode 100644 index 0000000..9dc369c --- /dev/null +++ b/resources/views/yuuno/settings/account/ranks.twig @@ -0,0 +1,29 @@ +{% extends 'settings/account/master.twig' %} + +{% set mode = 'Ranks' %} + +{% block description %} +

    Manage what ranks you're in and what is set as your main rank. Your main rank is highlighted. You get the permissions of all of the ranks you're in combined.

    +{% endblock %} + +{% block settingsContent %} + + + {% for rank in user.ranks %} + + + + + {% endfor %} + +
    + {{ rank.name }} + +
    + + + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/account/title.twig b/resources/views/yuuno/settings/account/title.twig new file mode 100644 index 0000000..0fde2bc --- /dev/null +++ b/resources/views/yuuno/settings/account/title.twig @@ -0,0 +1,21 @@ +{% extends 'settings/account/master.twig' %} + +{% set mode = 'Title' %} + +{% block description %} +

    That little piece of text displayed besides your username in most places.

    +{% endblock %} + +{% block settingsContent %} +
    +

    Your current user title is:
    {{ user.title }}

    +
    +

    New title

    +
    +
    +
    + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/account/username.twig b/resources/views/yuuno/settings/account/username.twig new file mode 100644 index 0000000..cec10d0 --- /dev/null +++ b/resources/views/yuuno/settings/account/username.twig @@ -0,0 +1,27 @@ +{% extends 'settings/account/master.twig' %} + +{% set mode = 'Username' %} + +{% block description %} +

    Probably the biggest part of your identity on a site.

    +

    You can only change this once every 30 days so choose wisely.

    +{% endblock %} + +{% set eligible = user.getUsernameHistory ? (date().timestamp - user.getUsernameHistory()[0].change_time) > 2592000 : true %} + +{% block settingsContent %} +
    +

    You are {% if not eligible %}not {% endif %}eligible for a name change.

    +

    {% if user.getUsernameHistory %}Your last name change was .{% else %}This is your first username change.{% endif %}

    + {% if eligible %} +
    +

    Username

    +
    +
    +
    + + +
    + {% endif %} +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/advanced/deactivate.twig b/resources/views/yuuno/settings/advanced/deactivate.twig new file mode 100644 index 0000000..794fe0d --- /dev/null +++ b/resources/views/yuuno/settings/advanced/deactivate.twig @@ -0,0 +1,21 @@ +{% extends 'settings/advanced/master.twig' %} + +{% set mode = 'Deactivate' %} + +{% block description %} +

    You can deactivate your account here if you want to leave :(.

    +

    This will remove your account from every rank it's a part of and make you unable to login.

    +

    If you have an active Tenshi tag on your account it won't pause while your account is deactivated.

    +{% endblock %} + +{% block settingsContent %} +
    +
    +

    Enter your password to continue

    +
    +
    +
    + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/advanced/master.twig b/resources/views/yuuno/settings/advanced/master.twig new file mode 100644 index 0000000..7405e89 --- /dev/null +++ b/resources/views/yuuno/settings/advanced/master.twig @@ -0,0 +1,3 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'Advanced' %} diff --git a/resources/views/yuuno/settings/advanced/sessions.twig b/resources/views/yuuno/settings/advanced/sessions.twig new file mode 100644 index 0000000..54da3dc --- /dev/null +++ b/resources/views/yuuno/settings/advanced/sessions.twig @@ -0,0 +1,47 @@ +{% extends 'settings/advanced/master.twig' %} + +{% set mode = 'Sessions' %} + +{% block description %} +

    Session keys are a way of identifying yourself with the system without keeping your password in memory.

    +

    If someone finds one of your session keys they could possibly compromise your account, if you see any sessions here that shouldn't be here hit the Kill button to kill the selected session.

    +

    If you get logged out after clicking one you've most likely killed your current session, to make it easier to avoid this from happening your current session is highlighted.

    +{% endblock %} + +{% block settingsContent %} + + + + + + + + + {% for s in sessions %} + + + + + + + {% endfor %} + +
    IPUseragentLogin time
    IPUseragentLogin time
    + {{ s.user_ip }} + + {{ s.user_agent }} + + + +
    + + +
    +
    +
    +
    + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/appearance/_preview.twig b/resources/views/yuuno/settings/appearance/_preview.twig new file mode 100644 index 0000000..e0ca61f --- /dev/null +++ b/resources/views/yuuno/settings/appearance/_preview.twig @@ -0,0 +1,35 @@ + diff --git a/resources/views/yuuno/settings/appearance/avatar.twig b/resources/views/yuuno/settings/appearance/avatar.twig new file mode 100644 index 0000000..28db58b --- /dev/null +++ b/resources/views/yuuno/settings/appearance/avatar.twig @@ -0,0 +1,27 @@ +{% extends 'settings/appearance/master.twig' %} + +{% set mode = 'Avatar' %} + +{% block description %} +

    Maximum image size is {{ config('avatar_max_width') }}x{{ config('avatar_max_height') }}, minimum image size is {{ config('avatar_min_width') }}x{{ config('avatar_min_height') }}, maximum file size is {{ config('avatar_max_fsize')|byte_symbol }}.

    +{% endblock %} + +{% block settingsContent %} +
    + +
    +
    + Your Avatar +
    +
    + +
    + (Leave upload box empty to remove avatar) +
    +
    +
    + +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/appearance/background.twig b/resources/views/yuuno/settings/appearance/background.twig new file mode 100644 index 0000000..bea565f --- /dev/null +++ b/resources/views/yuuno/settings/appearance/background.twig @@ -0,0 +1,27 @@ +{% extends 'settings/appearance/master.twig' %} + +{% set mode = 'Background' %} + +{% block description %} +

    Maximum image size is {{ config('background_max_width') }}x{{ config('background_max_height') }}, minimum image size is {{ config('background_min_width') }}x{{ config('background_min_height') }}, maximum file size is {{ config('background_max_fsize')|byte_symbol }}.

    +{% endblock %} + +{% block settingsContent %} +
    + +
    +
    + Your Background +
    +
    + +
    + (Leave upload box empty to remove background) +
    +
    +
    + +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/appearance/header.twig b/resources/views/yuuno/settings/appearance/header.twig new file mode 100644 index 0000000..28256ed --- /dev/null +++ b/resources/views/yuuno/settings/appearance/header.twig @@ -0,0 +1,27 @@ +{% extends 'settings/appearance/master.twig' %} + +{% set mode = 'Header' %} + +{% block description %} +

    Maximum image size is {{ config('header_max_width') }}x{{ config('header_max_height') }}, minimum image size is {{ config('header_min_width') }}x{{ config('header_min_height') }}, maximum file size is {{ config('header_max_fsize')|byte_symbol }}.

    +{% endblock %} + +{% block settingsContent %} +
    + +
    +
    + Your Header +
    +
    + +
    + (Leave upload box empty to remove header) +
    +
    +
    + +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/appearance/master.twig b/resources/views/yuuno/settings/appearance/master.twig new file mode 100644 index 0000000..ff94170 --- /dev/null +++ b/resources/views/yuuno/settings/appearance/master.twig @@ -0,0 +1,3 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'Appearance' %} diff --git a/resources/views/yuuno/settings/appearance/signature.twig b/resources/views/yuuno/settings/appearance/signature.twig new file mode 100644 index 0000000..334f40d --- /dev/null +++ b/resources/views/yuuno/settings/appearance/signature.twig @@ -0,0 +1,21 @@ +{% extends 'settings/appearance/master.twig' %} + +{% set mode = 'Signature' %} + +{% block description %} +

    This signature is displayed at the end of all your posts on the forum.

    +{% endblock %} + +{% block settingsContent %} +
    {{ user.signature()|raw|nl2br }}
    +
    +
    +
    +
    + + + +
    +
    + {% include 'settings/appearance/_preview.twig' %} +{% endblock %} diff --git a/resources/views/yuuno/settings/appearance/userpage.twig b/resources/views/yuuno/settings/appearance/userpage.twig new file mode 100644 index 0000000..a25afdf --- /dev/null +++ b/resources/views/yuuno/settings/appearance/userpage.twig @@ -0,0 +1,21 @@ +{% extends 'settings/appearance/master.twig' %} + +{% set mode = 'Userpage' %} + +{% block description %} +

    The custom text that is displayed on your profile.

    +{% endblock %} + +{% block settingsContent %} +
    {{ user.userPage()|raw|nl2br }}
    +
    +
    +
    +
    + + + +
    +
    + {% include 'settings/appearance/_preview.twig' %} +{% endblock %} diff --git a/resources/views/yuuno/settings/friends/listing.twig b/resources/views/yuuno/settings/friends/listing.twig new file mode 100644 index 0000000..1a2f9c7 --- /dev/null +++ b/resources/views/yuuno/settings/friends/listing.twig @@ -0,0 +1,39 @@ +{% extends 'settings/general/master.twig' %} + +{% set friends = user.friends(1)|batch(12) %} + +{% set paginationPages = friends %} +{% set paginationUrl %}{{ route('settings.friends.listing') }}{% endset %} + +{% set mode = 'Listing' %} + +{% block description %} +

    Manage your friends.

    +{% endblock %} + +{% block settingsContent %} + {% if friends|length %} +
    + {% for friend in friends[get.page|default(1) - 1] %} + + {% endfor %} +
    +
    + {% if friends|length > 1 %} +
    + {% include 'elements/pagination.twig' %} +
    + {% endif %} + {% else %} +

    You don't have any friends yet!

    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/settings/friends/master.twig b/resources/views/yuuno/settings/friends/master.twig new file mode 100644 index 0000000..7007d0e --- /dev/null +++ b/resources/views/yuuno/settings/friends/master.twig @@ -0,0 +1,11 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'Friends' %} + +{% block css %} + +{% endblock %} diff --git a/resources/views/yuuno/settings/friends/requests.twig b/resources/views/yuuno/settings/friends/requests.twig new file mode 100644 index 0000000..e603c90 --- /dev/null +++ b/resources/views/yuuno/settings/friends/requests.twig @@ -0,0 +1,40 @@ +{% extends 'settings/general/master.twig' %} + +{% set friends = user.friends(-1)|batch(12) %} + +{% set paginationPages = friends %} +{% set paginationUrl %}{{ route('settings.friends.requests') }}{% endset %} + +{% set mode = 'Requests' %} + +{% block description %} +

    Handle friend requests.

    +{% endblock %} + +{% block settingsContent %} + {% if friends|length %} +
    + {% for friend in friends[get.page|default(1) - 1] %} + + {% endfor %} +
    +
    + {% if friends|length > 1 %} +
    + {% include 'elements/pagination.twig' %} +
    + {% endif %} + {% else %} +

    You don't have any pending requests!

    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/settings/general/home.twig b/resources/views/yuuno/settings/general/home.twig new file mode 100644 index 0000000..40cbdee --- /dev/null +++ b/resources/views/yuuno/settings/general/home.twig @@ -0,0 +1,25 @@ +{% extends 'settings/general/master.twig' %} + +{% set mode = 'Home' %} + +{% block description %} +

    Welcome to the Settings Panel! From here you can monitor, view and update your profile and preferences.

    +{% endblock %} + +{% block settingsContent %} + +{% endblock %} diff --git a/resources/views/yuuno/settings/general/master.twig b/resources/views/yuuno/settings/general/master.twig new file mode 100644 index 0000000..b59e6d3 --- /dev/null +++ b/resources/views/yuuno/settings/general/master.twig @@ -0,0 +1,3 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'General' %} diff --git a/resources/views/yuuno/settings/general/options.twig b/resources/views/yuuno/settings/general/options.twig new file mode 100644 index 0000000..1204378 --- /dev/null +++ b/resources/views/yuuno/settings/general/options.twig @@ -0,0 +1,33 @@ +{% extends 'settings/general/master.twig' %} + +{% set mode = 'Options' %} + +{% block description %} +

    These are a few personalisation options for the site while you're logged in.

    +{% endblock %} + +{% block settingsContent %} + {% if fields %} +
    + {% for field in fields %} +
    +
    +

    {{ field.name }}

    +
    + {{ field.description }} +
    +
    +
    + +
    +
    + {% endfor %} +
    + + +
    +
    + {% else %} +

    There are currently no changeable options.

    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/settings/general/profile.twig b/resources/views/yuuno/settings/general/profile.twig new file mode 100644 index 0000000..8047b4f --- /dev/null +++ b/resources/views/yuuno/settings/general/profile.twig @@ -0,0 +1,76 @@ +{% extends 'settings/general/master.twig' %} + +{% set mode = 'Profile' %} + +{% block description %} +

    These are the external account links etc. on your profile, shouldn't need any additional explanation for this one.

    +{% endblock %} + +{% set months = { + 1: "January", + 2: "February", + 3: "March", + 4: "April", + 5: "May", + 6: "June", + 7: "July", + 8: "August", + 9: "September", + 10: "October", + 11: "November", + 12: "December", +} %} + +{% set birthday = user.birthday|split('-') %} + +{% block settingsContent %} +
    + {% for field in fields %} +
    +
    +

    {{ field.name }}

    +
    +
    + +
    + {% if field.additional %} + {% for id,addit in field.additional %} +
    + + +
    + {% endfor %} + {% endif %} +
    + {% endfor %} +
    +
    +

    Birthday

    +
    +
    + Day: + Month: + Year: +
    +
    +
    + + +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/master.twig b/resources/views/yuuno/settings/master.twig new file mode 100644 index 0000000..b39a918 --- /dev/null +++ b/resources/views/yuuno/settings/master.twig @@ -0,0 +1,29 @@ +{% extends 'global/master.twig' %} + +{% set title = category ~ ' / ' ~ mode %} + +{% block title %}{{ title }}{% endblock %} + +{% block content %} +
    +
    +
    + Navigation +
    +
    + {% for name,links in navigation %} +
    {{ name }}
    + {% for name,link in links %} + {{ name }} + {% endfor %} + {% endfor %} +
    +
    +
    +
    {{ title }}
    +
    {{ block('description') }}
    + {{ block('settingsContent') }} +
    +
    +
    +{% endblock %} diff --git a/resources/views/yuuno/settings/notifications/history.twig b/resources/views/yuuno/settings/notifications/history.twig new file mode 100644 index 0000000..591e6fc --- /dev/null +++ b/resources/views/yuuno/settings/notifications/history.twig @@ -0,0 +1,59 @@ +{% extends 'settings/notifications/master.twig' %} + +{% set mode = 'History' %} + +{% block description %} +

    The history of notifications that have been sent to you.

    +{% endblock %} + +{% set alerts = user.notifications(0, false)|batch(10) %} + +{% set paginationPages = alerts %} +{% set paginationUrl %}{{ route('settings.notifications.history') }}{% endset %} + +{% block css %} + +{% endblock %} + +{% block settingsContent %} + {% if alerts %} + + {% if alerts|length > 1 %} +
    + {% include 'elements/pagination.twig' %} +
    + {% endif %} + {% else %} +

    You don't have any notifications in your history!

    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/settings/notifications/master.twig b/resources/views/yuuno/settings/notifications/master.twig new file mode 100644 index 0000000..7af531f --- /dev/null +++ b/resources/views/yuuno/settings/notifications/master.twig @@ -0,0 +1,3 @@ +{% extends 'settings/master.twig' %} + +{% set category = 'Notifications' %} diff --git a/resources/views/yuuno/user/members.twig b/resources/views/yuuno/user/members.twig new file mode 100644 index 0000000..2e42198 --- /dev/null +++ b/resources/views/yuuno/user/members.twig @@ -0,0 +1,116 @@ +{% extends 'global/master.twig' %} + +{% set sorts = ['boxes', 'rectangles', 'list'] %} +{% set sort = get.sort in sorts ? get.sort : sorts[0] %} + +{% set notfound = rank == 0 %} + +{% set rankTitle %} +{% if notfound %}Not found{% else %}{{ ranks[rank].name(true) }}{% endif %} +{% endset %} + +{% set rankDescription %} +{% if notfound %}The requested rank could not be found!{% else %}{{ ranks[rank].description }}{% endif %} +{% endset %} + +{% set users = ranks[rank].users|batch(membersPerPage) %} + +{% set currPage = get.page|default(1) - 1 %} + +{% set paginationPages = users %} +{% set paginationUrl %}{% if rank %}{{ route('members.rank', rank) }}{% else %}{{ route('members.index') }}{% endif %}{% endset %} + +{% block title %}{{ rankTitle }}{% endblock %} + +{% block content %} +
    +

    {{ rankTitle }}

    +

    {{ rankDescription }}

    +
    +
    + + {% if not users|length %} +

    This rank has no members!

    + {% elseif not notfound %} +
    + {% if sort == sorts[2] %} + + + + + + + + + + + + + + + + + + + + + + {% for count,user in users[currPage] %} + + + + + + + + + + + {% endfor %} +
    No.UsernameRegisteredLast onlineUser titleCountry
    No.UsernameRegisteredLast onlineUser titleCountry
    + #{{ rank ? count + 1 : count }} + + {{ user.username }} + + + + {% if user.lastOnline == 0 %}Never logged in.{% else %}{% endif %} + + {{ user.title }} + + {% if user.country|lower == 'xx' %}?{% else %}{{ user.country(true) }}{% endif %} +
    + {% else %} + {% for user in users[currPage] %} + {# These comment tags are here to prevent the link extending too far + #}
    {# + #}{{ user.username }}{# + #}{# + #}{{ user.username }}{# + #}{# + #}
    {# + #}
    + {% endfor %} + {% endif %} +
    + {% if users|length > 1 %} + {% include 'elements/pagination.twig' %} + {% endif %} + {% endif %} +
    +{% endblock %} diff --git a/resources/views/yuuno/user/profile.twig b/resources/views/yuuno/user/profile.twig new file mode 100644 index 0000000..8f83b91 --- /dev/null +++ b/resources/views/yuuno/user/profile.twig @@ -0,0 +1,222 @@ +{% extends 'global/master.twig' %} + +{% set profileHidden = profile.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) or (profile.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) and (user.id != profile.id and not user.permission(constant('Sakura\\Perms\\Manage::USE_MANAGE'), constant('Sakura\\Perms::MANAGE')))) %} + +{% set noUserpage = profile.userPage|length < 1 %} + +{% set profileView = noUserpage and profileView == 'index' ? 'comments' : profileView %} + +{% block title %}{% if profileHidden %}User not found!{% else %}Profile of {{ profile.username }}{% endif %}{% endblock %} + +{% block js %} + {% if not profileHidden %} + + {% endif %} +{% endblock %} + +{% block content %} + {% if profileHidden %} +
    +
    +

    The requested user does not exist!

    + There are a few possible reasons for this: +
      +
    • They changed their username.
    • +
    • They may have been restricted.
    • +
    • You made a typo.
    • +
    • They never existed.
    • +
    +
    +
    + {% else %} +
    +
    +
    +
    +
    +
    +

    {{ profile.username }}

    + {% if profile.isPremium %}Tenshi {% endif %}{{ profile.country }} {{ profile.title }} +
    +
    + Joined +
    + {% if profile.lastOnline < 1 %} + {{ profile.username }} hasn't logged in yet. + {% else %} + Last online + {% endif %} + {% if profile.birthday != '0000-00-00' and profile.birthday|split('-')[0] > 0 %} +
    Age {{ profile.birthday(true) }} years old  + {% endif %} +
    +
    +
    +
    +
    + {% if not noUserpage %} + + {% endif %} + {# + #} + + {##} + +
    + {% if user.isActive %} +
    + {% if user.id == profile.id %} + + {% else %} + {% if user.isFriends(profile.id) != 0 %}{% endif %} + + + {% endif %} + {% if user.permission(constant('Sakura\\Perms\\Manage::CAN_RESTRICT_USERS'), constant('Sakura\\Perms::MANAGE')) %} + + {% endif %} +
    + {% endif %} +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + + + + +
    Threads{{ profile.forumStats.topics }}
    Posts{{ profile.forumStats.posts }}
    Friends{{ profile.friends(2)|length }}
    +
    + {% if profile.profileFields or user.permission(constant('Sakura\\Perms\\Manage::USE_MANAGE'), constant('Sakura\\Perms::MANAGE')) %} + {% if user.isActive %} + + {% for name,field in profile.profileFields %} + + + + + {% endfor %} + {% if user.permission(constant('Sakura\\Perms\\Manage::USE_MANAGE'), constant('Sakura\\Perms::MANAGE')) %} + + + + + + + + + + + + + {% endif %} +
    + {{ field.name }} + + {% if name == 'youtube' %} + {% if field.youtubetype == true %}{{ profile.username }}'s Channel{% else %}{{ field.value }}{% endif %} + {% else %} + {% if field.islink %} + + {% endif %} + {{ field.value }} + {% if field.islink %} + + {% endif %} + {% endif %} +
    E-mail address{{ profile.email }}
    Register IP{{ profile.registerIp }}
    Last IP{{ profile.lastIp }}
    + {% else %} + Log in to view the full profile! + {% endif %} + {% endif %} +
    + Account Standing + {% if profile.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) %} +

    Deactivated

    + {% elseif profile.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %} +

    Restricted

    + {% elseif false %} +

    Bad

    + {% else %} +

    Good

    + {% endif %} +
    +
    +
    +
    + {% endif %} +{% endblock %} diff --git a/resources/views/yuuno/user/report.twig b/resources/views/yuuno/user/report.twig new file mode 100644 index 0000000..b982653 --- /dev/null +++ b/resources/views/yuuno/user/report.twig @@ -0,0 +1,5 @@ +{% extends 'global/master.twig' %} + +{% block content %} +

    I'll actually make reporting a thing, someday...

    +{% endblock %} diff --git a/routes.php b/routes.php index 46cfe57..a264d2b 100644 --- a/routes.php +++ b/routes.php @@ -68,6 +68,11 @@ Router::group(['before' => 'maintenance'], function () { Router::get('/post/{id:i}', 'NewsController@post', 'news.post'); }); + // Chat + Router::group(['prefix' => 'chat'], function () { + Router::get('/redirect', 'ChatController@category', 'chat.redirect'); + }); + // Forum Router::group(['prefix' => 'forum'], function () { // Post diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d8eaf1f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": false, + "removeComments": true, + "preserveConstEnums": true + }, + "exclude": [ + "public" + ] +} diff --git a/utility.php b/utility.php index 98aa568..e595ccf 100644 --- a/utility.php +++ b/utility.php @@ -5,8 +5,9 @@ use Sakura\Config; use Sakura\Net; +use Sakura\Router; -// Sort of aias for Config::get +// Sort of alias for Config::get function config($value) { $split = explode('.', $value); @@ -20,6 +21,12 @@ function config($value) } } +// Alias for Router::route +function route($name, $args = null) +{ + return Router::route($name, $args); +} + function clean_string($string, $lower = false, $noSpecial = false, $replaceSpecial = '') { // Run common sanitisation function over string @@ -69,7 +76,7 @@ function get_country_code() } // Check if the required header is set and return it - if (isset($_SERVER['HTTP_CF_IPCOUNTRY'])) { + if (isset($_SERVER['HTTP_CF_IPCOUNTRY']) && strlen($_SERVER['HTTP_CF_IPCOUNTRY']) === 2) { return $_SERVER['HTTP_CF_IPCOUNTRY']; } @@ -96,7 +103,6 @@ function get_country_name($code) function password_entropy($password) { - // Decode utf-8 chars $password = utf8_decode($password); // Count the amount of unique characters in the password string and calculate the entropy @@ -123,62 +129,31 @@ function byte_symbol($bytes) return $bytes; } +// turn this function into a wrapped class! function send_mail($to, $subject, $body) { - // Initialise PHPMailer - $mail = new PHPMailer; + $transport = Swift_SmtpTransport::newInstance() + ->setHost(config('mail.smtp.server')) + ->setPort(config('mail.smtp.port')); - // Set to SMTP - $mail->isSMTP(); + if (config('mail.smtp.secure')) { + $transport->setEncryption(config('mail.smtp.secure')); + } - // Set the SMTP server host - $mail->Host = config('mail.smtp.server'); - - // Do we require authentication? - $mail->SMTPAuth = config('mail.smtp.auth'); - - // Do we encrypt as well? - $mail->SMTPSecure = config('mail.smtp.secure'); - - // Set the port to the SMTP server - $mail->Port = config('mail.smtp.port'); - - // If authentication is required log in as well if (config('mail.smtp.auth')) { - $mail->Username = config('mail.smtp.username'); - $mail->Password = config('mail.smtp.password'); + $transport + ->setUsername(config('mail.smtp.username')) + ->setPassword(config('mail.smtp.password')); } - // Add a reply-to header - $mail->addReplyTo(config('mail.smtp.reply_to'), config('mail.smtp.reply_name')); + $mailer = Swift_Mailer::newInstance($transport); - // Set a from address as well - $mail->setFrom(config('mail.smtp.from'), config('mail.smtp.name')); + $message = Swift_message::newInstance($subject) + ->setFrom([config('mail.smtp.from') => config('mail.smtp.name')]) + ->setBcc($to) + ->setBody($body); - // Set the addressee - foreach ($to as $email => $name) { - $mail->addBCC($email, $name); - } - - // Subject line - $mail->Subject = $subject; - - // Set body - $mail->Body = $body; - - // Send the message - $send = $mail->send(); - - // Clear the addressee list - $mail->clearAddresses(); - - // If we got an error return the error - if (!$send) { - return $mail->ErrorInfo; - } - - // Else just return whatever - return $send; + return $mailer->send($message); } function error_handler($errno, $errstr, $errfile, $errline) @@ -190,24 +165,25 @@ function error_handler($errno, $errstr, $errfile, $errline) switch ($errno) { case E_ERROR: case E_USER_ERROR: - $error = 'FATAL ERROR: ' . $errstr . ' on line ' . $errline . ' in ' . $errfile; + $error = "FATAL ERROR"; break; case E_WARNING: case E_USER_WARNING: - $error = 'WARNING: ' . $errstr . ' on line ' . $errline . ' in ' . $errfile; + $error = "WARNING"; break; case E_NOTICE: case E_USER_NOTICE: - $error = 'NOTICE: ' . $errstr . ' on line ' . $errline . ' in ' . $errfile; + $error = "NOTICE"; break; default: - $error = 'Unknown error type [' . $errno . ']: ' . $errstr . ' on line ' . $errline - . ' in ' . $errfile; + $error = "Unknown error type [{$errno}]"; } + $error .= ": {$errstr} on line {$errline} in {$errfile}"; + // Truncate all previous outputs ob_clean(); ob_end_clean(); @@ -215,11 +191,11 @@ function error_handler($errno, $errstr, $errfile, $errline) // Check for dev mode $detailed = config('dev.show_errors'); - // Build page + // Build page (not even going to bother cleaning this one up) $errorPage = ' - + Sakura Internal Error