From fd98e37a844da97502810e62beaa0f51ac4e7d41 Mon Sep 17 00:00:00 2001 From: Siby P Varkey Date: Wed, 26 Apr 2017 13:59:14 +0530 Subject: [PATCH] Initial Files Addition to Repository All required files are added to the repository with the use of development branch --- PEAR2/Autoload.php | 243 ++ PEAR2/Cache/SHM.php | 371 ++ PEAR2/Cache/SHM/Adapter/APC.php | 406 ++ PEAR2/Cache/SHM/Adapter/Placebo.php | 358 ++ PEAR2/Cache/SHM/Adapter/Wincache.php | 383 ++ PEAR2/Cache/SHM/Exception.php | 34 + PEAR2/Cache/SHM/InvalidArgumentException.php | 35 + PEAR2/Console/Color.php | 369 ++ PEAR2/Console/Color/Backgrounds.php | 136 + PEAR2/Console/Color/Exception.php | 28 + PEAR2/Console/Color/Flags.php | 88 + PEAR2/Console/Color/Fonts.php | 136 + PEAR2/Console/Color/Styles.php | 130 + .../Color/UnexpectedValueException.php | 40 + PEAR2/Console/CommandLine.php | 1289 ++++++ PEAR2/Console/CommandLine/Action.php | 142 + PEAR2/Console/CommandLine/Action/Callback.php | 86 + PEAR2/Console/CommandLine/Action/Counter.php | 84 + PEAR2/Console/CommandLine/Action/Help.php | 58 + PEAR2/Console/CommandLine/Action/List.php | 69 + PEAR2/Console/CommandLine/Action/Password.php | 90 + .../Console/CommandLine/Action/StoreArray.php | 76 + .../Console/CommandLine/Action/StoreFalse.php | 62 + .../Console/CommandLine/Action/StoreFloat.php | 73 + PEAR2/Console/CommandLine/Action/StoreInt.php | 73 + .../CommandLine/Action/StoreString.php | 60 + .../Console/CommandLine/Action/StoreTrue.php | 61 + PEAR2/Console/CommandLine/Action/Version.php | 58 + PEAR2/Console/CommandLine/Argument.php | 94 + PEAR2/Console/CommandLine/Command.php | 72 + .../CommandLine/CustomMessageProvider.php | 67 + PEAR2/Console/CommandLine/Element.php | 151 + PEAR2/Console/CommandLine/Exception.php | 90 + PEAR2/Console/CommandLine/MessageProvider.php | 57 + .../CommandLine/MessageProvider/Default.php | 143 + PEAR2/Console/CommandLine/Option.php | 393 ++ PEAR2/Console/CommandLine/Outputter.php | 64 + .../Console/CommandLine/Outputter/Default.php | 78 + PEAR2/Console/CommandLine/Renderer.php | 72 + .../Console/CommandLine/Renderer/Default.php | 441 ++ PEAR2/Console/CommandLine/Result.php | 72 + PEAR2/Console/CommandLine/XmlParser.php | 303 ++ PEAR2/Net/RouterOS/Client.php | 819 ++++ PEAR2/Net/RouterOS/Communicator.php | 671 +++ PEAR2/Net/RouterOS/DataFlowException.php | 44 + PEAR2/Net/RouterOS/Exception.php | 34 + .../Net/RouterOS/InvalidArgumentException.php | 43 + PEAR2/Net/RouterOS/LengthException.php | 93 + PEAR2/Net/RouterOS/Message.php | 237 ++ PEAR2/Net/RouterOS/NotSupportedException.php | 91 + PEAR2/Net/RouterOS/Query.php | 267 ++ PEAR2/Net/RouterOS/Registry.php | 279 ++ PEAR2/Net/RouterOS/Request.php | 403 ++ PEAR2/Net/RouterOS/Response.php | 335 ++ PEAR2/Net/RouterOS/ResponseCollection.php | 569 +++ PEAR2/Net/RouterOS/SocketException.php | 44 + .../Net/RouterOS/UnexpectedValueException.php | 88 + PEAR2/Net/RouterOS/Util.php | 1177 ++++++ PEAR2/Net/Transmitter/Exception.php | 36 + PEAR2/Net/Transmitter/FilterCollection.php | 229 ++ PEAR2/Net/Transmitter/LockException.php | 36 + PEAR2/Net/Transmitter/NetworkStream.php | 181 + PEAR2/Net/Transmitter/SocketException.php | 124 + PEAR2/Net/Transmitter/Stream.php | 605 +++ PEAR2/Net/Transmitter/StreamException.php | 119 + PEAR2/Net/Transmitter/TcpClient.php | 400 ++ PEAR2/Net/Transmitter/TcpServerConnection.php | 147 + ajax_add_profile.php | 55 + ajax_add_sysuser.php | 34 + ajax_adduser.php | 116 + ajax_addusers.php | 90 + ajax_change_syspass.php | 16 + ajax_del_profile.php | 40 + ajax_del_sysuser.php | 16 + ajax_edit_profile.php | 65 + ajax_edit_sysuser.php | 35 + ajax_expired.php | 31 + ajax_get_profiles.php | 35 + ajax_get_sysuser.php | 15 + ajax_rem_selected.php | 38 + ajax_rem_user.php | 18 + ajax_reset_pass.php | 26 + ajax_uninitiated.php | 28 + backup.php | 66 + config.php | 5 + css/animate.css | 3591 +++++++++++++++++ css/awesome-bootstrap-checkbox.css | 317 ++ css/bootstrap.min.css | 5 + css/customModal.css | 168 + css/font-awesome.min.css | 4 + css/print.css | 77 + css/style.css | 341 ++ database.php | 60 + db_backup_20_09_2016_14_11_47.sql | 918 +++++ dbconfig.php | 24 + favicon.ico | Bin 0 -> 1150 bytes fonts/FontAwesome.otf | Bin 0 -> 85908 bytes fonts/fontawesome-webfont.eot | Bin 0 -> 56006 bytes fonts/fontawesome-webfont.svg | 520 +++ fonts/fontawesome-webfont.ttf | Bin 0 -> 112160 bytes fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes fonts/glyphicons-halflings-regular.svg | 229 ++ fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes header.php | 954 +++++ hotsoft.php | 133 + images/bg.jpg | Bin 0 -> 1461 bytes images/error.png | Bin 0 -> 2114 bytes images/information.png | Bin 0 -> 2392 bytes images/loading.gif | Bin 0 -> 3405 bytes images/logo.png | Bin 0 -> 31461 bytes images/progress.gif | Bin 0 -> 3405 bytes images/shot1.png | Bin 0 -> 221580 bytes images/shot2.png | Bin 0 -> 164566 bytes images/shot3.png | Bin 0 -> 186950 bytes images/shot4.png | Bin 0 -> 230287 bytes images/shot5.png | Bin 0 -> 41600 bytes images/shot6.png | Bin 0 -> 62139 bytes images/shotx.png | Bin 0 -> 132316 bytes images/success.png | Bin 0 -> 1754 bytes images/warning.png | Bin 0 -> 1376 bytes index.php | 881 ++++ info.php | 91 + js/bootstrap.min.js | 7 + js/customModal.js | 180 + js/jquery-2.1.1.min.js | 4 + login.php | 97 + logout.php | 7 + modal_change_pass.php | 72 + modal_delete_guest.php | 61 + modal_get_profiles.php | 88 + modal_get_user.php | 76 + readme.txt | 41 + settings.php | 6 + voucher.php | 513 +++ 136 files changed, 24400 insertions(+) create mode 100644 PEAR2/Autoload.php create mode 100644 PEAR2/Cache/SHM.php create mode 100644 PEAR2/Cache/SHM/Adapter/APC.php create mode 100644 PEAR2/Cache/SHM/Adapter/Placebo.php create mode 100644 PEAR2/Cache/SHM/Adapter/Wincache.php create mode 100644 PEAR2/Cache/SHM/Exception.php create mode 100644 PEAR2/Cache/SHM/InvalidArgumentException.php create mode 100644 PEAR2/Console/Color.php create mode 100644 PEAR2/Console/Color/Backgrounds.php create mode 100644 PEAR2/Console/Color/Exception.php create mode 100644 PEAR2/Console/Color/Flags.php create mode 100644 PEAR2/Console/Color/Fonts.php create mode 100644 PEAR2/Console/Color/Styles.php create mode 100644 PEAR2/Console/Color/UnexpectedValueException.php create mode 100644 PEAR2/Console/CommandLine.php create mode 100644 PEAR2/Console/CommandLine/Action.php create mode 100644 PEAR2/Console/CommandLine/Action/Callback.php create mode 100644 PEAR2/Console/CommandLine/Action/Counter.php create mode 100644 PEAR2/Console/CommandLine/Action/Help.php create mode 100644 PEAR2/Console/CommandLine/Action/List.php create mode 100644 PEAR2/Console/CommandLine/Action/Password.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreArray.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreFalse.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreFloat.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreInt.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreString.php create mode 100644 PEAR2/Console/CommandLine/Action/StoreTrue.php create mode 100644 PEAR2/Console/CommandLine/Action/Version.php create mode 100644 PEAR2/Console/CommandLine/Argument.php create mode 100644 PEAR2/Console/CommandLine/Command.php create mode 100644 PEAR2/Console/CommandLine/CustomMessageProvider.php create mode 100644 PEAR2/Console/CommandLine/Element.php create mode 100644 PEAR2/Console/CommandLine/Exception.php create mode 100644 PEAR2/Console/CommandLine/MessageProvider.php create mode 100644 PEAR2/Console/CommandLine/MessageProvider/Default.php create mode 100644 PEAR2/Console/CommandLine/Option.php create mode 100644 PEAR2/Console/CommandLine/Outputter.php create mode 100644 PEAR2/Console/CommandLine/Outputter/Default.php create mode 100644 PEAR2/Console/CommandLine/Renderer.php create mode 100644 PEAR2/Console/CommandLine/Renderer/Default.php create mode 100644 PEAR2/Console/CommandLine/Result.php create mode 100644 PEAR2/Console/CommandLine/XmlParser.php create mode 100644 PEAR2/Net/RouterOS/Client.php create mode 100644 PEAR2/Net/RouterOS/Communicator.php create mode 100644 PEAR2/Net/RouterOS/DataFlowException.php create mode 100644 PEAR2/Net/RouterOS/Exception.php create mode 100644 PEAR2/Net/RouterOS/InvalidArgumentException.php create mode 100644 PEAR2/Net/RouterOS/LengthException.php create mode 100644 PEAR2/Net/RouterOS/Message.php create mode 100644 PEAR2/Net/RouterOS/NotSupportedException.php create mode 100644 PEAR2/Net/RouterOS/Query.php create mode 100644 PEAR2/Net/RouterOS/Registry.php create mode 100644 PEAR2/Net/RouterOS/Request.php create mode 100644 PEAR2/Net/RouterOS/Response.php create mode 100644 PEAR2/Net/RouterOS/ResponseCollection.php create mode 100644 PEAR2/Net/RouterOS/SocketException.php create mode 100644 PEAR2/Net/RouterOS/UnexpectedValueException.php create mode 100644 PEAR2/Net/RouterOS/Util.php create mode 100644 PEAR2/Net/Transmitter/Exception.php create mode 100644 PEAR2/Net/Transmitter/FilterCollection.php create mode 100644 PEAR2/Net/Transmitter/LockException.php create mode 100644 PEAR2/Net/Transmitter/NetworkStream.php create mode 100644 PEAR2/Net/Transmitter/SocketException.php create mode 100644 PEAR2/Net/Transmitter/Stream.php create mode 100644 PEAR2/Net/Transmitter/StreamException.php create mode 100644 PEAR2/Net/Transmitter/TcpClient.php create mode 100644 PEAR2/Net/Transmitter/TcpServerConnection.php create mode 100644 ajax_add_profile.php create mode 100644 ajax_add_sysuser.php create mode 100644 ajax_adduser.php create mode 100644 ajax_addusers.php create mode 100644 ajax_change_syspass.php create mode 100644 ajax_del_profile.php create mode 100644 ajax_del_sysuser.php create mode 100644 ajax_edit_profile.php create mode 100644 ajax_edit_sysuser.php create mode 100644 ajax_expired.php create mode 100644 ajax_get_profiles.php create mode 100644 ajax_get_sysuser.php create mode 100644 ajax_rem_selected.php create mode 100644 ajax_rem_user.php create mode 100644 ajax_reset_pass.php create mode 100644 ajax_uninitiated.php create mode 100644 backup.php create mode 100644 config.php create mode 100644 css/animate.css create mode 100644 css/awesome-bootstrap-checkbox.css create mode 100644 css/bootstrap.min.css create mode 100644 css/customModal.css create mode 100644 css/font-awesome.min.css create mode 100644 css/print.css create mode 100644 css/style.css create mode 100644 database.php create mode 100644 db_backup_20_09_2016_14_11_47.sql create mode 100644 dbconfig.php create mode 100644 favicon.ico create mode 100644 fonts/FontAwesome.otf create mode 100644 fonts/fontawesome-webfont.eot create mode 100644 fonts/fontawesome-webfont.svg create mode 100644 fonts/fontawesome-webfont.ttf create mode 100644 fonts/fontawesome-webfont.woff create mode 100644 fonts/glyphicons-halflings-regular.eot create mode 100644 fonts/glyphicons-halflings-regular.svg create mode 100644 fonts/glyphicons-halflings-regular.ttf create mode 100644 fonts/glyphicons-halflings-regular.woff create mode 100644 header.php create mode 100644 hotsoft.php create mode 100644 images/bg.jpg create mode 100644 images/error.png create mode 100644 images/information.png create mode 100644 images/loading.gif create mode 100644 images/logo.png create mode 100644 images/progress.gif create mode 100644 images/shot1.png create mode 100644 images/shot2.png create mode 100644 images/shot3.png create mode 100644 images/shot4.png create mode 100644 images/shot5.png create mode 100644 images/shot6.png create mode 100644 images/shotx.png create mode 100644 images/success.png create mode 100644 images/warning.png create mode 100644 index.php create mode 100644 info.php create mode 100644 js/bootstrap.min.js create mode 100644 js/customModal.js create mode 100644 js/jquery-2.1.1.min.js create mode 100644 login.php create mode 100644 logout.php create mode 100644 modal_change_pass.php create mode 100644 modal_delete_guest.php create mode 100644 modal_get_profiles.php create mode 100644 modal_get_user.php create mode 100644 readme.txt create mode 100644 settings.php create mode 100644 voucher.php diff --git a/PEAR2/Autoload.php b/PEAR2/Autoload.php new file mode 100644 index 0000000..3d6161e --- /dev/null +++ b/PEAR2/Autoload.php @@ -0,0 +1,243 @@ +getTrace(); + if (isset($trace[2]) && isset($trace[2]['function']) && + in_array($trace[2]['function'], array('class_exists', 'interface_exists'))) { + return false; + } + if (isset($trace[1]) && isset($trace[1]['function']) && + in_array($trace[1]['function'], array('class_exists', 'interface_exists'))) { + return false; + } + throw $e; + } + + /** + * Check if the requested class was loaded from the specified path + * + * @return bool + */ + protected static function loadSuccessful($class) + { + if (!class_exists($class, false) && !interface_exists($class, false)) { + return false; + } + return true; + } + + /** + * If possible, update the classmap file with newly-discovered + * mapping. + * + * @param string $class Class name discovered + * + * @param string $origin File where class was found + * + */ + protected static function updateMap($class, $origin) + { + if (is_writable(self::$mapfile) || is_writable(dirname(self::$mapfile))) { + self::$map[$class] = $origin; + file_put_contents(self::$mapfile, + '<'."?php\n" + . "// PEAR2\Autoload auto-generated classmap\n" + . "return " . var_export(self::$map, true) . ';', + LOCK_EX + ); + } + } + + /** + * return the array of paths PEAR2 autoload has registered + * + * @return array + */ + static function getPaths() + { + return self::$paths; + } + } +} +Autoload::initialize(dirname(__DIR__)); \ No newline at end of file diff --git a/PEAR2/Cache/SHM.php b/PEAR2/Cache/SHM.php new file mode 100644 index 0000000..02bec96 --- /dev/null +++ b/PEAR2/Cache/SHM.php @@ -0,0 +1,371 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ + +/** + * The namespace declaration. + */ +namespace PEAR2\Cache; + +/** + * Used as a catch-all for adapter initialization. + */ +use Exception as E; + +/** + * Implements this class. + */ +use IteratorAggregate; + +/** + * Used on failures by this class. + */ +use PEAR2\Cache\SHM\InvalidArgumentException; + +/** + * Main class for this package. + * + * Automatically chooses an adapter based on the available extensions. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +abstract class SHM implements IteratorAggregate +{ + /** + * @var array An array of adapter names that meet their requirements. + */ + private static $_adapters = array(); + + /** + * Creates a new shared memory storage. + * + * Estabilishes a separate persistent storage. Adapter is automatically + * chosen based on the available extensions. + * + * @param string $persistentId The ID for the storage. + * + * @return static|SHM A new instance of an SHM adapter (child of this + * class). + */ + final public static function factory($persistentId) + { + foreach (self::$_adapters as $adapter) { + try { + return new $adapter($persistentId); + } catch (E $e) { + //In case of a runtime error, try to fallback to other adapters. + } + } + throw new InvalidArgumentException( + 'No appropriate adapter available', + 1 + ); + } + + /** + * Checks if the adapter meets its requirements. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function isMeetingRequirements() + { + return true; + } + + /** + * Registers an adapter. + * + * Registers an SHM adapter, allowing you to call it with {@link factory()}. + * + * @param string $adapter FQCN of adapter. A valid adapter is one that + * extends this class. The class will be autoloaded if not already + * present. + * @param bool $prepend Whether to prepend this adapter into the list of + * possible adapters, instead of appending to it. + * + * @return bool TRUE on success, FALSE on failure. + */ + final public static function registerAdapter($adapter, $prepend = false) + { + if (class_exists($adapter, true) + && is_subclass_of($adapter, '\\' . __CLASS__) + && $adapter::isMeetingRequirements() + ) { + if ($prepend) { + self::$_adapters = array_merge( + array($adapter), + self::$_adapters + ); + } else { + self::$_adapters[] = $adapter; + } + return true; + } + return false; + } + + /** + * Adds a value to the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, or fails if it does. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function __invoke($key, $value, $ttl = 0) + { + return $this->add($key, $value, $ttl); + } + + /** + * Gets a value from the shared memory storage. + * + * This is a magic method, thanks to which any property you attempt to get + * the value of will be fetched from the adapter, treating the property name + * as the key of the value to get. + * + * @param string $key Name of key to get. + * + * @return mixed The current value of the specified key. + */ + public function __get($key) + { + return $this->get($key); + } + + /** + * Sets a value in the shared memory storage. + * + * This is a magic method, thanks to which any property you attempt to set + * the value of will be set by the adapter, treating the property name as + * the key of the value to set. The value is set without a TTL. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function __set($key, $value) + { + return $this->set($key, $value); + } + + /** + * Checks if a specified key is in the storage. + * + * This is a magic method, thanks to which any property you call isset() on + * will be checked by the adapter, treating the property name as the key + * of the value to check. + * + * @param string $key Name of key to check. + * + * @return bool TRUE if the key is in the storage, FALSE otherwise. + */ + public function __isset($key) + { + return $this->exists($key); + } + + /** + * Deletes a value from the shared memory storage. + * + * This is a magic method, thanks to which any property you attempt to unset + * the value of will be unset by the adapter, treating the property name as + * the key of the value to delete. + * + * @param string $key Name of key to delete. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function __unset($key) + { + return $this->delete($key); + } + + /** + * Creates a new shared memory storage. + * + * Estabilishes a separate persistent storage. + * + * @param string $persistentId The ID for the storage. The storage will be + * reused if it exists, or created if it doesn't exist. Data and locks + * are namespaced by this ID. + */ + abstract public function __construct($persistentId); + + /** + * Obtains a named lock. + * + * @param string $key Name of the key to obtain. Note that $key may + * repeat for each distinct $persistentId. + * @param double $timeout If the lock can't be immediatly obtained, the + * script will block for at most the specified amount of seconds. + * Setting this to 0 makes lock obtaining non blocking, and setting it + * to NULL makes it block without a time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function lock($key, $timeout = null); + + /** + * Releases a named lock. + * + * @param string $key Name of the key to release. Note that $key may + * repeat for each distinct $persistentId. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function unlock($key); + + /** + * Checks if a specified key is in the storage. + * + * @param string $key Name of key to check. + * + * @return bool TRUE if the key is in the storage, FALSE otherwise. + */ + abstract public function exists($key); + + /** + * Adds a value to the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, or fails if it does. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function add($key, $value, $ttl = 0); + + /** + * Sets a value in the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, overwrites it otherwise. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function set($key, $value, $ttl = 0); + + /** + * Gets a value from the shared memory storage. + * + * Gets the current value, or throws an exception if it's not stored. + * + * @param string $key Name of key to get the value of. + * + * @return mixed The current value of the specified key. + */ + abstract public function get($key); + + /** + * Deletes a value from the shared memory storage. + * + * @param string $key Name of key to delete. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function delete($key); + + /** + * Increases a value from the shared memory storage. + * + * Increases a value from the shared memory storage. Unlike a plain + * set($key, get($key)+$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to increase. + * @param int $step Value to increase the key by. + * + * @return int The new value. + */ + abstract public function inc($key, $step = 1); + + /** + * Decreases a value from the shared memory storage. + * + * Decreases a value from the shared memory storage. Unlike a plain + * set($key, get($key)-$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to decrease. + * @param int $step Value to decrease the key by. + * + * @return int The new value. + */ + abstract public function dec($key, $step = 1); + + /** + * Sets a new value if a key has a certain value. + * + * Sets a new value if a key has a certain value. This function only works + * when $old and $new are longs. + * + * @param string $key Key of the value to compare and set. + * @param int $old The value to compare the key against. + * @param int $new The value to set the key to. + * + * @return bool TRUE on success, FALSE on failure. + */ + abstract public function cas($key, $old, $new); + + /** + * Clears the persistent storage. + * + * Clears the persistent storage, i.e. removes all keys. Locks are left + * intact. + * + * @return void + */ + abstract public function clear(); + + /** + * Retrieve an external iterator + * + * Returns an external iterator. + * + * @param string|null $filter A PCRE regular expression. + * Only matching keys will be iterated over. + * Setting this to NULL matches all keys of this instance. + * @param bool $keysOnly Whether to return only the keys, + * or return both the keys and values. + * + * @return \Traversable An array with all matching keys as array keys, + * and values as array values. If $keysOnly is TRUE, the array keys are + * numeric, and the array values are key names. + */ + abstract public function getIterator($filter = null, $keysOnly = false); +} + +SHM::registerAdapter('\\' . __NAMESPACE__ . '\SHM\Adapter\Placebo'); +SHM::registerAdapter('\\' . __NAMESPACE__ . '\SHM\Adapter\Wincache'); +SHM::registerAdapter('\\' . __NAMESPACE__ . '\SHM\Adapter\APC'); diff --git a/PEAR2/Cache/SHM/Adapter/APC.php b/PEAR2/Cache/SHM/Adapter/APC.php new file mode 100644 index 0000000..a1b6ee7 --- /dev/null +++ b/PEAR2/Cache/SHM/Adapter/APC.php @@ -0,0 +1,406 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Cache\SHM\Adapter; + +/** + * Throws exceptions from this namespace, and extends from this class. + */ +use PEAR2\Cache\SHM; + +/** + * {@link APC::getIterator()} returns this object. + */ +use ArrayObject; + +/** + * Shared memory adapter for the APC extension. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +class APC extends SHM +{ + /** + * @var string ID of the current storage. + */ + protected $persistentId; + + /** + * List of persistent IDs. + * + * A list of persistent IDs within the current request (as keys) with an int + * (as a value) specifying the number of instances in the current request. + * Used as an attempt to ensure implicit lock releases even on errors in the + * critical sections, since APC doesn't have an actual locking function. + * @var array + */ + protected static $requestInstances = array(); + + /** + * @var array Array of lock names (as values) for each persistent ID (as + * key) obtained during the current request. + */ + protected static $locksBackup = array(); + + /** + * Creates a new shared memory storage. + * + * Estabilishes a separate persistent storage. + * + * @param string $persistentId The ID for the storage. The storage will be + * reused if it exists, or created if it doesn't exist. Data and locks + * are namespaced by this ID. + */ + public function __construct($persistentId) + { + $this->persistentId = __CLASS__ . ' ' . $persistentId; + if (isset(static::$requestInstances[$this->persistentId])) { + static::$requestInstances[$this->persistentId]++; + } else { + static::$requestInstances[$this->persistentId] = 1; + static::$locksBackup[$this->persistentId] = array(); + } + register_shutdown_function( + get_called_class() . '::releaseLocks', + $this->persistentId, + true + ); + } + + /** + * Checks if the adapter meets its requirements. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function isMeetingRequirements() + { + return extension_loaded('apc') + && version_compare(phpversion('apc'), '3.0.13', '>=') + && ini_get('apc.enabled') + && ('cli' !== PHP_SAPI || ini_get('apc.enable_cli')); + } + + /** + * Releases all locks in a storage. + * + * This function is not meant to be used directly. It is implicitly called + * by the the destructor and as a shutdown function when the request ends. + * One of these calls ends up releasing any unreleased locks obtained + * during the request. A lock is also implicitly released as soon as there + * are no objects left in the current request using the same persistent ID. + * + * @param string $internalPersistentId The internal persistent ID, the locks + * of which are being released. + * @param bool $isAtShutdown Whether the function was executed at + * shutdown. + * + * @return void + * @internal + */ + public static function releaseLocks($internalPersistentId, $isAtShutdown) + { + $hasInstances = 0 !== static::$requestInstances[$internalPersistentId]; + if ($isAtShutdown === $hasInstances) { + foreach (static::$locksBackup[$internalPersistentId] as $key) { + apc_delete($internalPersistentId . 'l ' . $key); + } + } + } + + /** + * Releases any locks obtained by this instance as soon as there are no more + * references to the object's persistent ID. + */ + public function __destruct() + { + static::$requestInstances[$this->persistentId]--; + static::releaseLocks($this->persistentId, false); + } + + + /** + * Obtains a named lock. + * + * @param string $key Name of the key to obtain. Note that $key may + * repeat for each distinct $persistentId. + * @param double $timeout If the lock can't be immediatly obtained, the + * script will block for at most the specified amount of seconds. + * Setting this to 0 makes lock obtaining non blocking, and setting it + * to NULL makes it block without a time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function lock($key, $timeout = null) + { + $lock = $this->persistentId . 'l ' . $key; + $hasTimeout = $timeout !== null; + $start = microtime(true); + while (!apc_add($lock, 1)) { + if ($hasTimeout && (microtime(true) - $start) > $timeout) { + return false; + } + } + static::$locksBackup[$this->persistentId] = $key; + return true; + } + + /** + * Releases a named lock. + * + * @param string $key Name of the key to release. Note that $key may + * repeat for each distinct $persistentId. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function unlock($key) + { + $lock = $this->persistentId . 'l ' . $key; + $success = apc_delete($lock); + if ($success) { + unset(static::$locksBackup[$this->persistentId][array_search( + $key, + static::$locksBackup[$this->persistentId], + true + )]); + return true; + } + return false; + } + + /** + * Checks if a specified key is in the storage. + * + * @param string $key Name of key to check. + * + * @return bool TRUE if the key is in the storage, FALSE otherwise. + */ + public function exists($key) + { + return apc_exists($this->persistentId . 'd ' . $key); + } + + /** + * Adds a value to the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, or fails if it does. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function add($key, $value, $ttl = 0) + { + return apc_add($this->persistentId . 'd ' . $key, $value, $ttl); + } + + /** + * Sets a value in the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, overwrites it otherwise. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function set($key, $value, $ttl = 0) + { + return apc_store($this->persistentId . 'd ' . $key, $value, $ttl); + } + + /** + * Gets a value from the shared memory storage. + * + * Gets the current value, or throws an exception if it's not stored. + * + * @param string $key Name of key to get the value of. + * + * @return mixed The current value of the specified key. + */ + public function get($key) + { + $fullKey = $this->persistentId . 'd ' . $key; + if (apc_exists($fullKey)) { + $value = apc_fetch($fullKey, $success); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to fetch key. ' . + 'Key has either just now expired or (if no TTL was set) ' . + 'is possibly in a race condition with another request.', + 100 + ); + } + return $value; + } + throw new SHM\InvalidArgumentException('No such key in cache', 101); + } + + /** + * Deletes a value from the shared memory storage. + * + * @param string $key Name of key to delete. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function delete($key) + { + return apc_delete($this->persistentId . 'd ' . $key); + } + + /** + * Increases a value from the shared memory storage. + * + * Increases a value from the shared memory storage. Unlike a plain + * set($key, get($key)+$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to increase. + * @param int $step Value to increase the key by. + * + * @return int The new value. + */ + public function inc($key, $step = 1) + { + $newValue = apc_inc( + $this->persistentId . 'd ' . $key, + (int) $step, + $success + ); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to increase the value. Are you sure the value is int?', + 102 + ); + } + return $newValue; + } + + /** + * Decreases a value from the shared memory storage. + * + * Decreases a value from the shared memory storage. Unlike a plain + * set($key, get($key)-$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to decrease. + * @param int $step Value to decrease the key by. + * + * @return int The new value. + */ + public function dec($key, $step = 1) + { + $newValue = apc_dec( + $this->persistentId . 'd ' . $key, + (int) $step, + $success + ); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to decrease the value. Are you sure the value is int?', + 103 + ); + } + return $newValue; + } + + /** + * Sets a new value if a key has a certain value. + * + * Sets a new value if a key has a certain value. This function only works + * when $old and $new are longs. + * + * @param string $key Key of the value to compare and set. + * @param int $old The value to compare the key against. + * @param int $new The value to set the key to. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function cas($key, $old, $new) + { + return apc_cas($this->persistentId . 'd ' . $key, $old, $new); + } + + /** + * Clears the persistent storage. + * + * Clears the persistent storage, i.e. removes all keys. Locks are left + * intact. + * + * @return void + */ + public function clear() + { + foreach (new APCIterator( + 'user', + '/^' . preg_quote($this->persistentId, '/') . 'd /', + APC_ITER_KEY, + 100, + APC_LIST_ACTIVE + ) as $key) { + apc_delete($key); + } + } + + /** + * Retrieve an external iterator + * + * Returns an external iterator. + * + * @param string|null $filter A PCRE regular expression. + * Only matching keys will be iterated over. + * Setting this to NULL matches all keys of this instance. + * @param bool $keysOnly Whether to return only the keys, + * or return both the keys and values. + * + * @return ArrayObject An array with all matching keys as array keys, + * and values as array values. If $keysOnly is TRUE, the array keys are + * numeric, and the array values are key names. + */ + public function getIterator($filter = null, $keysOnly = false) + { + $result = array(); + foreach (new APCIterator( + 'user', + '/^' . preg_quote($this->persistentId, '/') . 'd /', + APC_ITER_KEY, + 100, + APC_LIST_ACTIVE + ) as $key) { + $localKey = strstr($key, $this->persistentId . 'd '); + if (null === $filter || preg_match($filter, $localKey)) { + if ($keysOnly) { + $result[] = $localKey; + } else { + $result[$localKey] = apc_fetch($key); + } + } + } + return new ArrayObject($result); + } +} diff --git a/PEAR2/Cache/SHM/Adapter/Placebo.php b/PEAR2/Cache/SHM/Adapter/Placebo.php new file mode 100644 index 0000000..bbce22f --- /dev/null +++ b/PEAR2/Cache/SHM/Adapter/Placebo.php @@ -0,0 +1,358 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Cache\SHM\Adapter; + +/** + * Throws exceptions from this namespace, and extends from this class. + */ +use PEAR2\Cache\SHM; + +/** + * {@link Placebo::getIterator()} returns this object. + */ +use ArrayObject; + +/** + * This adapter is not truly persistent. It is intended to emulate persistency + * in non persistent environments, so that upper level applications can use a + * single code path for persistent and non persistent code. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +class Placebo extends SHM +{ + /** + * @var string ID of the current storage. + */ + protected $persistentId; + + /** + * List of persistent IDs. + * + * A list of persistent IDs within the current request (as keys) with an int + * (as a value) specifying the number of instances in the current request. + * Used as an attempt to ensure implicit lock releases on destruction. + * @var array + */ + protected static $requestInstances = array(); + + /** + * @var array Array of lock names (as values) for each persistent ID (as + * key) obtained during the current request. + */ + protected static $locksBackup = array(); + + /** + * The data storage. + * + * Each persistent ID is a key, and the value is an array. + * Each such array has data keys as its keys, and an array as a value. + * Each such array has as its elements the value, the timeout and the time + * the data was set. + * @var array + */ + protected static $data = array(); + + /** + * Creates a new shared memory storage. + * + * Estabilishes a separate persistent storage. + * + * @param string $persistentId The ID for the storage. The storage will be + * reused if it exists, or created if it doesn't exist. Data and locks + * are namespaced by this ID. + */ + public function __construct($persistentId) + { + if (isset(static::$requestInstances[$persistentId])) { + ++static::$requestInstances[$persistentId]; + } else { + static::$requestInstances[$persistentId] = 1; + static::$locksBackup[$persistentId] = array(); + static::$data[$persistentId] = array(); + } + $this->persistentId = $persistentId; + } + + /** + * Releases any unreleased locks. + */ + public function __destruct() + { + if (0 === --static::$requestInstances[$this->persistentId]) { + static::$locksBackup[$this->persistentId] = array(); + } + } + + /** + * Checks if the adapter meets its requirements. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function isMeetingRequirements() + { + return 'cli' === PHP_SAPI; + } + + /** + * Pretends to obtain a lock. + * + * @param string $key Ignored. + * @param double $timeout Ignored. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function lock($key, $timeout = null) + { + $key = (string) $key; + if (in_array($key, static::$locksBackup[$this->persistentId], true)) { + return false; + } + static::$locksBackup[$this->persistentId][] = $key; + return true; + } + + /** + * Pretends to release a lock. + * + * @param string $key Ignored + * + * @return bool TRUE on success, FALSE on failure. + */ + public function unlock($key) + { + $key = (string) $key; + if (!in_array($key, static::$locksBackup[$this->persistentId], true)) { + return false; + } + unset(static::$locksBackup[$this->persistentId][array_search( + $key, + static::$locksBackup[$this->persistentId], + true + )]); + return true; + } + + /** + * Checks if a specified key is in the storage. + * + * @param string $key Name of key to check. + * + * @return bool TRUE if the key is in the storage, FALSE otherwise. + */ + public function exists($key) + { + return array_key_exists($key, static::$data[$this->persistentId]); + } + + /** + * Adds a value to the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, or fails if it does. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Because "true" adapters purge the cache at the next + * request, this setting is ignored. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function add($key, $value, $ttl = 0) + { + if ($this->exists($key)) { + return false; + } + return $this->set($key, $value, $ttl); + } + + /** + * Sets a value in the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, overwrites it otherwise. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Because "true" adapters purge the cache at the next + * request, this setting is ignored. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function set($key, $value, $ttl = 0) + { + static::$data[$this->persistentId][$key] = $value; + return true; + } + + /** + * Gets a value from the shared memory storage. + * + * Gets the current value, or throws an exception if it's not stored. + * + * @param string $key Name of key to get the value of. + * + * @return mixed The current value of the specified key. + */ + public function get($key) + { + if ($this->exists($key)) { + return static::$data[$this->persistentId][$key]; + } + throw new SHM\InvalidArgumentException( + 'Unable to fetch key. No such key.', + 200 + ); + } + + /** + * Deletes a value from the shared memory storage. + * + * @param string $key Name of key to delete. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function delete($key) + { + if ($this->exists($key)) { + unset(static::$data[$this->persistentId][$key]); + return true; + } + return false; + } + + /** + * Increases a value from the shared memory storage. + * + * Increases a value from the shared memory storage. Unlike a plain + * set($key, get($key)+$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to increase. + * @param int $step Value to increase the key by. + * + * @return int The new value. + */ + public function inc($key, $step = 1) + { + if (!$this->exists($key) || !is_int($value = $this->get($key)) + || !$this->set($key, $value + (int) $step) + ) { + throw new SHM\InvalidArgumentException( + 'Unable to increase the value. Are you sure the value is int?', + 201 + ); + } + return $this->get($key); + } + + /** + * Decreases a value from the shared memory storage. + * + * Decreases a value from the shared memory storage. Unlike a plain + * set($key, get($key)-$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to decrease. + * @param int $step Value to decrease the key by. + * + * @return int The new value. + */ + public function dec($key, $step = 1) + { + if (!$this->exists($key) || !is_int($value = $this->get($key)) + || !$this->set($key, $value - (int) $step) + ) { + throw new SHM\InvalidArgumentException( + 'Unable to increase the value. Are you sure the value is int?', + 202 + ); + } + return $this->get($key); + } + + /** + * Sets a new value if a key has a certain value. + * + * Sets a new value if a key has a certain value. This function only works + * when $old and $new are longs. + * + * @param string $key Key of the value to compare and set. + * @param int $old The value to compare the key against. + * @param int $new The value to set the key to. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function cas($key, $old, $new) + { + return $this->exists($key) && ($this->get($key) === $old) + && is_int($new) && $this->set($key, $new); + } + + /** + * Clears the persistent storage. + * + * Clears the persistent storage, i.e. removes all keys. Locks are left + * intact. + * + * @return void + */ + public function clear() + { + static::$data[$this->persistentId] = array(); + } + + /** + * Retrieve an external iterator + * + * Returns an external iterator. + * + * @param string|null $filter A PCRE regular expression. + * Only matching keys will be iterated over. + * Setting this to NULL matches all keys of this instance. + * @param bool $keysOnly Whether to return only the keys, + * or return both the keys and values. + * + * @return ArrayObject An array with all matching keys as array keys, + * and values as array values. If $keysOnly is TRUE, the array keys are + * numeric, and the array values are key names. + */ + public function getIterator($filter = null, $keysOnly = false) + { + if (null === $filter) { + return new ArrayObject( + $keysOnly + ? array_keys(static::$data[$this->persistentId]) + : static::$data[$this->persistentId] + ); + } + + $result = array(); + foreach (static::$data[$this->persistentId] as $key => $value) { + if (preg_match($filter, $key)) { + $result[$key] = $value; + } + } + return new ArrayObject($keysOnly ? array_keys($result) : $result); + } +} diff --git a/PEAR2/Cache/SHM/Adapter/Wincache.php b/PEAR2/Cache/SHM/Adapter/Wincache.php new file mode 100644 index 0000000..5d2e726 --- /dev/null +++ b/PEAR2/Cache/SHM/Adapter/Wincache.php @@ -0,0 +1,383 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Cache\SHM\Adapter; + +/** + * Throws exceptions from this namespace, and extends from this class. + */ +use PEAR2\Cache\SHM; + +/** + * {@link Wincache::getIterator()} returns this object. + */ +use ArrayObject; + +/** + * Shared memory adapter for the WinCache extension. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +class Wincache extends SHM +{ + /** + * @var string ID of the current storage. + */ + protected $persistentId; + + /** + * List of persistent IDs. + * + * A list of persistent IDs within the current request (as keys) with an int + * (as a value) specifying the number of instances in the current request. + * Used as an attempt to ensure implicit lock releases on destruction. + * @var array + */ + protected static $requestInstances = array(); + + /** + * @var array Array of lock names obtained during the current request. + */ + protected static $locksBackup = array(); + + /** + * Creates a new shared memory storage. + * + * Estabilishes a separate persistent storage. + * + * @param string $persistentId The ID for the storage. The storage will be + * reused if it exists, or created if it doesn't exist. Data and locks + * are namespaced by this ID. + */ + public function __construct($persistentId) + { + $this->persistentId + = static::encodeLockName(__CLASS__ . ' ' . $persistentId) . ' '; + if (isset(static::$requestInstances[$this->persistentId])) { + static::$requestInstances[$this->persistentId]++; + } else { + static::$requestInstances[$this->persistentId] = 1; + static::$locksBackup[$this->persistentId] = array(); + } + } + + /** + * Encodes a lock name + * + * Encodes a lock name, so that it can be properly obtained. The scheme used + * is a subset of URL encoding, with only the "%" and "\" characters being + * escaped. The encoding itself is necessary, since lock names can't contain + * the "\" character. + * + * @param string $name The lock name to encode. + * + * @return string The encoded name. + * @link http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx + */ + protected static function encodeLockName($name) + { + return str_replace(array('%', '\\'), array('%25', '%5C'), $name); + } + + /** + * Checks if the adapter meets its requirements. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function isMeetingRequirements() + { + return extension_loaded('wincache') + && version_compare(phpversion('wincache'), '1.1.0', '>=') + && ini_get('wincache.ucenabled') + && ('cli' !== PHP_SAPI || ini_get('wincache.enablecli')); + } + + /** + * Releases any locks obtained by this instance as soon as there are no more + * references to the object's persistent ID. + */ + public function __destruct() + { + if (0 === --static::$requestInstances[$this->persistentId]) { + foreach (static::$locksBackup[$this->persistentId] as $key) { + wincache_unlock( + $this->persistentId . static::encodeLockName($key) + ); + } + } + } + + + /** + * Obtains a named lock. + * + * @param string $key Name of the key to obtain. Note that $key may + * repeat for each distinct $persistentId. + * @param double $timeout Ignored with WinCache. Script will always block if + * the lock can't be immediatly obtained. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function lock($key, $timeout = null) + { + $result = wincache_lock( + $this->persistentId . static::encodeLockName($key) + ); + if ($result) { + static::$locksBackup[$this->persistentId] = $key; + } + return $result; + } + + /** + * Releases a named lock. + * + * @param string $key Name of the key to release. Note that $key may + * repeat for each distinct $persistentId. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function unlock($key) + { + $result = wincache_unlock( + $this->persistentId . static::encodeLockName($key) + ); + if ($result) { + unset(static::$locksBackup[$this->persistentId][array_search( + $key, + static::$locksBackup[$this->persistentId], + true + )]); + } + return $result; + } + + /** + * Checks if a specified key is in the storage. + * + * @param string $key Name of key to check. + * + * @return bool TRUE if the key is in the storage, FALSE otherwise. + */ + public function exists($key) + { + return wincache_ucache_exists($this->persistentId . $key); + } + + /** + * Adds a value to the shared memory storage. + * + * Sets a value to the storage if it doesn't exist, or fails if it does. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function add($key, $value, $ttl = 0) + { + return wincache_ucache_add($this->persistentId . $key, $value, $ttl); + } + + /** + * Sets a value in the shared memory storage. + * + * Adds a value to the storage if it doesn't exist, overwrites it otherwise. + * + * @param string $key Name of key to associate the value with. + * @param mixed $value Value for the specified key. + * @param int $ttl Seconds to store the value. If set to 0 indicates no + * time limit. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function set($key, $value, $ttl = 0) + { + return wincache_ucache_set($this->persistentId . $key, $value, $ttl); + } + + /** + * Gets a value from the shared memory storage. + * + * Gets the current value, or throws an exception if it's not stored. + * + * @param string $key Name of key to get the value of. + * + * @return mixed The current value of the specified key. + */ + public function get($key) + { + $value = wincache_ucache_get($this->persistentId . $key, $success); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to fetch key. No such key, or key has expired.', + 300 + ); + } + return $value; + } + + /** + * Deletes a value from the shared memory storage. + * + * @param string $key Name of key to delete. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function delete($key) + { + return wincache_ucache_delete($this->persistentId . $key); + } + + /** + * Increases a value from the shared memory storage. + * + * Increases a value from the shared memory storage. Unlike a plain + * set($key, get($key)+$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to increase. + * @param int $step Value to increase the key by. + * + * @return int The new value. + */ + public function inc($key, $step = 1) + { + $newValue = wincache_ucache_inc( + $this->persistentId . $key, + (int) $step, + $success + ); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to increase the value. Are you sure the value is int?', + 301 + ); + } + return $newValue; + } + + /** + * Decreases a value from the shared memory storage. + * + * Decreases a value from the shared memory storage. Unlike a plain + * set($key, get($key)-$step) combination, this function also implicitly + * performs locking. + * + * @param string $key Name of key to decrease. + * @param int $step Value to decrease the key by. + * + * @return int The new value. + */ + public function dec($key, $step = 1) + { + $newValue = wincache_ucache_dec( + $this->persistentId . $key, + (int) $step, + $success + ); + if (!$success) { + throw new SHM\InvalidArgumentException( + 'Unable to decrease the value. Are you sure the value is int?', + 302 + ); + } + return $newValue; + } + + /** + * Sets a new value if a key has a certain value. + * + * Sets a new value if a key has a certain value. This function only works + * when $old and $new are longs. + * + * @param string $key Key of the value to compare and set. + * @param int $old The value to compare the key against. + * @param int $new The value to set the key to. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function cas($key, $old, $new) + { + return wincache_ucache_cas($this->persistentId . $key, $old, $new); + } + + /** + * Clears the persistent storage. + * + * Clears the persistent storage, i.e. removes all keys. Locks are left + * intact. + * + * @return void + */ + public function clear() + { + $info = wincache_ucache_info(); + foreach ($info['ucache_entries'] as $entry) { + if (!$entry['is_session'] + && 0 === strpos($entry['key_name'], $this->persistentId) + ) { + wincache_ucache_delete($entry['key_name']); + } + } + } + + /** + * Retrieve an external iterator + * + * Returns an external iterator. + * + * @param string|null $filter A PCRE regular expression. + * Only matching keys will be iterated over. + * Setting this to NULL matches all keys of this instance. + * @param bool $keysOnly Whether to return only the keys, + * or return both the keys and values. + * + * @return ArrayObject An array with all matching keys as array keys, + * and values as array values. If $keysOnly is TRUE, the array keys are + * numeric, and the array values are key names. + */ + public function getIterator($filter = null, $keysOnly = false) + { + $info = wincache_ucache_info(); + $result = array(); + foreach ($info['ucache_entries'] as $entry) { + if (!$entry['is_session'] + && 0 === strpos($entry['key_name'], $this->persistentId) + ) { + $localKey = strstr($entry['key_name'], $this->persistentId); + if (null === $filter || preg_match($filter, $localKey)) { + if ($keysOnly) { + $result[] = $localKey; + } else { + $result[$localKey] = apc_fetch($localKey); + } + } + } + } + return new ArrayObject($result); + } +} diff --git a/PEAR2/Cache/SHM/Exception.php b/PEAR2/Cache/SHM/Exception.php new file mode 100644 index 0000000..5984729 --- /dev/null +++ b/PEAR2/Cache/SHM/Exception.php @@ -0,0 +1,34 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Cache\SHM; + +/** + * Generic exception class of this package. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +interface Exception +{ +} diff --git a/PEAR2/Cache/SHM/InvalidArgumentException.php b/PEAR2/Cache/SHM/InvalidArgumentException.php new file mode 100644 index 0000000..817f2ab --- /dev/null +++ b/PEAR2/Cache/SHM/InvalidArgumentException.php @@ -0,0 +1,35 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 0.1.3 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Cache\SHM; + +/** + * Exception thrown when there's something wrong with an argument. + * + * @category Caching + * @package PEAR2_Cache_SHM + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Cache_SHM + */ +class InvalidArgumentException extends \InvalidArgumentException + implements Exception +{ +} diff --git a/PEAR2/Console/Color.php b/PEAR2/Console/Color.php new file mode 100644 index 0000000..8f0cbf5 --- /dev/null +++ b/PEAR2/Console/Color.php @@ -0,0 +1,369 @@ + + * @author Ivo Nascimento + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear.php.net/package/Console_Color + */ +namespace PEAR2\Console; + +use PEAR2\Console\Color\Backgrounds; +use PEAR2\Console\Color\Flags; +use PEAR2\Console\Color\Fonts; +use PEAR2\Console\Color\Styles; +use PEAR2\Console\Color\UnexpectedValueException; +use ReflectionClass; + +/** + * Main class for Console_Color. + * + * @category Console + * @package Console_Color + * @author Ivo Nascimento + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +class Color +{ + /** + * @var array List of valid font colors. + * Filled by {@link fillValidators()}. + */ + protected static $validFonts = array(); + + /** + * @var array List of valid background colors. + * Filled by {@link fillValidators()}. + */ + protected static $validBackgorunds = array(); + + /** + * @var string Name of a class that is used to resolve flags to codes. + */ + protected static $flagsResolver = ''; + + /** + * @var string Name of a class that is used to resolve styles to codes. + */ + protected static $stylesResolver = ''; + + /** + * @var int Flags to set. + */ + protected $flags = 0; + + /** + * @var int|null The code for the currently specified font color. + */ + protected $font = null; + + /** + * @var int|null The code for the currently specified background color. + */ + protected $backgorund = null; + + /** + * @var bool[] Array with the status of each style. + */ + protected $styles = array(); + + /** + * @var string|null The string to write to console to get the specified + * styling. NULL when the string needs to be regenerated. + */ + protected $sequence = null; + + /** + * Fills the list of valid fonts and backgrounds. + * + * Classes extending this one that wish to add additional valid colors, + * flags or styles should call this method in their own constructor BEFORE + * calling the parent constructor. + * + * @param string $fonts Name of class, the constants of which are + * valid font colors. + * @param string $backgrounds Name of class, the constants of which are + * valid background colors. + * @param string $flags Name of class that resolves flags to codes. + * Must inheirt from {@link Flags}. Constants of this + * class are considered the valid flags, and the coresponding codes must + * be overriden at the static $flagCodes property. + * @param string $styles Name of class that resolves styles to codes. + * Must inherit from {@link Styles}. Constants of this class are + * considered the valid styles, and the corresponding off/on codes must + * be overriden at the static $styleCodes property. + * + * @return void + */ + protected static function fillVlidators( + $fonts, + $backgrounds, + $flags, + $styles + ) { + if (empty(static::$validFonts)) { + $fonts = new ReflectionClass($fonts); + static::$validFonts = array_values( + array_unique($fonts->getConstants(), SORT_REGULAR) + ); + } + + if (empty(static::$validBackgorunds)) { + $bgs = new ReflectionClass($backgrounds); + static::$validBackgorunds = array_values( + array_unique($bgs->getConstants(), SORT_REGULAR) + ); + } + + if ('' === static::$flagsResolver) { + $base = __CLASS__ . '\Flags'; + if ($base === $flags || is_subclass_of($flags, $base)) { + static::$flagsResolver = $flags; + } + } + + if ('' === static::$stylesResolver) { + $base = __CLASS__ . '\Styles'; + if ($base === $styles || is_subclass_of($styles, $base)) { + static::$stylesResolver = $styles; + } + } + } + + /** + * Creates a new color. + * + * Note that leaving all arguments with their default values (and not + * applying styles) would result in a sequence that resets all settings to + * the console's defaults. + * + * @param int|null $font Initial font color. + * @param int|null $background Initial backgorund color. + * @param int $flags Initial flags. + * + * @see setFlags() + * @see setStyles() + * @see __toString() + */ + public function __construct( + $font = Fonts::KEEP, + $background = Backgrounds::KEEP, + $flags = Flags::NONE + ) { + static::fillVlidators( + __CLASS__ . '\Fonts', + __CLASS__ . '\Backgrounds', + __CLASS__ . '\Flags', + __CLASS__ . '\Styles' + ); + $this->setFont($font); + $this->setBackground($background); + $this->setFlags($flags); + } + + /** + * Gets the font color. + * + * @return int|null $color The font color. + */ + public function getFont() + { + return $this->font; + } + + /** + * Sets the font color. + * + * @param int|null $color The font color. + * + * @return $this + */ + public function setFont($color) + { + if (!in_array($color, static::$validFonts, true)) { + throw new UnexpectedValueException( + 'Invalid font supplied.', + UnexpectedValueException::CODE_FONT + ); + } + $this->font = $color; + + $this->sequence = null; + return $this; + } + + /** + * Gets the background color. + * + * @return int|null $color The background color. + */ + public function getBackground() + { + return $this->backgorund; + } + + /** + * Sets the background color. + * + * @param int|null $color The background color. + * + * @return $this + */ + public function setBackground($color) + { + if (!in_array($color, static::$validBackgorunds, true)) { + throw new UnexpectedValueException( + 'Invalid background supplied.', + UnexpectedValueException::CODE_BACKGROUND + ); + } + $this->backgorund = $color; + + $this->sequence = null; + return $this; + } + + /** + * Gets the flags. + * + * @return int The currently set flags. + */ + public function getFlags() + { + return $this->flags; + } + + /** + * Sets the flags. + * + * Sets the flags to apply in the sequence. Note that flags are applied + * before all other settings, in ascending order of the constant values. + * + * @param int $flags The new flags to set. Unknown flags will be ignored + * when forming the sequence, but will be visible with + * {@link getFlags()} non the less. + * + * @return $this + */ + public function setFlags($flags) + { + $this->flags = (int)$flags; + + $this->sequence = null; + return $this; + } + + /** + * Gets styles. + * + * @param int|null $style A single style to get the status of, + * or {@link Styles::ALL} to get all styles in an array. + * + * @return bool|null|bool[] A single style status, or + * an array of status if $style is {@link Styles::ALL}. + */ + public function getStyles($style = Styles::ALL) + { + if (Styles::ALL === $style) { + return $this->styles; + } + return isset($this->styles[$style]) ? $this->styles[$style] : null; + } + + /** + * Sets styles. + * + * Sets styles matched to a specified state. + * + * @param int|null $styles Bitmask of styles to set. You can also use the + * constant {@link Styles::ALL} (only) to set all known styles. + * Unknown styles will be ignored. + * @param bool|null $state The state to set the matched styles in. + * TRUE to enable them, + * FLASE to disable them, + * NULL to remove the setting for them (in effect using whatever the + * console had before the sequence was applied). + * + * @return $this + */ + public function setStyles($styles, $state) + { + $matchingStyles = call_user_func( + array(static::$stylesResolver, 'match'), + $styles + ); + if (null === $state) { + foreach ($matchingStyles as $style) { + unset($this->styles[$style]); + } + } else { + $state = (bool)$state; + foreach ($matchingStyles as $style) { + $this->styles[$style] = $state; + } + ksort($this->styles); + } + + $this->sequence = null; + return $this; + } + + /** + * Get the console escaping sequence. + * + * This is a magic PHP method that will be called when you use the object in + * a string context or otherwise explicitly cast it to a string. + * + * It generates the escape sequence and returns it. + * For the sake of performance, the escape sequence is cached, and is only + * regenerated when a setter has been previously called. + * + * @return string The string to write to console to get the specified + * styling. + */ + public function __toString() + { + if (null === $this->sequence) { + $seq = "\033["; + + $flags = implode( + ';', + call_user_func( + array(static::$flagsResolver, 'getCodes'), + $this->flags + ) + ); + if ('' !== $flags) { + $seq .= $flags . ';'; + } + + if (Fonts::KEEP !== $this->font) { + $seq .= "{$this->font};"; + } + if (Backgrounds::KEEP !== $this->backgorund) { + $seq .= "{$this->backgorund};"; + } + + foreach ($this->styles as $style => $state) { + $seq .= call_user_func( + array(static::$stylesResolver, 'getCode'), + $style, + $state + ) . ';'; + } + + $this->sequence = rtrim($seq, ';') . 'm'; + } + + return $this->sequence; + } +} diff --git a/PEAR2/Console/Color/Backgrounds.php b/PEAR2/Console/Color/Backgrounds.php new file mode 100644 index 0000000..e183222 --- /dev/null +++ b/PEAR2/Console/Color/Backgrounds.php @@ -0,0 +1,136 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +/** + * This class has the possibles values to a Background Color. + * + * @category Console + * @package PEAR2_Console_Color + * @author Ivo Nascimento + * @copyright 2011 Ivo Nascimento + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +abstract class Backgrounds +{ + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to specify that + * the background color already in effect should be kept. + */ + const KEEP = null; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to black/grey (implmementation defined). + */ + const BLACK = 40; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to black/grey (implementation defined). + */ + const GREY = 40; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to maroon/red (implementation defined). + */ + const MAROON = 41; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to maroon/red (implementation defined). + */ + const RED = 41; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to green/lime (implementation defined). + */ + const GREEN = 42; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to green/lime (implementation defined). + */ + const LIME = 42; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to brown/yellow (implementation defined). + */ + const BROWN = 43; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to brown/yellow (implementation defined). + */ + const YELLOW = 43; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to navy/blue (implementation defined). + */ + const NAVY = 44; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to navy/blue (implementation defined). + */ + const BLUE = 44; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to purple/magenta (implementation defined). + */ + const PURPLE = 45; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to purple/magenta (implementation defined). + */ + const MAGENTA = 45; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to teal/cyan (implementation defined). + */ + const TEAL = 46; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to teal/cyan (implementation defined). + */ + const CYAN = 46; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to silver/white (implementation defined). + */ + const SILVER = 47; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to silver/white (implementation defined). + */ + const WHITE = 47; + + /** + * Used at {@link \PEAR2\Console\Color::setBackground()} to set the + * background color to whatever the default one is. + */ + const RESET = 49; +} diff --git a/PEAR2/Console/Color/Exception.php b/PEAR2/Console/Color/Exception.php new file mode 100644 index 0000000..926e8ce --- /dev/null +++ b/PEAR2/Console/Color/Exception.php @@ -0,0 +1,28 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +/** + * Exception class for PEAR2_Console_Color. + * + * @category Console + * @package PEAR2_Console_Color + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +interface Exception +{ +} diff --git a/PEAR2/Console/Color/Flags.php b/PEAR2/Console/Color/Flags.php new file mode 100644 index 0000000..3eb6545 --- /dev/null +++ b/PEAR2/Console/Color/Flags.php @@ -0,0 +1,88 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +use ReflectionClass; + +/** + * This class has the possibles flags to a color setting. + * + * @category Console + * @package PEAR2_Console_Color + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +abstract class Flags +{ + /** + * Used at {@link \PEAR2\Console\Color::setFlags()} to specify that no + * flags should be applied. + */ + const NONE = 0; + + /** + * Used at {@link \PEAR2\Console\Color::setFlags()} as part of a bitmask. + * If specified, resets all color and style information before applying + * everything else. + */ + const RESET = 1; + + /** + * Used at {@link \PEAR2\Console\Color::setFlags()} as part of a bitmask. + * If specified, inverses the font and background colors, before letting + * the remaining settings further modify things. + * If specified together with {@link self::RESET}, takes effect AFTER the + * reset. + */ + const INVERSE = 2; + + /** + * @var int[] Array with the flag as a key, and the corresponding code as a + * value. + */ + protected static $flagCodes = array( + self::RESET => 0, + self::INVERSE => 7 + ); + + /** + * Gets the codes for a flag set. + * + * @param int $flags The flags to get the codes for. + * + * @return int[] The codes for the flags specified, in ascending order, + * based on the flag constants' values. + */ + final public static function getCodes($flags) + { + if (self::NONE === $flags) { + return array(); + } + + $result = array(); + $flagsClass = new ReflectionClass(get_called_class()); + $validFlags = array_values( + array_unique($flagsClass->getConstants(), SORT_NUMERIC) + ); + foreach ($validFlags as $flag) { + if ($flags & $flag) { + $result[] = static::$flagCodes[$flag]; + } + } + return $result; + } +} diff --git a/PEAR2/Console/Color/Fonts.php b/PEAR2/Console/Color/Fonts.php new file mode 100644 index 0000000..8d9179c --- /dev/null +++ b/PEAR2/Console/Color/Fonts.php @@ -0,0 +1,136 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +/** + * This class has the possibles values to a Font Color. + * + * @category Console + * @package PEAR2_Console_Color + * @author Ivo Nascimento + * @copyright 2011 Ivo Nascimento + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +abstract class Fonts +{ + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to specify that + * the font color already in effect should be kept. + */ + const KEEP = null; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to black/grey (implementation defined). + */ + const BLACK = 30; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to black/grey (implementation defined). + */ + const GREY = 30; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to maroon/red (implementation defined). + */ + const MAROON = 31; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to maroon/red (implementation defined). + */ + const RED = 31; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to green/lime (implementation defined). + */ + const LIME = 32; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to green/lime (implementation defined). + */ + const GREEN = 32; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to brown/yellow (implementation defined). + */ + const BROWN = 33; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to brown/yellow (implementation defined). + */ + const YELLOW = 33; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to navy/blue (implementation defined). + */ + const NAVY = 34; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to navy/blue (implementation defined). + */ + const BLUE = 34; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to purple/magenta (implementation defined). + */ + const PURPLE = 35; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to purple/magenta (implementation defined). + */ + const MAGENTA = 35; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to teal/cyan (implementation defined). + */ + const TEAL = 36; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to teal/cyan (implementation defined). + */ + const CYAN = 36; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to silver/white (implementation defined). + */ + const SILVER = 37; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to silver/white (implementation defined). + */ + const WHITE = 37; + + /** + * Used at {@link \PEAR2\Console\Color::setFont()} to set the + * font color to whatever the default one is. + */ + const RESET = 39; +} diff --git a/PEAR2/Console/Color/Styles.php b/PEAR2/Console/Color/Styles.php new file mode 100644 index 0000000..620f3c6 --- /dev/null +++ b/PEAR2/Console/Color/Styles.php @@ -0,0 +1,130 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +use ReflectionClass; + +/** + * This class has the possibles values to a Font Style. + * + * @category Console + * @package PEAR2_Console_Color + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +abstract class Styles +{ + /** + * Used in {@link \PEAR2\Console\Color::setStyles()} to match all styles. + */ + const ALL = null; + + /** + * Used in {@link \PEAR2\Console\Color::setStyles()} as part of a bitmask. + * If specified, matches the bold style. + * When this style is enabled, the font is bolder. + * With ANSICON, the font color becomes more intense (but not bolder). + */ + const BOLD = 1; + + /** + * Used in {@link \PEAR2\Console\Color::setStyles()} as part of a bitmask. + * If specified, matches the underline style. + * When this style is enabled, the font is underlined. + * With ANSICON, the background color becomes more intense + * (and the font is not underlined), same as {@link self::BLINK}. + */ + const UNDERLINE = 2; + + /** + * Used in {@link \PEAR2\Console\Color::setStyles()} as part of a bitmask. + * If specified, matches the blink style. + * When this style is enabled, the font color switches between its regular + * color and the background color at regular (implementation defined) + * intervals, creating the illusion of a blinking text. + * With ANSICON, the background color becomes more intense + * (and the font is not blinking), same as with {@link self::UNDERLINE}. + */ + const BLINK = 4; + + /** + * Used in {@link \PEAR2\Console\Color::setStyles()} as part of a bitmask. + * If specified, matches the concealed style. + * When this style is enabled, the font color becomes the background color, + * rendering the text invisible. This style is particularly useful for + * implementations where simply setting the same color and background color + * would not necesarily provide a fully invisibile text (e.g. ANSICON). + */ + const CONCEALED = 8; + + /** + * @var (int[])[] An array describing the codes for the styles. + * Each array key is the style's constant, and each value is an array + * where the first member is the disable code, and the second is the + * enable code. + */ + protected static $styleCodes = array( + self::BOLD => array(22, 1), + self::UNDERLINE => array(24, 4), + self::BLINK => array(25, 5), + self::CONCEALED => array(28, 8) + ); + + /** + * Get style constants. + * + * @param int|null $styles Bitmask of styles to match. + * You can also use {@link self::ALL} (only) to get all styles. + * + * @return int[] Matching style constants. + */ + final public static function match($styles) + { + $flagsClass = new ReflectionClass(get_called_class()); + $validStyles = array_values( + array_unique($flagsClass->getConstants(), SORT_NUMERIC) + ); + unset($validStyles[array_search(self::ALL, $validStyles, true)]); + + if (self::ALL === $styles) { + return $validStyles; + } + $styles = (int)$styles; + + $result = array(); + foreach ($validStyles as $flag) { + if ($styles & $flag) { + $result[] = $flag; + } + } + return $result; + } + + /** + * Gets the code for a style. + * + * @param int $style The style to get the code for. + * @param bool $state The state to get code for. + * TRUE for the enabled state codes, + * FALSE for the disabled state codes. + * + * @return int The code for the flag specified. + */ + final public static function getCode($style, $state) + { + return static::$styleCodes[$style][(int)(bool)$state]; + } +} diff --git a/PEAR2/Console/Color/UnexpectedValueException.php b/PEAR2/Console/Color/UnexpectedValueException.php new file mode 100644 index 0000000..6a2b51b --- /dev/null +++ b/PEAR2/Console/Color/UnexpectedValueException.php @@ -0,0 +1,40 @@ + + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +namespace PEAR2\Console\Color; + +use UnexpectedValueException as U; + +/** + * Exception class for PEAR2_Console_Color. + * + * @category Console + * @package PEAR2_Console_Color + * @author Vasil Rangelov + * @copyright 2011 Ivo Nascimento + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Console_Color + */ +class UnexpectedValueException extends U implements Exception +{ + /** + * Used when an unexpected font value is supplied. + */ + const CODE_FONT = 1; + + /** + * Used when an unexpected background value is supplied. + */ + const CODE_BACKGROUND = 2; +} diff --git a/PEAR2/Console/CommandLine.php b/PEAR2/Console/CommandLine.php new file mode 100644 index 0000000..f2fc478 --- /dev/null +++ b/PEAR2/Console/CommandLine.php @@ -0,0 +1,1289 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +namespace PEAR2\Console; + +/** + * Main class for parsing command line options and arguments. + * + * There are three ways to create parsers with this class: + * + * // direct usage + * $parser = new PEAR2\Console\CommandLine(); + * + * // with an xml definition file + * $parser = PEAR2\Console\CommandLine::fromXmlFile('path/to/file.xml'); + * + * // with an xml definition string + * $validXmlString = '..your xml string...'; + * $parser = PEAR2\Console\CommandLine::fromXmlString($validXmlString); + * + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @example docs/examples/ex1.php + * @example docs/examples/ex2.php + */ +class CommandLine +{ + // Public properties {{{ + + /** + * Error messages. + * + * @var array $errors Error messages + * @todo move this to PEAR2\Console\CommandLine\MessageProvider + */ + public static $errors = array( + 'option_bad_name' => 'option name must be a valid php variable name (got: {$name})', + 'argument_bad_name' => 'argument name must be a valid php variable name (got: {$name})', + 'argument_no_default' => 'only optional arguments can have a default value', + 'option_long_and_short_name_missing' => 'you must provide at least an option short name or long name for option "{$name}"', + 'option_bad_short_name' => 'option "{$name}" short name must be a dash followed by a letter (got: "{$short_name}")', + 'option_bad_long_name' => 'option "{$name}" long name must be 2 dashes followed by a word (got: "{$long_name}")', + 'option_unregistered_action' => 'unregistered action "{$action}" for option "{$name}".', + 'option_bad_action' => 'invalid action for option "{$name}".', + 'option_invalid_callback' => 'you must provide a valid callback for option "{$name}"', + 'action_class_does_not_exists' => 'action "{$name}" class "{$class}" not found, make sure that your class is available before calling PEAR2\Console\CommandLine::registerAction()', + 'invalid_xml_file' => 'XML definition file "{$file}" does not exists or is not readable', + 'invalid_rng_file' => 'RNG file "{$file}" does not exists or is not readable' + ); + + /** + * The name of the program, if not given it defaults to argv[0]. + * + * @var string $name Name of your program + */ + public $name; + + /** + * A description text that will be displayed in the help message. + * + * @var string $description Description of your program + */ + public $description = ''; + + /** + * A string that represents the version of the program, if this property is + * not empty and property add_version_option is not set to false, the + * command line parser will add a --version option, that will display the + * property content. + * + * @var string $version + * @access public + */ + public $version = ''; + + /** + * Boolean that determine if the command line parser should add the help + * (-h, --help) option automatically. + * + * @var bool $add_help_option Whether to add a help option or not + */ + public $add_help_option = true; + + /** + * Boolean that determine if the command line parser should add the version + * (-v, --version) option automatically. + * Note that the version option is also generated only if the version + * property is not empty, it's up to you to provide a version string of + * course. + * + * @var bool $add_version_option Whether to add a version option or not + */ + public $add_version_option = true; + + /** + * Boolean that determine if providing a subcommand is mandatory. + * + * @var bool $subcommand_required Whether a subcommand is required or not + */ + public $subcommand_required = false; + + /** + * The command line parser renderer instance. + * + * @var object that implements PEAR2\Console\CommandLine\Renderer interface + */ + public $renderer = false; + + /** + * The command line parser outputter instance. + * + * @var PEAR2\Console\CommandLine\Outputter An outputter + */ + public $outputter = false; + + /** + * The command line message provider instance. + * + * @var PEAR2\Console\CommandLine\MessageProvider A message provider instance + */ + public $message_provider = false; + + /** + * Boolean that tells the parser to be POSIX compliant, POSIX demands the + * following behavior: the first non-option stops option processing. + * + * @var bool $force_posix Whether to force posix compliance or not + */ + public $force_posix = false; + + /** + * Boolean that tells the parser to set relevant options default values, + * according to the option action. + * + * @see PEAR2\Console\CommandLine\Option::setDefaults() + * @var bool $force_options_defaults Whether to force option default values + */ + public $force_options_defaults = false; + + /** + * An array of PEAR2\Console\CommandLine\Option objects. + * + * @var array $options The options array + */ + public $options = array(); + + /** + * An array of PEAR2\Console\CommandLine\Argument objects. + * + * @var array $args The arguments array + */ + public $args = array(); + + /** + * An array of PEAR2\Console\CommandLine\Command objects (sub commands). + * + * @var array $commands The commands array + */ + public $commands = array(); + + /** + * Parent, only relevant in Command objects but left here for interface + * convenience. + * + * @var PEAR2\Console\CommandLine The parent instance + * @todo move CommandLine::parent to CommandLine\Command + */ + public $parent = false; + + /** + * Array of valid actions for an option, this array will also store user + * registered actions. + * + * The array format is: + *
+     * array(
+     *      => array(, )
+     * )
+     * 
+ * + * @var array $actions List of valid actions + */ + public static $actions = array( + 'StoreTrue' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreTrue', true + ), + 'StoreFalse' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreFalse', true + ), + 'StoreString' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreString', true + ), + 'StoreInt' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreInt', true + ), + 'StoreFloat' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreFloat', true + ), + 'StoreArray' => array( + 'PEAR2\\Console\\CommandLine\\Action\\StoreArray', true + ), + 'Callback' => array( + 'PEAR2\\Console\\CommandLine\\Action\\Callback', true + ), + 'Counter' => array( + 'PEAR2\\Console\\CommandLine\\Action\\Counter', true + ), + 'Help' => array( + 'PEAR2\\Console\\CommandLine\\Action\\Help', true + ), + 'Version' => array( + 'PEAR2\\Console\\CommandLine\\Action\\Version', true + ), + 'Password' => array( + 'PEAR2\\Console\\CommandLine\\Action\\Password', true + ), + 'List' => array( + 'PEAR2\\Console\\CommandLine\\Action_List', true + ), + ); + + /** + * Custom errors messages for this command + * + * This array is of the form: + * + * $messageText, + * $messageName => $messageText, + * ... + * ); + * ?> + * + * + * If specified, these messages override the messages provided by the + * default message provider. For example: + * + * 'The argument foo is required.', + * ); + * ?> + * + * + * @var array + * @see PEAR2\Console\CommandLine\MessageProvider_Default + */ + public $messages = array(); + + // }}} + // {{{ Private properties + + /** + * Array of options that must be dispatched at the end. + * + * @var array $_dispatchLater Options to be dispatched + */ + private $_dispatchLater = array(); + + // }}} + // __construct() {{{ + + /** + * Constructor. + * Example: + * + * + * $parser = new PEAR2\Console\CommandLine(array( + * 'name' => 'yourprogram', // defaults to argv[0] + * 'description' => 'Description of your program', + * 'version' => '0.0.1', // your program version + * 'add_help_option' => true, // or false to disable --help option + * 'add_version_option' => true, // or false to disable --version option + * 'force_posix' => false // or true to force posix compliance + * )); + * + * + * @param array $params An optional array of parameters + * + * @return void + */ + public function __construct(array $params = array()) + { + if (isset($params['name'])) { + $this->name = $params['name']; + } else if (isset($argv) && count($argv) > 0) { + $this->name = $argv[0]; + } else if (isset($_SERVER['argv']) && count($_SERVER['argv']) > 0) { + $this->name = $_SERVER['argv'][0]; + } else if (isset($_SERVER['SCRIPT_NAME'])) { + $this->name = basename($_SERVER['SCRIPT_NAME']); + } + if (isset($params['description'])) { + $this->description = $params['description']; + } + if (isset($params['version'])) { + $this->version = $params['version']; + } + if (isset($params['add_version_option'])) { + $this->add_version_option = $params['add_version_option']; + } + if (isset($params['add_help_option'])) { + $this->add_help_option = $params['add_help_option']; + } + if (isset($params['subcommand_required'])) { + $this->subcommand_required = $params['subcommand_required']; + } + if (isset($params['force_posix'])) { + $this->force_posix = $params['force_posix']; + } else if (getenv('POSIXLY_CORRECT')) { + $this->force_posix = true; + } + if (isset($params['messages']) && is_array($params['messages'])) { + $this->messages = $params['messages']; + } + // set default instances + $this->renderer = new CommandLine\Renderer_Default($this); + $this->outputter = new CommandLine\Outputter_Default(); + $this->message_provider = new CommandLine\MessageProvider_Default(); + } + + // }}} + // accept() {{{ + + /** + * Method to allow PEAR2\Console\CommandLine to accept either: + * + a custom renderer, + * + a custom outputter, + * + or a custom message provider + * + * @param mixed $instance The custom instance + * + * @return void + * @throws PEAR2\Console\CommandLine\Exception if wrong argument passed + */ + public function accept($instance) + { + if ($instance instanceof CommandLine\Renderer) { + if (property_exists($instance, 'parser') && !$instance->parser) { + $instance->parser = $this; + } + $this->renderer = $instance; + } else if ($instance instanceof CommandLine\Outputter) { + $this->outputter = $instance; + } else if ($instance instanceof CommandLine\MessageProvider) { + $this->message_provider = $instance; + } else { + throw CommandLine\Exception::factory( + 'INVALID_CUSTOM_INSTANCE', + array(), + $this, + $this->messages + ); + } + } + + // }}} + // fromXmlFile() {{{ + + /** + * Returns a command line parser instance built from an xml file. + * + * Example: + * + * $parser = PEAR2\Console\CommandLine::fromXmlFile('path/to/file.xml'); + * $result = $parser->parse(); + * + * + * @param string $file Path to the xml file + * + * @return PEAR2\Console\CommandLine The parser instance + */ + public static function fromXmlFile($file) + { + return CommandLine\XmlParser::parse($file); + } + + // }}} + // fromXmlString() {{{ + + /** + * Returns a command line parser instance built from an xml string. + * + * Example: + * + * $xmldata = ' + * + * Compress files + * + * + * a list of files + * true + * + * '; + * $parser = PEAR2\Console\CommandLine::fromXmlString($xmldata); + * $result = $parser->parse(); + * + * + * @param string $string The xml data + * + * @return PEAR2\Console\CommandLine The parser instance + */ + public static function fromXmlString($string) + { + return CommandLine\XmlParser::parseString($string); + } + + // }}} + // addArgument() {{{ + + /** + * Adds an argument to the command line parser and returns it. + * + * Adds an argument with the name $name and set its attributes with the + * array $params, then return the PEAR2\Console\CommandLine\Argument instance + * created. + * The method accepts another form: you can directly pass a + * PEAR2\Console\CommandLine\Argument object as the sole argument, this allows + * you to contruct the argument separately, in order to reuse it in + * different command line parsers or commands for example. + * + * Example: + * + * $parser = new PEAR2\Console\CommandLine(); + * // add an array argument + * $parser->addArgument('input_files', array('multiple'=>true)); + * // add a simple argument + * $parser->addArgument('output_file'); + * $result = $parser->parse(); + * print_r($result->args['input_files']); + * print_r($result->args['output_file']); + * // will print: + * // array('file1', 'file2') + * // 'file3' + * // if the command line was: + * // myscript.php file1 file2 file3 + * + * + * In a terminal, the help will be displayed like this: + * + * $ myscript.php install -h + * Usage: myscript.php + * + * + * @param mixed $name A string containing the argument name or an + * instance of PEAR2\Console\CommandLine\Argument + * @param array $params An array containing the argument attributes + * + * @return PEAR2\Console\CommandLine\Argument the added argument + * @see PEAR2\Console\CommandLine\Argument + */ + public function addArgument($name, $params = array()) + { + if ($name instanceof CommandLine\Argument) { + $argument = $name; + } else { + $argument = new CommandLine\Argument($name, $params); + } + $argument->validate(); + $this->args[$argument->name] = $argument; + return $argument; + } + + // }}} + // addCommand() {{{ + + /** + * Adds a sub-command to the command line parser. + * + * Adds a command with the given $name to the parser and returns the + * PEAR2\Console\CommandLine\Command instance, you can then populate the command + * with options, configure it, etc... like you would do for the main parser + * because the class PEAR2\Console\CommandLine\Command inherits from + * PEAR2\Console\CommandLine. + * + * An example: + * + * $parser = new PEAR2\Console\CommandLine(); + * $install_cmd = $parser->addCommand('install'); + * $install_cmd->addOption( + * 'verbose', + * array( + * 'short_name' => '-v', + * 'long_name' => '--verbose', + * 'description' => 'be noisy when installing stuff', + * 'action' => 'StoreTrue' + * ) + * ); + * $parser->parse(); + * + * Then in a terminal: + * + * $ myscript.php install -h + * Usage: myscript.php install [options] + * + * Options: + * -h, --help display this help message and exit + * -v, --verbose be noisy when installing stuff + * + * $ myscript.php install --verbose + * Installing whatever... + * $ + * + * + * @param mixed $name A string containing the command name or an + * instance of PEAR2\Console\CommandLine\Command + * @param array $params An array containing the command attributes + * + * @return PEAR2\Console\CommandLine\Command The added subcommand + * @see PEAR2\Console\CommandLine\Command + */ + public function addCommand($name, $params = array()) + { + if ($name instanceof CommandLine\Command) { + $command = $name; + } else { + $params['name'] = $name; + $command = new CommandLine\Command($params); + // some properties must cascade to the child command if not + // passed explicitely. This is done only in this case, because if + // we have a Command object we have no way to determine if theses + // properties have already been set + $cascade = array( + 'add_help_option', + 'add_version_option', + 'outputter', + 'message_provider', + 'force_posix', + 'force_options_defaults' + ); + foreach ($cascade as $property) { + if (!isset($params[$property])) { + $command->$property = $this->$property; + } + } + if (!isset($params['renderer'])) { + $renderer = clone $this->renderer; + $renderer->parser = $command; + $command->renderer = $renderer; + } + } + $command->parent = $this; + $this->commands[$command->name] = $command; + return $command; + } + + // }}} + // addOption() {{{ + + /** + * Adds an option to the command line parser and returns it. + * + * Adds an option with the name $name and set its attributes with the + * array $params, then return the PEAR2\Console\CommandLine\Option instance + * created. + * The method accepts another form: you can directly pass a + * PEAR2\Console\CommandLine\Option object as the sole argument, this allows + * you to contruct the option separately, in order to reuse it in different + * command line parsers or commands for example. + * + * Example: + * + * $parser = new PEAR2\Console\CommandLine(); + * $parser->addOption('path', array( + * 'short_name' => '-p', // a short name + * 'long_name' => '--path', // a long name + * 'description' => 'path to the dir', // a description msg + * 'action' => 'StoreString', + * 'default' => '/tmp' // a default value + * )); + * $parser->parse(); + * + * + * In a terminal, the help will be displayed like this: + * + * $ myscript.php --help + * Usage: myscript.php [options] + * + * Options: + * -h, --help display this help message and exit + * -p, --path path to the dir + * + * + * + * Various methods to specify an option, these 3 commands are equivalent: + * + * $ myscript.php --path=some/path + * $ myscript.php -p some/path + * $ myscript.php -psome/path + * + * + * @param mixed $name A string containing the option name or an + * instance of PEAR2\Console\CommandLine\Option + * @param array $params An array containing the option attributes + * + * @return PEAR2\Console\CommandLine\Option The added option + * @see PEAR2\Console\CommandLine\Option + */ + public function addOption($name, $params = array()) + { + if ($name instanceof CommandLine\Option) { + $opt = $name; + } else { + $opt = new CommandLine\Option($name, $params); + } + $opt->validate(); + if ($this->force_options_defaults) { + $opt->setDefaults(); + } + $this->options[$opt->name] = $opt; + if (!empty($opt->choices) && $opt->add_list_option) { + $this->addOption( + 'list_' . $opt->name, + array( + 'long_name' => '--list-' . $opt->name, + 'description' => $this->message_provider->get( + 'LIST_OPTION_MESSAGE', + array('name' => $opt->name) + ), + 'action' => 'List', + 'action_params' => array('list' => $opt->choices), + ) + ); + } + return $opt; + } + + // }}} + // displayError() {{{ + + /** + * Displays an error to the user via stderr and exit with $exitCode if its + * value is not equals to false. + * + * @param string $error The error message + * @param int $exitCode The exit code number (default: 1). If set to + * false, the exit() function will not be called + * + * @return void + */ + public function displayError($error, $exitCode = 1) + { + $this->outputter->stderr($this->renderer->error($error)); + if ($exitCode !== false) { + exit($exitCode); + } + } + + // }}} + // displayUsage() {{{ + + /** + * Displays the usage help message to the user via stdout and exit with + * $exitCode if its value is not equals to false. + * + * @param int $exitCode The exit code number (default: 0). If set to + * false, the exit() function will not be called + * + * @return void + */ + public function displayUsage($exitCode = 0) + { + $this->outputter->stdout($this->renderer->usage()); + if ($exitCode !== false) { + exit($exitCode); + } + } + + // }}} + // displayVersion() {{{ + + /** + * Displays the program version to the user via stdout and exit with + * $exitCode if its value is not equals to false. + * + * @param int $exitCode The exit code number (default: 0). If set to + * false, the exit() function will not be called + * + * @return void + */ + public function displayVersion($exitCode = 0) + { + $this->outputter->stdout($this->renderer->version()); + if ($exitCode !== false) { + exit($exitCode); + } + } + + // }}} + // findOption() {{{ + + /** + * Finds the option that matches the given short_name (ex: -v), long_name + * (ex: --verbose) or name (ex: verbose). + * + * @param string $str The option identifier + * + * @return mixed A PEAR2\Console\CommandLine\Option instance or false + */ + public function findOption($str) + { + $str = trim($str); + if ($str === '') { + return false; + } + $matches = array(); + foreach ($this->options as $opt) { + if ($opt->short_name == $str + || $opt->long_name == $str + || $opt->name == $str + ) { + // exact match + return $opt; + } + if (substr($opt->long_name, 0, strlen($str)) === $str) { + // abbreviated long option + $matches[] = $opt; + } + } + if ($count = count($matches)) { + if ($count > 1) { + $matches_str = ''; + $padding = ''; + foreach ($matches as $opt) { + $matches_str .= $padding . $opt->long_name; + $padding = ', '; + } + throw CommandLine\Exception::factory( + 'OPTION_AMBIGUOUS', + array('name' => $str, 'matches' => $matches_str), + $this, + $this->messages + ); + } + return $matches[0]; + } + return false; + } + // }}} + // registerAction() {{{ + + /** + * Registers a custom action for the parser, an example: + * + * + * + * // in this example we create a "range" action: + * // the user will be able to enter something like: + * // $ -r 1,5 + * // and in the result we will have: + * // $result->options['range']: array(1, 5) + * + * class ActionRange extends PEAR2\Console\CommandLine\Action + * { + * public function execute($value=false, $params=array()) + * { + * $range = explode(',', str_replace(' ', '', $value)); + * if (count($range) != 2) { + * throw new Exception(sprintf( + * 'Option "%s" must be 2 integers separated by a comma', + * $this->option->name + * )); + * } + * $this->setResult($range); + * } + * } + * // then we can register our action + * PEAR2\Console\CommandLine::registerAction('Range', 'ActionRange'); + * // and now our action is available ! + * $parser = new PEAR2\Console\CommandLine(); + * $parser->addOption('range', array( + * 'short_name' => '-r', + * 'long_name' => '--range', + * 'action' => 'Range', // note our custom action + * 'description' => 'A range of two integers separated by a comma' + * )); + * // etc... + * + * + * + * @param string $name The name of the custom action + * @param string $class The class name of the custom action + * + * @return void + */ + public static function registerAction($name, $class) + { + if (!isset(self::$actions[$name])) { + if (!class_exists($class)) { + self::triggerError( + 'action_class_does_not_exists', + E_USER_ERROR, + array('{$name}' => $name, '{$class}' => $class) + ); + } + self::$actions[$name] = array($class, false); + } + } + + // }}} + // triggerError() {{{ + + /** + * A wrapper for programming errors triggering. + * + * @param string $msgId Identifier of the message + * @param int $level The php error level + * @param array $params An array of search=>replaces entries + * + * @return void + * @todo remove Console::triggerError() and use exceptions only + */ + public static function triggerError($msgId, $level, $params=array()) + { + if (isset(self::$errors[$msgId])) { + $msg = str_replace( + array_keys($params), + array_values($params), + self::$errors[$msgId] + ); + trigger_error($msg, $level); + } else { + trigger_error('unknown error', $level); + } + } + + // }}} + // parse() {{{ + + /** + * Parses the command line arguments and returns a + * PEAR2\Console\CommandLine\Result instance. + * + * @param integer $userArgc Number of arguments (optional) + * @param array $userArgv Array containing arguments (optional) + * + * @return PEAR2\Console\CommandLine\Result The result instance + * @throws Exception on user errors + */ + public function parse($userArgc=null, $userArgv=null) + { + $this->addBuiltinOptions(); + if ($userArgc !== null && $userArgv !== null) { + $argc = $userArgc; + $argv = $userArgv; + } else { + list($argc, $argv) = $this->getArgcArgv(); + } + // build an empty result + $result = new CommandLine\Result(); + if (!($this instanceof CommandLine\Command)) { + // remove script name if we're not in a subcommand + array_shift($argv); + $argc--; + } + // will contain arguments + $args = array(); + foreach ($this->options as $name=>$option) { + $result->options[$name] = $option->default; + } + // parse command line tokens + while ($argc--) { + $token = array_shift($argv); + try { + if ($cmd = $this->_getSubCommand($token)) { + $result->command_name = $cmd->name; + $result->command = $cmd->parse($argc, $argv); + break; + } else { + $this->parseToken($token, $result, $args, $argc); + } + } catch (Exception $exc) { + throw $exc; + } + } + // Parse a null token to allow any undespatched actions to be despatched. + $this->parseToken(null, $result, $args, 0); + // Check if an invalid subcommand was specified. If there are + // subcommands and no arguments, but an argument was provided, it is + // an invalid subcommand. + if ( count($this->commands) > 0 + && count($this->args) === 0 + && count($args) > 0 + ) { + throw CommandLine\Exception::factory( + 'INVALID_SUBCOMMAND', + array('command' => $args[0]), + $this, + $this->messages + ); + } + // if subcommand_required is set to true we must check that we have a + // subcommand. + if ( count($this->commands) + && $this->subcommand_required + && !$result->command_name + ) { + throw CommandLine\Exception::factory( + 'SUBCOMMAND_REQUIRED', + array('commands' => implode(array_keys($this->commands), ', ')), + $this, + $this->messages + ); + } + // minimum argument number check + $argnum = 0; + foreach ($this->args as $name=>$arg) { + if (!$arg->optional) { + $argnum++; + } + } + if (count($args) < $argnum) { + throw CommandLine\Exception::factory( + 'ARGUMENT_REQUIRED', + array('argnum' => $argnum, 'plural' => $argnum>1 ? 's': ''), + $this, + $this->messages + ); + } + // handle arguments + $c = count($this->args); + foreach ($this->args as $name=>$arg) { + $c--; + if ($arg->multiple) { + $result->args[$name] = $c ? array_splice($args, 0, -$c) : $args; + } else { + $result->args[$name] = array_shift($args); + } + if (!$result->args[$name] && $arg->optional && $arg->default) { + $result->args[$name] = $arg->default; + } + } + // dispatch deferred options + foreach ($this->_dispatchLater as $optArray) { + $optArray[0]->dispatchAction($optArray[1], $optArray[2], $this); + } + return $result; + } + + // }}} + // parseToken() {{{ + + /** + * Parses the command line token and modifies *by reference* the $options + * and $args arrays. + * + * @param string $token The command line token to parse + * @param object $result The PEAR2\Console\CommandLine\Result instance + * @param array &$args The argv array + * @param int $argc Number of lasting args + * + * @return void + * @access protected + * @throws Exception on user errors + */ + protected function parseToken($token, $result, &$args, $argc) + { + static $lastopt = false; + static $stopflag = false; + $last = $argc === 0; + if (!$stopflag && $lastopt) { + if (substr($token, 0, 1) == '-') { + if ($lastopt->argument_optional) { + $this->_dispatchAction($lastopt, '', $result); + if ($lastopt->action != 'StoreArray') { + $lastopt = false; + } + } else if (isset($result->options[$lastopt->name])) { + // case of an option that expect a list of args + $lastopt = false; + } else { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_REQUIRED', + array('name' => $lastopt->name), + $this, + $this->messages + ); + } + } else { + // when a StoreArray option is positioned last, the behavior + // is to consider that if there's already an element in the + // array, and the commandline expects one or more args, we + // leave last tokens to arguments + if ($lastopt->action == 'StoreArray' + && !empty($result->options[$lastopt->name]) + && count($this->args) > ($argc + count($args)) + ) { + if (!is_null($token)) { + $args[] = $token; + } + return; + } + if (!is_null($token) || $lastopt->action == 'Password') { + $this->_dispatchAction($lastopt, $token, $result); + } + if ($lastopt->action != 'StoreArray') { + $lastopt = false; + } + return; + } + } + if (!$stopflag && substr($token, 0, 2) == '--') { + // a long option + $optkv = explode('=', $token, 2); + if (trim($optkv[0]) == '--') { + // the special argument "--" forces in all cases the end of + // option scanning. + $stopflag = true; + return; + } + $opt = $this->findOption($optkv[0]); + if (!$opt) { + throw CommandLine\Exception::factory( + 'OPTION_UNKNOWN', + array('name' => $optkv[0]), + $this, + $this->messages + ); + } + $value = isset($optkv[1]) ? $optkv[1] : false; + if (!$opt->expectsArgument() && $value !== false) { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_UNEXPECTED', + array('name' => $opt->name, 'value' => $value), + $this, + $this->messages + ); + } + if ($opt->expectsArgument() && $value === false) { + // maybe the long option argument is separated by a space, if + // this is the case it will be the next arg + if ($last && !$opt->argument_optional) { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_REQUIRED', + array('name' => $opt->name), + $this, + $this->messages + ); + } + // we will have a value next time + $lastopt = $opt; + return; + } + if ($opt->action == 'StoreArray') { + $lastopt = $opt; + } + $this->_dispatchAction($opt, $value, $result); + } else if (!$stopflag && substr($token, 0, 1) == '-') { + // a short option + $optname = substr($token, 0, 2); + if ($optname == '-') { + // special case of "-": try to read stdin + $args[] = file_get_contents('php://stdin'); + return; + } + $opt = $this->findOption($optname); + if (!$opt) { + throw CommandLine\Exception::factory( + 'OPTION_UNKNOWN', + array('name' => $optname), + $this, + $this->messages + ); + } + // parse other options or set the value + // in short: handle -f and -f + $next = substr($token, 2, 1); + // check if we must wait for a value + if ($next === false) { + if ($opt->expectsArgument()) { + if ($last && !$opt->argument_optional) { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_REQUIRED', + array('name' => $opt->name), + $this, + $this->messages + ); + } + // we will have a value next time + $lastopt = $opt; + return; + } + $value = false; + } else { + if (!$opt->expectsArgument()) { + if ($nextopt = $this->findOption('-' . $next)) { + $this->_dispatchAction($opt, false, $result); + $this->parseToken( + '-' . substr($token, 2), + $result, + $args, + $last + ); + return; + } else { + throw CommandLine\Exception::factory( + 'OPTION_UNKNOWN', + array('name' => $next), + $this, + $this->messages + ); + } + } + if ($opt->action == 'StoreArray') { + $lastopt = $opt; + } + $value = substr($token, 2); + } + $this->_dispatchAction($opt, $value, $result); + } else { + // We have an argument. + // if we are in POSIX compliant mode, we must set the stop flag to + // true in order to stop option parsing. + if (!$stopflag && $this->force_posix) { + $stopflag = true; + } + if (!is_null($token)) { + $args[] = $token; + } + } + } + + // }}} + // addBuiltinOptions() {{{ + + /** + * Adds the builtin "Help" and "Version" options if needed. + * + * @return void + */ + public function addBuiltinOptions() + { + if ($this->add_help_option) { + $helpOptionParams = array( + 'long_name' => '--help', + 'description' => 'show this help message and exit', + 'action' => 'Help' + ); + if (!($option = $this->findOption('-h')) || $option->action == 'Help') { + // short name is available, take it + $helpOptionParams['short_name'] = '-h'; + } + $this->addOption('help', $helpOptionParams); + } + if ($this->add_version_option && !empty($this->version)) { + $versionOptionParams = array( + 'long_name' => '--version', + 'description' => 'show the program version and exit', + 'action' => 'Version' + ); + if (!$this->findOption('-v')) { + // short name is available, take it + $versionOptionParams['short_name'] = '-v'; + } + $this->addOption('version', $versionOptionParams); + } + } + + // }}} + // getArgcArgv() {{{ + + /** + * Tries to return an array containing argc and argv, or trigger an error + * if it fails to get them. + * + * @return array The argc/argv array + * @throws PEAR2\Console\CommandLine\Exception + */ + protected function getArgcArgv() + { + if (php_sapi_name() != 'cli') { + // we have a web request + $argv = array($this->name); + if (isset($_REQUEST)) { + foreach ($_REQUEST as $key => $value) { + if (!is_array($value)) { + $value = array($value); + } + $opt = $this->findOption($key); + if ($opt instanceof CommandLine\Option) { + // match a configured option + $argv[] = $opt->short_name ? + $opt->short_name : $opt->long_name; + foreach ($value as $v) { + if ($opt->expectsArgument()) { + $argv[] = isset($_REQUEST[$key]) + ? urldecode($v) + : $v; + } else if ($v == '0' || $v == 'false') { + array_pop($argv); + } + } + } else if (isset($this->args[$key])) { + // match a configured argument + foreach ($value as $v) { + $argv[] = isset($_REQUEST[$key]) ? urldecode($v) : $v; + } + } + } + } + return array(count($argv), $argv); + } + if (isset($argc) && isset($argv)) { + // case of register_argv_argc = 1 + return array($argc, $argv); + } + if (isset($_SERVER['argc']) && isset($_SERVER['argv'])) { + return array($_SERVER['argc'], $_SERVER['argv']); + } + return array(0, array()); + } + + // }}} + // _dispatchAction() {{{ + + /** + * Dispatches the given option or store the option to dispatch it later. + * + * @param PEAR2\Console\CommandLine\Option $option The option instance + * @param string $token Command line token to parse + * @param PEAR2\Console\CommandLine\Result $result The result instance + * + * @return void + */ + private function _dispatchAction($option, $token, $result) + { + if ($option->action == 'Password') { + $this->_dispatchLater[] = array($option, $token, $result); + } else { + $option->dispatchAction($token, $result, $this); + } + } + // }}} + // _getSubCommand() {{{ + + /** + * Tries to return the subcommand that matches the given token or returns + * false if no subcommand was found. + * + * @param string $token Current command line token + * + * @return mixed An instance of PEAR2\Console\CommandLine\Command or false + */ + private function _getSubCommand($token) + { + foreach ($this->commands as $cmd) { + if ($cmd->name == $token || in_array($token, $cmd->aliases)) { + return $cmd; + } + } + return false; + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action.php b/PEAR2/Console/CommandLine/Action.php new file mode 100644 index 0000000..2aca60a --- /dev/null +++ b/PEAR2/Console/CommandLine/Action.php @@ -0,0 +1,142 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ +namespace PEAR2\Console\CommandLine; + +/** + * Class that represent an option action. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +abstract class Action +{ + // Properties {{{ + + /** + * A reference to the result instance. + * + * @var PEAR2\Console\CommandLine_Result $result The result instance + */ + protected $result; + + /** + * A reference to the option instance. + * + * @var PEAR2\Console\CommandLine_Option $option The action option + */ + protected $option; + + /** + * A reference to the parser instance. + * + * @var PEAR2\Console\CommandLine $parser The parser + */ + protected $parser; + + // }}} + // __construct() {{{ + + /** + * Constructor + * + * @param PEAR2\Console\CommandLine_Result $result The result instance + * @param PEAR2\Console\CommandLine_Option $option The action option + * @param PEAR2\Console\CommandLine $parser The current parser + * + * @return void + */ + public function __construct($result, $option, $parser) + { + $this->result = $result; + $this->option = $option; + $this->parser = $parser; + } + + // }}} + // getResult() {{{ + + /** + * Convenience method to retrieve the value of result->options[name]. + * + * @return mixed The result value or null + */ + public function getResult() + { + if (isset($this->result->options[$this->option->name])) { + return $this->result->options[$this->option->name]; + } + return null; + } + + // }}} + // format() {{{ + + /** + * Allow a value to be pre-formatted prior to being used in a choices test. + * Setting $value to the new format will keep the formatting. + * + * @param mixed &$value The value to format + * + * @return mixed The formatted value + */ + public function format(&$value) + { + return $value; + } + + // }}} + // setResult() {{{ + + /** + * Convenience method to assign the result->options[name] value. + * + * @param mixed $result The result value + * + * @return void + */ + public function setResult($result) + { + $this->result->options[$this->option->name] = $result; + } + + // }}} + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * All children actions must implement this method. + * + * @param mixed $value The option value + * @param array $params An optional array of parameters + * + * @return string + */ + abstract public function execute($value = false, $params = array()); + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/Callback.php b/PEAR2/Console/CommandLine/Action/Callback.php new file mode 100644 index 0000000..a5edd7a --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/Callback.php @@ -0,0 +1,86 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + + +/** + * Class that represent the Callback action. + * + * The result option array entry value is set to the return value of the + * callback defined in the option. + * + * There are two steps to defining a callback option: + * - define the option itself using the callback action + * - write the callback; this is a function (or method) that takes five + * arguments, as described below. + * + * All callbacks are called as follows: + * + * callable_func( + * $value, // the value of the option + * $option_instance, // the option instance + * $result_instance, // the result instance + * $parser_instance, // the parser instance + * $params // an array of params as specified in the option + * ); + * + * and *must* return the option value. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Callback extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The value of the option + * @param array $params An optional array of parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $this->setResult( + call_user_func( + $this->option->callback, + $value, + $this->option, + $this->result, + $this->parser, + $params + ) + ); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/Counter.php b/PEAR2/Console/CommandLine/Action/Counter.php new file mode 100644 index 0000000..fd2adb9 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/Counter.php @@ -0,0 +1,84 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the Version action. + * + * The execute methode add 1 to the value of the result option array entry. + * The value is incremented each time the option is found, for example + * with an option defined like that: + * + * + * $parser->addOption( + * 'verbose', + * array( + * 'short_name' => '-v', + * 'action' => 'Counter' + * ) + * ); + * + * If the user type: + * + * $ script.php -v -v -v + * + * or: + * + * $ script.php -vvv + * + * the verbose variable will be set to to 3. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Counter extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An optional array of parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $result = $this->getResult(); + if ($result === null) { + $result = 0; + } + $this->setResult(++$result); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/Help.php b/PEAR2/Console/CommandLine/Action/Help.php new file mode 100644 index 0000000..b4a733a --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/Help.php @@ -0,0 +1,58 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the Help action, a special action that displays the + * help message, telling the user how to use the program. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Help extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An optional array of parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + return $this->parser->displayUsage(); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/List.php b/PEAR2/Console/CommandLine/Action/List.php new file mode 100644 index 0000000..3419f29 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/List.php @@ -0,0 +1,69 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version CVS: $Id: List.php,v 1.2 2009/02/27 08:03:17 izi Exp $ + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Class that represent the List action, a special action that simply output an + * array as a list. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Action_List extends Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * Possible parameters are: + * - message: an alternative message to display instead of the default + * message, + * - delimiter: an alternative delimiter instead of the comma, + * - post: a string to append after the message (default is the new line + * char). + * + * @param mixed $value The option value + * @param array $params An optional array of parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $list = isset($params['list']) ? $params['list'] : array(); + $msg = isset($params['message']) + ? $params['message'] + : $this->parser->message_provider->get('LIST_DISPLAYED_MESSAGE'); + $del = isset($params['delimiter']) ? $params['delimiter'] : ', '; + $post = isset($params['post']) ? $params['post'] : "\n"; + $this->parser->outputter->stdout($msg . implode($del, $list) . $post); + exit(0); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/Password.php b/PEAR2/Console/CommandLine/Action/Password.php new file mode 100644 index 0000000..ad82539 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/Password.php @@ -0,0 +1,90 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the Password action, a special action that allow the + * user to specify the password on the commandline or to be prompted for + * entering it. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Password extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $this->setResult(empty($value) ? $this->_promptPassword() : $value); + } + // }}} + // _promptPassword() {{{ + + /** + * Prompts the password to the user without echoing it. + * + * @return string + * @todo not echo-ing the password does not work on windows is there a way + * to make this work ? + */ + private function _promptPassword() + { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + fwrite( + STDOUT, + $this->parser->message_provider->get('PASSWORD_PROMPT_ECHO') + ); + @flock(STDIN, LOCK_EX); + $passwd = fgets(STDIN); + @flock(STDIN, LOCK_UN); + } else { + fwrite(STDOUT, $this->parser->message_provider->get('PASSWORD_PROMPT')); + // disable echoing + system('stty -echo'); + @flock(STDIN, LOCK_EX); + $passwd = fgets(STDIN); + @flock(STDIN, LOCK_UN); + system('stty echo'); + } + return trim($passwd); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreArray.php b/PEAR2/Console/CommandLine/Action/StoreArray.php new file mode 100644 index 0000000..af9c8d4 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreArray.php @@ -0,0 +1,76 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreArray action. + * + * The execute method appends the value of the option entered by the user to + * the result option array entry. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreArray extends CommandLine\Action +{ + // Protected properties {{{ + + /** + * Force a clean result when first called, overriding any defaults assigned. + * + * @var object $firstPass First time this action has been called. + */ + protected $firstPass = true; + + // }}} + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An optional array of parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $result = $this->getResult(); + if (null === $result || $this->firstPass) { + $result = array(); + $this->firstPass = false; + } + $result[] = $value; + $this->setResult($result); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreFalse.php b/PEAR2/Console/CommandLine/Action/StoreFalse.php new file mode 100644 index 0000000..20e8cbd --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreFalse.php @@ -0,0 +1,62 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreFalse action. + * + * The execute method store the boolean 'false' in the corrsponding result + * option array entry (the value is true if the option is not present in the + * command line entered by the user). + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreFalse extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $this->setResult(false); + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreFloat.php b/PEAR2/Console/CommandLine/Action/StoreFloat.php new file mode 100644 index 0000000..4242f9b --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreFloat.php @@ -0,0 +1,73 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreFloat action. + * + * The execute method store the value of the option entered by the user as a + * float in the result option array entry, if the value passed is not a float + * an Exception is raised. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreFloat extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + * @throws PEAR2\Console\CommandLine\Exception + */ + public function execute($value = false, $params = array()) + { + if (!is_numeric($value)) { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_TYPE_ERROR', + array( + 'name' => $this->option->name, + 'type' => 'float', + 'value' => $value + ), + $this->parser + ); + } + $this->setResult((float)$value); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreInt.php b/PEAR2/Console/CommandLine/Action/StoreInt.php new file mode 100644 index 0000000..af92024 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreInt.php @@ -0,0 +1,73 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreInt action. + * + * The execute method store the value of the option entered by the user as an + * integer in the result option array entry, if the value passed is not an + * integer an Exception is raised. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreInt extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + * @throws PEAR2\Console\CommandLine\Exception + */ + public function execute($value = false, $params = array()) + { + if (!is_numeric($value)) { + throw CommandLine\Exception::factory( + 'OPTION_VALUE_TYPE_ERROR', + array( + 'name' => $this->option->name, + 'type' => 'int', + 'value' => $value + ), + $this->parser + ); + } + $this->setResult((int)$value); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreString.php b/PEAR2/Console/CommandLine/Action/StoreString.php new file mode 100644 index 0000000..8e77e8a --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreString.php @@ -0,0 +1,60 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreString action. + * + * The execute method store the value of the option entered by the user as a + * string in the result option array entry. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreString extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $this->setResult((string)$value); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/StoreTrue.php b/PEAR2/Console/CommandLine/Action/StoreTrue.php new file mode 100644 index 0000000..419bc61 --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/StoreTrue.php @@ -0,0 +1,61 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the StoreTrue action. + * + * The execute method store the boolean 'true' in the corrsponding result + * option array entry (the value is false if the option is not present in the + * command line entered by the user). + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class StoreTrue extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + $this->setResult(true); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Action/Version.php b/PEAR2/Console/CommandLine/Action/Version.php new file mode 100644 index 0000000..b31600d --- /dev/null +++ b/PEAR2/Console/CommandLine/Action/Version.php @@ -0,0 +1,58 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine\Action; + +use PEAR2\Console\CommandLine; + +/** + * Class that represent the Version action, a special action that displays the + * version string of the program. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Version extends CommandLine\Action +{ + // execute() {{{ + + /** + * Executes the action with the value entered by the user. + * + * @param mixed $value The option value + * @param array $params An array of optional parameters + * + * @return string + */ + public function execute($value = false, $params = array()) + { + return $this->parser->displayVersion(); + } + // }}} +} diff --git a/PEAR2/Console/CommandLine/Argument.php b/PEAR2/Console/CommandLine/Argument.php new file mode 100644 index 0000000..1e02302 --- /dev/null +++ b/PEAR2/Console/CommandLine/Argument.php @@ -0,0 +1,94 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Class that represent a command line argument. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Argument extends Element +{ + // Public properties {{{ + + /** + * Setting this to true will tell the parser that the argument expects more + * than one argument and that argument values should be stored in an array. + * + * @var boolean $multiple Whether the argument expects multiple values + */ + public $multiple = false; + + /** + * Setting this to true will tell the parser that the argument is optional + * and can be ommited. + * Note that it is not a good practice to make arguments optional, it is + * the role of the options to be optional, by essence. + * + * @var boolean $optional Whether the argument is optional or not. + */ + public $optional = false; + + // }}} + // validate() {{{ + + /** + * Validates the argument instance. + * + * @return void + * @throws PEAR2\Console\CommandLine\Exception + * @todo use exceptions + */ + public function validate() + { + // check if the argument name is valid + if (!preg_match( + '/^[a-zA-Z_\x7f-\xff]+[a-zA-Z0-9_\x7f-\xff]*$/', + $this->name + ) + ) { + \PEAR2\Console\CommandLine::triggerError( + 'argument_bad_name', + E_USER_ERROR, + array('{$name}' => $this->name) + ); + } + if (!$this->optional && $this->default !== null) { + \PEAR2\Console\CommandLine::triggerError( + 'argument_no_default', + E_USER_ERROR + ); + } + parent::validate(); + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Command.php b/PEAR2/Console/CommandLine/Command.php new file mode 100644 index 0000000..2d00a47 --- /dev/null +++ b/PEAR2/Console/CommandLine/Command.php @@ -0,0 +1,72 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Class that represent a command with option and arguments. + * + * This class exist just to clarify the interface but at the moment it is + * strictly identical to PEAR2\Console\CommandLine class, it could change in the + * future though. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Command extends \PEAR2\Console\CommandLine +{ + // Public properties {{{ + + /** + * An array of aliases for the subcommand. + * + * @var array $aliases Aliases for the subcommand. + */ + public $aliases = array(); + + // }}} + // __construct() {{{ + + /** + * Constructor. + * + * @param array $params An optional array of parameters + * + * @return void + */ + public function __construct($params = array()) + { + if (isset($params['aliases'])) { + $this->aliases = $params['aliases']; + } + parent::__construct($params); + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/CustomMessageProvider.php b/PEAR2/Console/CommandLine/CustomMessageProvider.php new file mode 100644 index 0000000..c822faa --- /dev/null +++ b/PEAR2/Console/CommandLine/CustomMessageProvider.php @@ -0,0 +1,67 @@ + + * @author Michael Gauthier + * @copyright 2007 David JEAN LOUIS, 2009 silverorange + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version CVS: $Id: CustomMessageProvider.php 282427 2009-06-19 10:22:48Z izi $ + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 1.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Common interfacefor message providers that allow overriding with custom + * messages + * + * Message providers may optionally implement this interface. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @author Michael Gauthier + * @copyright 2007 David JEAN LOUIS, 2009 silverorange + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Interface available since release 1.1.0 + */ +interface CustomMessageProvider +{ + // getWithCustomMesssages() {{{ + + /** + * Retrieves the given string identifier corresponding message. + * + * For a list of identifiers please see the provided default message + * provider. + * + * @param string $code The string identifier of the message + * @param array $vars An array of template variables + * @param array $messages An optional array of messages to use. Array + * indexes are message codes. + * + * @return string + * @see PEAR2\Console\CommandLine_MessageProvider + * @see PEAR2\Console\CommandLine_MessageProvider_Default + */ + public function getWithCustomMessages( + $code, $vars = array(), $messages = array() + ); + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Element.php b/PEAR2/Console/CommandLine/Element.php new file mode 100644 index 0000000..825606a --- /dev/null +++ b/PEAR2/Console/CommandLine/Element.php @@ -0,0 +1,151 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Class that represent a command line element (an option, or an argument). + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +abstract class Element +{ + // Public properties {{{ + + /** + * The element name. + * + * @var string $name Element name + */ + public $name; + + /** + * The name of variable displayed in the usage message, if no set it + * defaults to the "name" property. + * + * @var string $help_name Element "help" variable name + */ + public $help_name; + + /** + * The element description. + * + * @var string $description Element description + */ + public $description; + /** + * The default value of the element if not provided on the command line. + * + * @var mixed $default Default value of the option. + */ + public $default; + + /** + * Custom errors messages for this element + * + * This array is of the form: + * + * $messageText, + * $messageName => $messageText, + * ... + * ); + * ?> + * + * + * If specified, these messages override the messages provided by the + * default message provider. For example: + * + * 'The argument foo is required.', + * ); + * ?> + * + * + * @var array + * @see PEAR2\Console\CommandLine_MessageProvider_Default + */ + public $messages = array(); + + // }}} + // __construct() {{{ + + /** + * Constructor. + * + * @param string $name The name of the element + * @param array $params An optional array of parameters + * + * @return void + */ + public function __construct($name = null, $params = array()) + { + $this->name = $name; + foreach ($params as $attr => $value) { + if (property_exists($this, $attr)) { + $this->$attr = $value; + } + } + } + + // }}} + // toString() {{{ + + /** + * Returns the string representation of the element. + * + * @return string The string representation of the element + * @todo use __toString() instead + */ + public function toString() + { + return $this->help_name; + } + // }}} + // validate() {{{ + + /** + * Validates the element instance and set it's default values. + * + * @return void + * @throws PEAR2\Console\CommandLine\Exception + */ + public function validate() + { + // if no help_name passed, default to name + if ($this->help_name == null) { + $this->help_name = $this->name; + } + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Exception.php b/PEAR2/Console/CommandLine/Exception.php new file mode 100644 index 0000000..6528f5d --- /dev/null +++ b/PEAR2/Console/CommandLine/Exception.php @@ -0,0 +1,90 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +use Exception as E; + +/** + * Class for exceptions raised by the PEAR2\Console\CommandLine package. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Exception extends E +{ + // Codes constants {{{ + + /**#@+ + * Exception code constants. + */ + const OPTION_VALUE_REQUIRED = 1; + const OPTION_VALUE_UNEXPECTED = 2; + const OPTION_VALUE_TYPE_ERROR = 3; + const OPTION_UNKNOWN = 4; + const ARGUMENT_REQUIRED = 5; + const INVALID_SUBCOMMAND = 6; + /**#@-*/ + + // }}} + // factory() {{{ + + /** + * Convenience method that builds the exception with the array of params by + * calling the message provider class. + * + * @param string $code The string identifier of the + * exception. + * @param array $params Array of template vars/values + * @param PEAR2\Console\CommandLine $parser An instance of the parser + * @param array $messages An optional array of messages + * passed to the message provider. + * + * @return PEAR2\Console\CommandLine\Exception The exception instance + */ + public static function factory( + $code, $params, $parser, array $messages = array() + ) { + $provider = $parser->message_provider; + if ($provider instanceof CommandLine\CustomMessageProvider) { + $msg = $provider->getWithCustomMessages( + $code, + $params, + $messages + ); + } else { + $msg = $provider->get($code, $params); + } + $const = '\PEAR2\Console\CommandLine\Exception::' . $code; + $code = defined($const) ? constant($const) : 0; + return new static($msg, $code); + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/MessageProvider.php b/PEAR2/Console/CommandLine/MessageProvider.php new file mode 100644 index 0000000..9181326 --- /dev/null +++ b/PEAR2/Console/CommandLine/MessageProvider.php @@ -0,0 +1,57 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Message providers common interface, all message providers must implement + * this interface. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +interface MessageProvider +{ + // get() {{{ + + /** + * Retrieves the given string identifier corresponding message. + * For a list of identifiers please see the provided default message + * provider. + * + * @param string $code The string identifier of the message + * @param array $vars An array of template variables + * + * @return string + * @see PEAR2\Console\CommandLine_MessageProvider_Default + */ + public function get($code, $vars=array()); + + // }}} +} diff --git a/PEAR2/Console/CommandLine/MessageProvider/Default.php b/PEAR2/Console/CommandLine/MessageProvider/Default.php new file mode 100644 index 0000000..c3781f7 --- /dev/null +++ b/PEAR2/Console/CommandLine/MessageProvider/Default.php @@ -0,0 +1,143 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Lightweight class that manages messages used by PEAR2\Console\CommandLine package, + * allowing the developper to customize these messages, for example to + * internationalize a command line frontend. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class MessageProvider_Default + implements MessageProvider, + CustomMessageProvider +{ + // Properties {{{ + + /** + * Associative array of messages + * + * @var array $messages + */ + protected $messages = array( + 'OPTION_VALUE_REQUIRED' => 'Option "{$name}" requires a value.', + 'OPTION_VALUE_UNEXPECTED' => 'Option "{$name}" does not expect a value (got "{$value}").', + 'OPTION_VALUE_NOT_VALID' => 'Option "{$name}" must be one of the following: "{$choices}" (got "{$value}").', + 'OPTION_VALUE_TYPE_ERROR' => 'Option "{$name}" requires a value of type {$type} (got "{$value}").', + 'OPTION_AMBIGUOUS' => 'Ambiguous option "{$name}", can be one of the following: {$matches}.', + 'OPTION_UNKNOWN' => 'Unknown option "{$name}".', + 'ARGUMENT_REQUIRED' => 'You must provide at least {$argnum} argument{$plural}.', + 'PROG_HELP_LINE' => 'Type "{$progname} --help" to get help.', + 'PROG_VERSION_LINE' => '{$progname} version {$version}.', + 'COMMAND_HELP_LINE' => 'Type "{$progname} --help" to get help on specific command.', + 'USAGE_WORD' => 'Usage', + 'OPTION_WORD' => 'Options', + 'ARGUMENT_WORD' => 'Arguments', + 'COMMAND_WORD' => 'Commands', + 'PASSWORD_PROMPT' => 'Password: ', + 'PASSWORD_PROMPT_ECHO' => 'Password (warning: will echo): ', + 'INVALID_CUSTOM_INSTANCE' => 'Instance does not implement the required interface', + 'LIST_OPTION_MESSAGE' => 'lists valid choices for option {$name}', + 'LIST_DISPLAYED_MESSAGE' => 'Valid choices are: ', + 'INVALID_SUBCOMMAND' => 'Command "{$command}" is not valid.', + 'SUBCOMMAND_REQUIRED' => 'Please enter one of the following command: {$commands}.', + ); + + // }}} + // get() {{{ + + /** + * Retrieve the given string identifier corresponding message. + * + * @param string $code The string identifier of the message + * @param array $vars An array of template variables + * + * @return string + */ + public function get($code, $vars = array()) + { + if (!isset($this->messages[$code])) { + return 'UNKNOWN'; + } + return $this->replaceTemplateVars($this->messages[$code], $vars); + } + + // }}} + // getWithCustomMessages() {{{ + + /** + * Retrieve the given string identifier corresponding message. + * + * @param string $code The string identifier of the message + * @param array $vars An array of template variables + * @param array $messages An optional array of messages to use. Array + * indexes are message codes. + * + * @return string + */ + public function getWithCustomMessages( + $code, $vars = array(), $messages = array() + ) { + // get message + if (isset($messages[$code])) { + $message = $messages[$code]; + } elseif (isset($this->messages[$code])) { + $message = $this->messages[$code]; + } else { + $message = 'UNKNOWN'; + } + return $this->replaceTemplateVars($message, $vars); + } + + // }}} + // replaceTemplateVars() {{{ + + /** + * Replaces template vars in a message + * + * @param string $message The message + * @param array $vars An array of template variables + * + * @return string + */ + protected function replaceTemplateVars($message, $vars = array()) + { + $tmpkeys = array_keys($vars); + $keys = array(); + foreach ($tmpkeys as $key) { + $keys[] = '{$' . $key . '}'; + } + return str_replace($keys, array_values($vars), $message); + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Option.php b/PEAR2/Console/CommandLine/Option.php new file mode 100644 index 0000000..912e8aa --- /dev/null +++ b/PEAR2/Console/CommandLine/Option.php @@ -0,0 +1,393 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +use PEAR2\Console; + +/** + * Class that represent a commandline option. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Option extends Element +{ + // Public properties {{{ + + /** + * The option short name (ex: -v). + * + * @var string $short_name Short name of the option + */ + public $short_name; + + /** + * The option long name (ex: --verbose). + * + * @var string $long_name Long name of the option + */ + public $long_name; + + /** + * The option action, defaults to "StoreString". + * + * @var string $action Option action + */ + public $action = 'StoreString'; + + /** + * An array of possible values for the option. If this array is not empty + * and the value passed is not in the array an exception is raised. + * This only make sense for actions that accept values of course. + * + * @var array $choices Valid choices for the option + */ + public $choices = array(); + + /** + * The callback function (or method) to call for an action of type + * Callback, this can be any callable supported by the php function + * call_user_func. + * + * Example: + * + * + * $parser->addOption('myoption', array( + * 'short_name' => '-m', + * 'long_name' => '--myoption', + * 'action' => 'Callback', + * 'callback' => 'myCallbackFunction' + * )); + * + * + * @var callable $callback The option callback + */ + public $callback; + + /** + * An associative array of additional params to pass to the class + * corresponding to the action, this array will also be passed to the + * callback defined for an action of type Callback, Example: + * + * + * // for a custom action + * $parser->addOption('myoption', array( + * 'short_name' => '-m', + * 'long_name' => '--myoption', + * 'action' => 'MyCustomAction', + * 'action_params' => array('foo'=>true, 'bar'=>false) + * )); + * + * // if the user type: + * // $ -m spam + * // in your MyCustomAction class the execute() method will be called + * // with the value 'spam' as first parameter and + * // array('foo'=>true, 'bar'=>false) as second parameter + * + * + * @var array $action_params Additional parameters to pass to the action + */ + public $action_params = array(); + + /** + * For options that expect an argument, this property tells the parser if + * the option argument is optional and can be ommited. + * + * @var bool $argumentOptional Whether the option arg is optional or not + */ + public $argument_optional = false; + + /** + * For options that uses the "choice" property only. + * Adds a --list- option to the parser that displays the list of + * choices for the option. + * + * @var bool $add_list_option Whether to add a list option or not + */ + public $add_list_option = false; + + // }}} + // Private properties {{{ + + /** + * When an action is called remember it to allow for multiple calls. + * + * @var object $action_instance Placeholder for action + */ + private $_action_instance = null; + + // }}} + // __construct() {{{ + + /** + * Constructor. + * + * @param string $name The name of the option + * @param array $params An optional array of parameters + * + * @return void + */ + public function __construct($name = null, $params = array()) + { + parent::__construct($name, $params); + if ($this->action == 'Password') { + // special case for Password action, password can be passed to the + // commandline or prompted by the parser + $this->argument_optional = true; + } + } + + // }}} + // toString() {{{ + + /** + * Returns the string representation of the option. + * + * @param string $delim Delimiter to use between short and long option + * + * @return string The string representation of the option + * @todo use __toString() instead + */ + public function toString($delim = ", ") + { + $ret = ''; + $padding = ''; + if ($this->short_name != null) { + $ret .= $this->short_name; + if ($this->expectsArgument()) { + $ret .= ' ' . $this->help_name; + } + $padding = $delim; + } + if ($this->long_name != null) { + $ret .= $padding . $this->long_name; + if ($this->expectsArgument()) { + $ret .= '=' . $this->help_name; + } + } + return $ret; + } + + // }}} + // expectsArgument() {{{ + + /** + * Returns true if the option requires one or more argument and false + * otherwise. + * + * @return bool Whether the option expects an argument or not + */ + public function expectsArgument() + { + if ($this->action == 'StoreTrue' + || $this->action == 'StoreFalse' + || $this->action == 'Help' + || $this->action == 'Version' + || $this->action == 'Counter' + || $this->action == 'List' + ) { + return false; + } + return true; + } + + // }}} + // dispatchAction() {{{ + + /** + * Formats the value $value according to the action of the option and + * updates the passed PEAR2\Console\CommandLine_Result object. + * + * @param mixed $value The value to format + * @param PEAR2\Console\CommandLine_Result $result The result instance + * @param PEAR2\Console\CommandLine $parser The parser instance + * + * @return void + * @throws PEAR2\Console\CommandLine\Exception + */ + public function dispatchAction($value, $result, $parser) + { + $actionInfo = Console\CommandLine::$actions[$this->action]; + $clsname = $actionInfo[0]; + if ($this->_action_instance === null) { + $this->_action_instance = new $clsname($result, $this, $parser); + } + + // check value is in option choices + if (!empty($this->choices) + && !in_array( + $this->_action_instance->format($value), + $this->choices + ) + ) { + throw Console\CommandLine\Exception::factory( + 'OPTION_VALUE_NOT_VALID', + array( + 'name' => $this->name, + 'choices' => implode('", "', $this->choices), + 'value' => $value, + ), + $parser, + $this->messages + ); + } + $this->_action_instance->execute($value, $this->action_params); + } + + // }}} + // validate() {{{ + + /** + * Validates the option instance. + * + * @return void + * @throws PEAR2\Console\CommandLine\Exception + * @todo use exceptions instead + */ + public function validate() + { + // check if the option name is valid + if (!preg_match( + '/^[a-zA-Z_\x7f-\xff]+[a-zA-Z0-9_\x7f-\xff]*$/', + $this->name + ) + ) { + Console\CommandLine::triggerError( + 'option_bad_name', + E_USER_ERROR, + array('{$name}' => $this->name) + ); + } + // call the parent validate method + parent::validate(); + // a short_name or a long_name must be provided + if ($this->short_name == null && $this->long_name == null) { + Console\CommandLine::triggerError( + 'option_long_and_short_name_missing', + E_USER_ERROR, + array('{$name}' => $this->name) + ); + } + // check if the option short_name is valid + if ($this->short_name != null + && !(preg_match('/^\-[a-zA-Z]{1}$/', $this->short_name)) + ) { + Console\CommandLine::triggerError( + 'option_bad_short_name', + E_USER_ERROR, + array( + '{$name}' => $this->name, + '{$short_name}' => $this->short_name + ) + ); + } + // check if the option long_name is valid + if ($this->long_name != null + && !preg_match('/^\-\-[a-zA-Z]+[a-zA-Z0-9_\-]*$/', $this->long_name) + ) { + Console\CommandLine::triggerError( + 'option_bad_long_name', + E_USER_ERROR, + array( + '{$name}' => $this->name, + '{$long_name}' => $this->long_name + ) + ); + } + // check if we have a valid action + if (!is_string($this->action)) { + Console\CommandLine::triggerError( + 'option_bad_action', + E_USER_ERROR, + array('{$name}' => $this->name) + ); + } + if (!isset(Console\CommandLine::$actions[$this->action])) { + Console\CommandLine::triggerError( + 'option_unregistered_action', + E_USER_ERROR, + array( + '{$action}' => $this->action, + '{$name}' => $this->name + ) + ); + } + // if the action is a callback, check that we have a valid callback + if ($this->action == 'Callback' && !is_callable($this->callback)) { + Console\CommandLine::triggerError( + 'option_invalid_callback', + E_USER_ERROR, + array('{$name}' => $this->name) + ); + } + } + + // }}} + // setDefaults() {{{ + + /** + * Set the default value according to the configured action. + * + * Note that for backward compatibility issues this method is only called + * when the 'force_options_defaults' is set to true, it will become the + * default behaviour in the next major release of PEAR2\Console\CommandLine. + * + * @return void + */ + public function setDefaults() + { + if ($this->default !== null) { + // already set + return; + } + switch ($this->action) { + case 'Counter': + case 'StoreInt': + $this->default = 0; + break; + case 'StoreFloat': + $this->default = 0.0; + break; + case 'StoreArray': + $this->default = array(); + break; + case 'StoreTrue': + $this->default = false; + break; + case 'StoreFalse': + $this->default = true; + break; + default: + return; + } + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Outputter.php b/PEAR2/Console/CommandLine/Outputter.php new file mode 100644 index 0000000..ecb0526 --- /dev/null +++ b/PEAR2/Console/CommandLine/Outputter.php @@ -0,0 +1,64 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Outputters common interface, all outputters must implement this interface. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +interface Outputter +{ + // stdout() {{{ + + /** + * Processes the output for a message that should be displayed on STDOUT. + * + * @param string $msg The message to output + * + * @return void + */ + public function stdout($msg); + + // }}} + // stderr() {{{ + + /** + * Processes the output for a message that should be displayed on STDERR. + * + * @param string $msg The message to output + * + * @return void + */ + public function stderr($msg); + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Outputter/Default.php b/PEAR2/Console/CommandLine/Outputter/Default.php new file mode 100644 index 0000000..9b4d0c3 --- /dev/null +++ b/PEAR2/Console/CommandLine/Outputter/Default.php @@ -0,0 +1,78 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * PEAR2\Console\CommandLine default Outputter. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Outputter_Default implements Outputter +{ + // stdout() {{{ + + /** + * Writes the message $msg to STDOUT. + * + * @param string $msg The message to output + * + * @return void + */ + public function stdout($msg) + { + if (defined('STDOUT')) { + fwrite(STDOUT, $msg); + } else { + echo $msg; + } + } + + // }}} + // stderr() {{{ + + /** + * Writes the message $msg to STDERR. + * + * @param string $msg The message to output + * + * @return void + */ + public function stderr($msg) + { + if (defined('STDERR')) { + fwrite(STDERR, $msg); + } else { + echo $msg; + } + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Renderer.php b/PEAR2/Console/CommandLine/Renderer.php new file mode 100644 index 0000000..35d175a --- /dev/null +++ b/PEAR2/Console/CommandLine/Renderer.php @@ -0,0 +1,72 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * Renderers common interface, all renderers must implement this interface. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +interface Renderer +{ + // usage() {{{ + + /** + * Returns the full usage message. + * + * @return string The usage message + */ + public function usage(); + + // }}} + // error() {{{ + + /** + * Returns a formatted error message. + * + * @param string $error The error message to format + * + * @return string The error string + */ + public function error($error); + + // }}} + // version() {{{ + + /** + * Returns the program version string. + * + * @return string The version string + */ + public function version(); + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Renderer/Default.php b/PEAR2/Console/CommandLine/Renderer/Default.php new file mode 100644 index 0000000..ff410a3 --- /dev/null +++ b/PEAR2/Console/CommandLine/Renderer/Default.php @@ -0,0 +1,441 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + */ + +namespace PEAR2\Console\CommandLine; + +/** + * PEAR2\Console\CommandLine default renderer. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Renderer_Default implements Renderer +{ + // Properties {{{ + + /** + * Integer that define the max width of the help text. + * + * @var integer $line_width Line width + */ + public $line_width = 75; + + /** + * Integer that define the max width of the help text. + * + * @var integer $line_width Line width + */ + public $options_on_different_lines = false; + + /** + * An instance of PEAR2\Console\CommandLine. + * + * @var PEAR2\Console\CommandLine $parser The parser + */ + public $parser = false; + + // }}} + // __construct() {{{ + + /** + * Constructor. + * + * @param object $parser A PEAR2\Console\CommandLine instance + * + * @return void + */ + public function __construct($parser = false) + { + $this->parser = $parser; + } + + // }}} + // usage() {{{ + + /** + * Returns the full usage message. + * + * @return string The usage message + */ + public function usage() + { + $ret = ''; + if (!empty($this->parser->description)) { + $ret .= $this->description() . "\n\n"; + } + $ret .= $this->usageLine() . "\n"; + if (count($this->parser->commands) > 0) { + $ret .= $this->commandUsageLine() . "\n"; + } + if (count($this->parser->options) > 0) { + $ret .= "\n" . $this->optionList() . "\n"; + } + if (count($this->parser->args) > 0) { + $ret .= "\n" . $this->argumentList() . "\n"; + } + if (count($this->parser->commands) > 0) { + $ret .= "\n" . $this->commandList() . "\n"; + } + $ret .= "\n"; + return $ret; + } + // }}} + // error() {{{ + + /** + * Returns a formatted error message. + * + * @param string $error The error message to format + * + * @return string The error string + */ + public function error($error) + { + $ret = 'Error: ' . $error . "\n"; + if ($this->parser->add_help_option) { + $name = $this->name(); + $ret .= $this->wrap( + $this->parser->message_provider->get( + 'PROG_HELP_LINE', + array('progname' => $name) + ) + ) . "\n"; + if (count($this->parser->commands) > 0) { + $ret .= $this->wrap( + $this->parser->message_provider->get( + 'COMMAND_HELP_LINE', + array('progname' => $name) + ) + ) . "\n"; + } + } + return $ret; + } + + // }}} + // version() {{{ + + /** + * Returns the program version string. + * + * @return string The version string + */ + public function version() + { + return $this->parser->message_provider->get( + 'PROG_VERSION_LINE', + array( + 'progname' => $this->name(), + 'version' => $this->parser->version + ) + ) . "\n"; + } + + // }}} + // name() {{{ + + /** + * Returns the full name of the program or the sub command + * + * @return string The name of the program + */ + protected function name() + { + $name = $this->parser->name; + $parent = $this->parser->parent; + while ($parent) { + if (count($parent->options) > 0) { + $name = '[' + . strtolower( + $this->parser->message_provider->get( + 'OPTION_WORD', + array('plural' => 's') + ) + ) . '] ' . $name; + } + $name = $parent->name . ' ' . $name; + $parent = $parent->parent; + } + return $this->wrap($name); + } + + // }}} + // description() {{{ + + /** + * Returns the command line description message. + * + * @return string The description message + */ + protected function description() + { + return $this->wrap($this->parser->description); + } + + // }}} + // usageLine() {{{ + + /** + * Returns the command line usage message + * + * @return string the usage message + */ + protected function usageLine() + { + $usage = $this->parser->message_provider->get('USAGE_WORD') . ":\n"; + $ret = $usage . ' ' . $this->name(); + if (count($this->parser->options) > 0) { + $ret .= ' [' + . strtolower($this->parser->message_provider->get('OPTION_WORD')) + . ']'; + } + if (count($this->parser->args) > 0) { + foreach ($this->parser->args as $name=>$arg) { + $arg_str = $arg->help_name; + if ($arg->multiple) { + $arg_str .= '1 ' . $arg->help_name . '2 ...'; + } + if ($arg->optional) { + $arg_str = '[' . $arg_str . ']'; + } + $ret .= ' ' . $arg_str; + } + } + return $this->columnWrap($ret, 2); + } + + // }}} + // commandUsageLine() {{{ + + /** + * Returns the command line usage message for subcommands. + * + * @return string The usage line + */ + protected function commandUsageLine() + { + if (count($this->parser->commands) == 0) { + return ''; + } + $ret = ' ' . $this->name(); + if (count($this->parser->options) > 0) { + $ret .= ' [' + . strtolower($this->parser->message_provider->get('OPTION_WORD')) + . ']'; + } + $ret .= " "; + $hasArgs = false; + $hasOptions = false; + foreach ($this->parser->commands as $command) { + if (!$hasArgs && count($command->args) > 0) { + $hasArgs = true; + } + if (!$hasOptions && ($command->add_help_option + || $command->add_version_option + || count($command->options) > 0) + ) { + $hasOptions = true; + } + } + if ($hasOptions) { + $ret .= ' [options]'; + } + if ($hasArgs) { + $ret .= ' [args]'; + } + return $this->columnWrap($ret, 2); + } + + // }}} + // argumentList() {{{ + + /** + * Render the arguments list that will be displayed to the user, you can + * override this method if you want to change the look of the list. + * + * @return string The formatted argument list + */ + protected function argumentList() + { + $col = 0; + $args = array(); + foreach ($this->parser->args as $arg) { + $argstr = ' ' . $arg->toString(); + $args[] = array($argstr, $arg->description); + $ln = strlen($argstr); + if ($col < $ln) { + $col = $ln; + } + } + $ret = $this->parser->message_provider->get('ARGUMENT_WORD') . ":"; + foreach ($args as $arg) { + $text = str_pad($arg[0], $col) . ' ' . $arg[1]; + $ret .= "\n" . $this->columnWrap($text, $col+2); + } + return $ret; + } + + // }}} + // optionList() {{{ + + /** + * Render the options list that will be displayed to the user, you can + * override this method if you want to change the look of the list. + * + * @return string The formatted option list + */ + protected function optionList() + { + $col = 0; + $options = array(); + foreach ($this->parser->options as $option) { + $delim = $this->options_on_different_lines ? "\n" : ', '; + $optstr = $option->toString($delim); + $lines = explode("\n", $optstr); + $lines[0] = ' ' . $lines[0]; + if (count($lines) > 1) { + $lines[1] = ' ' . $lines[1]; + $ln = strlen($lines[1]); + } else { + $ln = strlen($lines[0]); + } + $options[] = array($lines, $option->description); + if ($col < $ln) { + $col = $ln; + } + } + $ret = $this->parser->message_provider->get('OPTION_WORD') . ":"; + foreach ($options as $option) { + if (count($option[0]) > 1) { + $text = str_pad($option[0][1], $col) . ' ' . $option[1]; + $pre = $option[0][0] . "\n"; + } else { + $text = str_pad($option[0][0], $col) . ' ' . $option[1]; + $pre = ''; + } + $ret .= "\n" . $pre . $this->columnWrap($text, $col+2); + } + return $ret; + } + + // }}} + // commandList() {{{ + + /** + * Render the command list that will be displayed to the user, you can + * override this method if you want to change the look of the list. + * + * @return string The formatted subcommand list + */ + protected function commandList() + { + + $commands = array(); + $col = 0; + foreach ($this->parser->commands as $cmdname=>$command) { + $cmdname = ' ' . $cmdname; + $commands[] = array($cmdname, $command->description, $command->aliases); + $ln = strlen($cmdname); + if ($col < $ln) { + $col = $ln; + } + } + $ret = $this->parser->message_provider->get('COMMAND_WORD') . ":"; + foreach ($commands as $command) { + $text = str_pad($command[0], $col) . ' ' . $command[1]; + if ($aliasesCount = count($command[2])) { + $pad = ''; + $text .= ' ('; + $text .= $aliasesCount > 1 ? 'aliases: ' : 'alias: '; + foreach ($command[2] as $alias) { + $text .= $pad . $alias; + $pad = ', '; + } + $text .= ')'; + } + $ret .= "\n" . $this->columnWrap($text, $col+2); + } + return $ret; + } + + // }}} + // wrap() {{{ + + /** + * Wraps the text passed to the method. + * + * @param string $text The text to wrap + * @param int $lw The column width (defaults to line_width property) + * + * @return string The wrapped text + */ + protected function wrap($text, $lw=null) + { + if ($this->line_width > 0) { + if ($lw === null) { + $lw = $this->line_width; + } + return wordwrap($text, $lw, "\n", false); + } + return $text; + } + + // }}} + // columnWrap() {{{ + + /** + * Wraps the text passed to the method at the specified width. + * + * @param string $text The text to wrap + * @param int $cw The wrap width + * + * @return string The wrapped text + */ + protected function columnWrap($text, $cw) + { + $tokens = explode("\n", $this->wrap($text)); + $ret = $tokens[0]; + $text = trim(substr($text, strlen($ret))); + if (empty($text)) { + return $ret; + } + + $chunks = $this->wrap($text, $this->line_width - $cw); + $tokens = explode("\n", $chunks); + foreach ($tokens as $token) { + if (!empty($token)) { + $ret .= "\n" . str_repeat(' ', $cw) . $token; + } else { + $ret .= "\n"; + } + } + return $ret; + } + + // }}} +} diff --git a/PEAR2/Console/CommandLine/Result.php b/PEAR2/Console/CommandLine/Result.php new file mode 100644 index 0000000..20e7e8c --- /dev/null +++ b/PEAR2/Console/CommandLine/Result.php @@ -0,0 +1,72 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +/** + * A lightweight class to store the result of the command line parsing. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class Result +{ + // Public properties {{{ + + /** + * The result options associative array. + * Key is the name of the option and value its value. + * + * @var array $options Result options array + */ + public $options = array(); + + /** + * The result arguments array. + * + * @var array $args Result arguments array + */ + public $args = array(); + + /** + * Name of the command invoked by the user, false if no command invoked. + * + * @var string $command_name Result command name + */ + public $command_name = false; + + /** + * A result instance for the subcommand. + * + * @var static $command Result instance for the subcommand + */ + public $command = false; + + // }}} +} diff --git a/PEAR2/Console/CommandLine/XmlParser.php b/PEAR2/Console/CommandLine/XmlParser.php new file mode 100644 index 0000000..bddd4df --- /dev/null +++ b/PEAR2/Console/CommandLine/XmlParser.php @@ -0,0 +1,303 @@ + + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 0.2.1 + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since File available since release 0.1.0 + * @filesource + */ + +namespace PEAR2\Console\CommandLine; + +use PEAR2\Console\CommandLine; + +/** + * Parser for command line xml definitions. + * + * @category Console + * @package PEAR2\Console\CommandLine + * @author David JEAN LOUIS + * @copyright 2007-2009 David JEAN LOUIS + * @license http://opensource.org/licenses/mit-license.php MIT License + * @link http://pear2.php.net/PEAR2_Console_CommandLine + * @since Class available since release 0.1.0 + */ +class XmlParser +{ + // parse() {{{ + + /** + * Parses the given xml definition file and returns a + * PEAR2\Console\CommandLine instance constructed with the xml data. + * + * @param string $xmlfile The xml file to parse + * + * @return PEAR2\Console\CommandLine A parser instance + */ + public static function parse($xmlfile) + { + if (!is_readable($xmlfile)) { + CommandLine::triggerError( + 'invalid_xml_file', + E_USER_ERROR, + array('{$file}' => $xmlfile) + ); + } + $doc = new \DomDocument(); + $doc->load($xmlfile); + self::validate($doc); + $nodes = $doc->getElementsByTagName('command'); + $root = $nodes->item(0); + return self::_parseCommandNode($root, true); + } + + // }}} + // parseString() {{{ + + /** + * Parses the given xml definition string and returns a + * PEAR2\Console\CommandLine instance constructed with the xml data. + * + * @param string $xmlstr The xml string to parse + * + * @return PEAR2\Console\CommandLine A parser instance + */ + public static function parseString($xmlstr) + { + $doc = new \DomDocument(); + $doc->loadXml($xmlstr); + self::validate($doc); + $nodes = $doc->getElementsByTagName('command'); + $root = $nodes->item(0); + return self::_parseCommandNode($root, true); + } + + // }}} + // validate() {{{ + + /** + * Validates the xml definition using Relax NG. + * + * @param DomDocument $doc The document to validate + * + * @return boolean Whether the xml data is valid or not. + * @throws PEAR2\Console\CommandLine\Exception + * @todo use exceptions only + */ + public static function validate($doc) + { + $rngfile = __DIR__ + . '/../../../../data/pear2.php.net/PEAR2_Console_CommandLine/xmlschema.rng'; + if (!is_file($rngfile)) { + $rngfile = __DIR__ . '/../../../../data/xmlschema.rng'; + } + if (!is_readable($rngfile)) { + CommandLine::triggerError( + 'invalid_xml_file', + E_USER_ERROR, + array('{$file}' => $rngfile) + ); + } + return $doc->relaxNGValidate($rngfile); + } + + // }}} + // _parseCommandNode() {{{ + + /** + * Parses the root command node or a command node and returns the + * constructed PEAR2\Console\CommandLine or PEAR2\Console\CommandLine_Command + * instance. + * + * @param DomDocumentNode $node The node to parse + * @param bool $isRootNode Whether it is a root node or not + * + * @return mixed PEAR2\Console\CommandLine or PEAR2\Console\CommandLine_Command + */ + private static function _parseCommandNode($node, $isRootNode = false) + { + if ($isRootNode) { + $obj = new CommandLine(); + } else { + $obj = new CommandLine\Command(); + } + foreach ($node->childNodes as $cNode) { + $cNodeName = $cNode->nodeName; + switch ($cNodeName) { + case 'name': + case 'description': + case 'version': + $obj->$cNodeName = trim($cNode->nodeValue); + break; + case 'add_help_option': + case 'add_version_option': + case 'force_posix': + $obj->$cNodeName = self::_bool(trim($cNode->nodeValue)); + break; + case 'option': + $obj->addOption(self::_parseOptionNode($cNode)); + break; + case 'argument': + $obj->addArgument(self::_parseArgumentNode($cNode)); + break; + case 'command': + $obj->addCommand(self::_parseCommandNode($cNode)); + break; + case 'aliases': + if (!$isRootNode) { + foreach ($cNode->childNodes as $subChildNode) { + if ($subChildNode->nodeName == 'alias') { + $obj->aliases[] = trim($subChildNode->nodeValue); + } + } + } + break; + case 'messages': + $obj->messages = self::_messages($cNode); + break; + default: + break; + } + } + return $obj; + } + + // }}} + // _parseOptionNode() {{{ + + /** + * Parses an option node and returns the constructed + * PEAR2\Console\CommandLine_Option instance. + * + * @param DomDocumentNode $node The node to parse + * + * @return PEAR2\Console\CommandLine\Option The built option + */ + private static function _parseOptionNode($node) + { + $obj = new CommandLine\Option($node->getAttribute('name')); + foreach ($node->childNodes as $cNode) { + $cNodeName = $cNode->nodeName; + switch ($cNodeName) { + case 'choices': + foreach ($cNode->childNodes as $subChildNode) { + if ($subChildNode->nodeName == 'choice') { + $obj->choices[] = trim($subChildNode->nodeValue); + } + } + break; + case 'messages': + $obj->messages = self::_messages($cNode); + break; + default: + if (property_exists($obj, $cNodeName)) { + $obj->$cNodeName = trim($cNode->nodeValue); + } + break; + } + } + if ($obj->action == 'Password') { + $obj->argument_optional = true; + } + return $obj; + } + + // }}} + // _parseArgumentNode() {{{ + + /** + * Parses an argument node and returns the constructed + * PEAR2\Console\CommandLine_Argument instance. + * + * @param DomDocumentNode $node The node to parse + * + * @return PEAR2\Console\CommandLine\Argument The built argument + */ + private static function _parseArgumentNode($node) + { + $obj = new CommandLine\Argument($node->getAttribute('name')); + foreach ($node->childNodes as $cNode) { + $cNodeName = $cNode->nodeName; + switch ($cNodeName) { + case 'description': + case 'help_name': + case 'default': + $obj->$cNodeName = trim($cNode->nodeValue); + break; + case 'multiple': + $obj->multiple = self::_bool(trim($cNode->nodeValue)); + break; + case 'optional': + $obj->optional = self::_bool(trim($cNode->nodeValue)); + break; + case 'messages': + $obj->messages = self::_messages($cNode); + break; + default: + break; + } + } + return $obj; + } + + // }}} + // _bool() {{{ + + /** + * Returns a boolean according to true/false possible strings. + * + * @param string $str The string to process + * + * @return boolean + */ + private static function _bool($str) + { + return in_array((string)$str, array('true', '1', 'on', 'yes')); + } + + // }}} + // _messages() {{{ + + /** + * Returns an array of custom messages for the element + * + * @param DOMNode $node The messages node to process + * + * @return array an array of messages + * + * @see PEAR2\Console\CommandLine::$messages + * @see PEAR2\Console\CommandLine_Element::$messages + */ + private static function _messages(DOMNode $node) + { + $messages = array(); + + foreach ($node->childNodes as $cNode) { + if ($cNode->nodeType == XML_ELEMENT_NODE) { + $name = $cNode->getAttribute('name'); + $value = trim($cNode->nodeValue); + + $messages[$name] = $value; + } + } + + return $messages; + } + + // }}} +} diff --git a/PEAR2/Net/RouterOS/Client.php b/PEAR2/Net/RouterOS/Client.php new file mode 100644 index 0000000..88b13e5 --- /dev/null +++ b/PEAR2/Net/RouterOS/Client.php @@ -0,0 +1,819 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Refers to transmitter direction constants. + */ +use PEAR2\Net\Transmitter\Stream as S; + +/** + * Refers to the cryptography constants. + */ +use PEAR2\Net\Transmitter\NetworkStream as N; + +/** + * Catches arbitrary exceptions at some points. + */ +use Exception as E; + +/** + * A RouterOS client. + * + * Provides functionality for easily communicating with a RouterOS host. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Client +{ + /** + * Used in {@link static::isRequestActive()} to limit search only to + * requests that have a callback. + */ + const FILTER_CALLBACK = 1; + /** + * Used in {@link static::isRequestActive()} to limit search only to + * requests that use the buffer. + */ + const FILTER_BUFFER = 2; + /** + * Used in {@link static::isRequestActive()} to indicate no limit in search. + */ + const FILTER_ALL = 3; + + /** + * @var Communicator The communicator for this client. + */ + protected $com; + + /** + * @var int The number of currently pending requests. + */ + protected $pendingRequestsCount = 0; + + /** + * @var array An array of responses that have not yet been extracted or + * passed to a callback. Key is the tag of the request, and the value + * is an array of associated responses. + */ + protected $responseBuffer = array(); + + /** + * @var array An array of callbacks to be executed as responses come. + * Key is the tag of the request, and the value is the callback for it. + */ + protected $callbacks = array(); + + /** + * @var Registry A registry for the operations. Particularly helpful at + * persistent connections. + */ + protected $registry = null; + + /** + * @var bool Whether to stream future responses. + */ + private $_streamingResponses = false; + + /** + * Creates a new instance of a RouterOS API client. + * + * Creates a new instance of a RouterOS API client with the specified + * settings. + * + * @param string $host Hostname (IP or domain) of the RouterOS server. + * @param string $username The RouterOS username. + * @param string $password The RouterOS password. + * @param int|null $port The port on which the RouterOS server provides + * the API service. You can also specify NULL, in which case the port + * will automatically be chosen between 8728 and 8729, depending on the + * value of $crypto. + * @param bool $persist Whether or not the connection should be a + * persistent one. + * @param float $timeout The timeout for the connection. + * @param string $crypto The encryption for this connection. Must be one + * of the PEAR2\Net\Transmitter\NetworkStream::CRYPTO_* constants. Off + * by default. RouterOS currently supports only TLS, but the setting is + * provided in this fashion for forward compatibility's sake. And for + * the sake of simplicity, if you specify an encryption, don't specify a + * context and your default context uses the value "DEFAULT" for + * ciphers, "ADH" will be automatically added to the list of ciphers. + * @param resource $context A context for the socket. + * + * @see sendSync() + * @see sendAsync() + */ + public function __construct( + $host, + $username, + $password = '', + $port = 8728, + $persist = false, + $timeout = null, + $crypto = N::CRYPTO_OFF, + $context = null + ) { + $this->com = new Communicator( + $host, + $port, + $persist, + $timeout, + $username . '/' . $password, + $crypto, + $context + ); + $timeout = null == $timeout + ? ini_get('default_socket_timeout') + : (int) $timeout; + //Login the user if necessary + if ((!$persist + || !($old = $this->com->getTransmitter()->lock(S::DIRECTION_ALL))) + && $this->com->getTransmitter()->isFresh() + ) { + if (!static::login($this->com, $username, $password, $timeout)) { + $this->com->close(); + throw new DataFlowException( + 'Invalid username or password supplied.', + DataFlowException::CODE_INVALID_CREDENTIALS + ); + } + } + + if (isset($old)) { + $this->com->getTransmitter()->lock($old, true); + } + + if ($persist) { + $this->registry = new Registry("{$host}:{$port}/{$username}"); + } + } + + /** + * A shorthand gateway. + * + * This is a magic PHP method that allows you to call the object as a + * function. Depending on the argument given, one of the other functions in + * the class is invoked and its returned value is returned by this function. + * + * @param mixed $arg Value can be either a {@link Request} to send, which + * would be sent asynchoniously if it has a tag, and synchroniously if + * not, a number to loop with or NULL to complete all pending requests. + * Any other value is converted to string and treated as the tag of a + * request to complete. + * + * @return mixed Whatever the long form function would have returned. + */ + public function __invoke($arg = null) + { + if (is_int($arg) || is_double($arg)) { + return $this->loop($arg); + } elseif ($arg instanceof Request) { + return '' == $arg->getTag() ? $this->sendSync($arg) + : $this->sendAsync($arg); + } elseif (null === $arg) { + return $this->completeRequest(); + } + return $this->completeRequest((string) $arg); + } + + /** + * Login to a RouterOS connection. + * + * @param Communicator $com The communicator to attempt to login to. + * @param string $username The RouterOS username. + * @param string $password The RouterOS password. + * @param int|null $timeout The time to wait for each response. NULL + * waits indefinetly. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function login( + Communicator $com, + $username, + $password = '', + $timeout = null + ) { + if (null !== ($remoteCharset = $com->getCharset($com::CHARSET_REMOTE)) + && null !== ($localCharset = $com->getCharset($com::CHARSET_LOCAL)) + ) { + $password = iconv( + $localCharset, + $remoteCharset . '//IGNORE//TRANSLIT', + $password + ); + } + $old = null; + try { + if ($com->getTransmitter()->isPersistent()) { + $old = $com->getTransmitter()->lock(S::DIRECTION_ALL); + $result = self::_login($com, $username, $password, $timeout); + $com->getTransmitter()->lock($old, true); + return $result; + } + return self::_login($com, $username, $password, $timeout); + } catch (E $e) { + if ($com->getTransmitter()->isPersistent() && null !== $old) { + $com->getTransmitter()->lock($old, true); + } + throw ($e instanceof NotSupportedException + || $e instanceof UnexpectedValueException + || !$com->getTransmitter()->isDataAwaiting()) ? new SocketException( + 'This is not a compatible RouterOS service', + SocketException::CODE_SERVICE_INCOMPATIBLE, + $e + ) : $e; + } + } + + /** + * Login to a RouterOS connection. + * + * This is the actual login procedure, applied regardless of persistence and + * charset settings. + * + * @param Communicator $com The communicator to attempt to login to. + * @param string $username The RouterOS username. + * @param string $password The RouterOS password. Potentially parsed + * already by iconv. + * @param int|null $timeout The time to wait for each response. NULL + * waits indefinetly. + * + * @return bool TRUE on success, FALSE on failure. + */ + private static function _login( + Communicator $com, + $username, + $password = '', + $timeout = null + ) { + $request = new Request('/login'); + $request->send($com); + $response = new Response($com, false, $timeout); + $request->setArgument('name', $username); + $request->setArgument( + 'response', + '00' . md5( + chr(0) . $password + . pack('H*', $response->getProperty('ret')) + ) + ); + $request->send($com); + $response = new Response($com, false, $timeout); + return $response->getType() === Response::TYPE_FINAL + && null === $response->getProperty('ret'); + } + + /** + * Sets the charset(s) for this connection. + * + * Sets the charset(s) for this connection. The specified charset(s) will be + * used for all future requests and responses. When sending, + * {@link Communicator::CHARSET_LOCAL} is converted to + * {@link Communicator::CHARSET_REMOTE}, and when receiving, + * {@link Communicator::CHARSET_REMOTE} is converted to + * {@link Communicator::CHARSET_LOCAL}. Setting NULL to either charset will + * disable charset convertion, and data will be both sent and received "as + * is". + * + * @param mixed $charset The charset to set. If $charsetType is + * {@link Communicator::CHARSET_ALL}, you can supply either a string to + * use for all charsets, or an array with the charset types as keys, and + * the charsets as values. + * @param int $charsetType Which charset to set. Valid values are the + * Communicator::CHARSET_* constants. Any other value is treated as + * {@link Communicator::CHARSET_ALL}. + * + * @return string|array The old charset. If $charsetType is + * {@link Communicator::CHARSET_ALL}, the old values will be returned as + * an array with the types as keys, and charsets as values. + * @see Communicator::setDefaultCharset() + */ + public function setCharset( + $charset, + $charsetType = Communicator::CHARSET_ALL + ) { + return $this->com->setCharset($charset, $charsetType); + } + + /** + * Gets the charset(s) for this connection. + * + * @param int $charsetType Which charset to get. Valid values are the + * Communicator::CHARSET_* constants. Any other value is treated as + * {@link Communicator::CHARSET_ALL}. + * + * @return string|array The current charset. If $charsetType is + * {@link Communicator::CHARSET_ALL}, the current values will be + * returned as an array with the types as keys, and charsets as values. + * @see setCharset() + */ + public function getCharset($charsetType) + { + return $this->com->getCharset($charsetType); + } + + /** + * Sends a request and waits for responses. + * + * @param Request $request The request to send. + * @param callback $callback Optional. A function that is to be executed + * when new responses for this request are available. The callback takes + * two parameters. The {@link Response} object as the first, and the + * {@link Client} object as the second one. If the function returns + * TRUE, the request is canceled. Note that the callback may be executed + * one last time after that with a response that notifies about the + * canceling. + * + * @return $this The client object. + * @see completeRequest() + * @see loop() + * @see cancelRequest() + */ + public function sendAsync(Request $request, $callback = null) + { + //Error checking + $tag = $request->getTag(); + if ('' == $tag) { + throw new DataFlowException( + 'Asynchonous commands must have a tag.', + DataFlowException::CODE_TAG_REQUIRED + ); + } + if ($this->isRequestActive($tag)) { + throw new DataFlowException( + 'There must not be multiple active requests sharing a tag.', + DataFlowException::CODE_TAG_UNIQUE + ); + } + if (null !== $callback && !is_callable($callback, true)) { + throw new UnexpectedValueException( + 'Invalid callback provided.', + UnexpectedValueException::CODE_CALLBACK_INVALID + ); + } + + $this->send($request); + + if (null === $callback) { + //Register the request at the buffer + $this->responseBuffer[$tag] = array(); + } else { + //Prepare the callback + $this->callbacks[$tag] = $callback; + } + return $this; + } + + /** + * Checks if a request is active. + * + * Checks if a request is active. A request is considered active if it's a + * pending request and/or has responses that are not yet extracted. + * + * @param string $tag The tag of the request to look for. + * @param int $filter One of the FILTER_* consntants. Limits the search + * to the specified places. + * + * @return bool TRUE if the request is active, FALSE otherwise. + * @see getPendingRequestsCount() + * @see completeRequest() + */ + public function isRequestActive($tag, $filter = self::FILTER_ALL) + { + $result = 0; + if ($filter & self::FILTER_CALLBACK) { + $result |= (int) array_key_exists($tag, $this->callbacks); + } + if ($filter & self::FILTER_BUFFER) { + $result |= (int) array_key_exists($tag, $this->responseBuffer); + } + return 0 !== $result; + } + + /** + * Sends a request and gets the full response. + * + * @param Request $request The request to send. + * + * @return ResponseCollection The received responses as a collection. + * @see sendAsync() + * @see close() + */ + public function sendSync(Request $request) + { + $tag = $request->getTag(); + if ('' == $tag) { + $this->send($request); + } else { + $this->sendAsync($request); + } + return $this->completeRequest($tag); + } + + /** + * Completes a specified request. + * + * Starts an event loop for the RouterOS callbacks and finishes when a + * specified request is completed. + * + * @param string $tag The tag of the request to complete. Setting NULL + * completes all requests. + * + * @return ResponseCollection A collection of {@link Response} objects that + * haven't been passed to a callback function or previously extracted + * with {@link static::extractNewResponses()}. Returns an empty + * collection when $tag is set to NULL (responses can still be + * extracted). + */ + public function completeRequest($tag = null) + { + $hasNoTag = '' == $tag; + $result = $hasNoTag ? array() + : $this->extractNewResponses($tag)->toArray(); + while ((!$hasNoTag && $this->isRequestActive($tag)) + || ($hasNoTag && 0 !== $this->getPendingRequestsCount()) + ) { + $newReply = $this->dispatchNextResponse(null); + if ($newReply->getTag() === $tag) { + if ($hasNoTag) { + $result[] = $newReply; + } + if ($newReply->getType() === Response::TYPE_FINAL) { + if (!$hasNoTag) { + $result = array_merge( + $result, + $this->isRequestActive($tag) + ? $this->extractNewResponses($tag)->toArray() + : array() + ); + } + break; + } + } + } + return new ResponseCollection($result); + } + + /** + * Extracts responses for a request. + * + * Gets all new responses for a request that haven't been passed to a + * callback and clears the buffer from them. + * + * @param string $tag The tag of the request to extract new responses for. + * Specifying NULL with extract new responses for all requests. + * + * @return ResponseCollection A collection of {@link Response} objects for + * the specified request. + * @see loop() + */ + public function extractNewResponses($tag = null) + { + if (null === $tag) { + $result = array(); + foreach (array_keys($this->responseBuffer) as $tag) { + $result = array_merge( + $result, + $this->extractNewResponses($tag)->toArray() + ); + } + return new ResponseCollection($result); + } elseif ($this->isRequestActive($tag, self::FILTER_CALLBACK)) { + return new ResponseCollection(array()); + } elseif ($this->isRequestActive($tag, self::FILTER_BUFFER)) { + $result = $this->responseBuffer[$tag]; + if (!empty($result)) { + if (end($result)->getType() === Response::TYPE_FINAL) { + unset($this->responseBuffer[$tag]); + } else { + $this->responseBuffer[$tag] = array(); + } + } + return new ResponseCollection($result); + } else { + throw new DataFlowException( + 'No such request, or the request has already finished.', + DataFlowException::CODE_UNKNOWN_REQUEST + ); + } + } + + /** + * Starts an event loop for the RouterOS callbacks. + * + * Starts an event loop for the RouterOS callbacks and finishes when there + * are no more pending requests or when a specified timeout has passed + * (whichever comes first). + * + * @param int $sTimeout Timeout for the loop. If NULL, there is no time + * limit. + * @param int $usTimeout Microseconds to add to the time limit. + * + * @return bool TRUE when there are any more pending requests, FALSE + * otherwise. + * @see extractNewResponses() + * @see getPendingRequestsCount() + */ + public function loop($sTimeout = null, $usTimeout = 0) + { + try { + if (null === $sTimeout) { + while ($this->getPendingRequestsCount() !== 0) { + $this->dispatchNextResponse(null); + } + } else { + list($usStart, $sStart) = explode(' ', microtime()); + while ($this->getPendingRequestsCount() !== 0 + && ($sTimeout >= 0 || $usTimeout >= 0) + ) { + $this->dispatchNextResponse($sTimeout, $usTimeout); + list($usEnd, $sEnd) = explode(' ', microtime()); + + $sTimeout -= $sEnd - $sStart; + $usTimeout -= $usEnd - $usStart; + if ($usTimeout <= 0) { + if ($sTimeout > 0) { + $usTimeout = 1000000 + $usTimeout; + $sTimeout--; + } + } + + $sStart = $sEnd; + $usStart = $usEnd; + } + } + } catch (SocketException $e) { + if ($e->getCode() !== SocketException::CODE_NO_DATA) { + // @codeCoverageIgnoreStart + // It's impossible to reliably cause any other SocketException. + // This line is only here in case the unthinkable happens: + // The connection terminates just after it was supposedly + // about to send back some data. + throw $e; + // @codeCoverageIgnoreEnd + } + } + return $this->getPendingRequestsCount() !== 0; + } + + /** + * Gets the number of pending requests. + * + * @return int The number of pending requests. + * @see isRequestActive() + */ + public function getPendingRequestsCount() + { + return $this->pendingRequestsCount; + } + + /** + * Cancels a request. + * + * Cancels an active request. Using this function in favor of a plain call + * to the "/cancel" command is highly reccomended, as it also updates the + * counter of pending requests properly. Note that canceling a request also + * removes any responses for it that were not previously extracted with + * {@link static::extractNewResponses()}. + * + * @param string $tag Tag of the request to cancel. Setting NULL will cancel + * all requests. + * + * @return $this The client object. + * @see sendAsync() + * @see close() + */ + public function cancelRequest($tag = null) + { + $cancelRequest = new Request('/cancel'); + $hasTag = !('' == $tag); + $hasReg = null !== $this->registry; + if ($hasReg && !$hasTag) { + $tags = array_merge( + array_keys($this->responseBuffer), + array_keys($this->callbacks) + ); + $this->registry->setTaglessMode(true); + foreach ($tags as $t) { + $cancelRequest->setArgument( + 'tag', + $this->registry->getOwnershipTag() . $t + ); + $this->sendSync($cancelRequest); + } + $this->registry->setTaglessMode(false); + } else { + if ($hasTag) { + if ($this->isRequestActive($tag)) { + if ($hasReg) { + $this->registry->setTaglessMode(true); + $cancelRequest->setArgument( + 'tag', + $this->registry->getOwnershipTag() . $tag + ); + } else { + $cancelRequest->setArgument('tag', $tag); + } + } else { + throw new DataFlowException( + 'No such request. Canceling aborted.', + DataFlowException::CODE_CANCEL_FAIL + ); + } + } + $this->sendSync($cancelRequest); + if ($hasReg) { + $this->registry->setTaglessMode(false); + } + } + + if ($hasTag) { + if ($this->isRequestActive($tag, self::FILTER_BUFFER)) { + $this->responseBuffer[$tag] = $this->completeRequest($tag); + } else { + $this->completeRequest($tag); + } + } else { + $this->loop(); + } + return $this; + } + + /** + * Sets response streaming setting. + * + * Sets whether future responses are streamed. If responses are streamed, + * the argument values are returned as streams instead of strings. This is + * particularly useful if you expect a response that may contain one or more + * very large words. + * + * @param bool $streamingResponses Whether to stream future responses. + * + * @return bool The previous value of the setting. + * @see isStreamingResponses() + */ + public function setStreamingResponses($streamingResponses) + { + $oldValue = $this->_streamingResponses; + $this->_streamingResponses = (bool) $streamingResponses; + return $oldValue; + } + + /** + * Gets response streaming setting. + * + * Gets whether future responses are streamed. + * + * @return bool The value of the setting. + * @see setStreamingResponses() + */ + public function isStreamingResponses() + { + return $this->_streamingResponses; + } + + /** + * Closes the opened connection, even if it is a persistent one. + * + * Closes the opened connection, even if it is a persistent one. Note that + * {@link static::extractNewResponses()} can still be used to extract + * responses collected prior to the closing. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function close() + { + $result = true; + /* + * The check below is done because for some unknown reason + * (either a PHP or a RouterOS bug) calling "/quit" on an encrypted + * connection makes one end hang. + * + * Since encrypted connections only appeared in RouterOS 6.1, and + * the "/quit" call is needed for all <6.0 versions, problems due + * to its absence should be limited to some earlier 6.* versions + * on some RouterBOARD devices. + */ + if ($this->com->getTransmitter()->getCrypto() === N::CRYPTO_OFF) { + if (null !== $this->registry) { + $this->registry->setTaglessMode(true); + } + try { + $response = $this->sendSync(new Request('/quit')); + $result = $response[0]->getType() === Response::TYPE_FATAL; + } catch (SocketException $e) { + $result + = $e->getCode() === SocketException::CODE_REQUEST_SEND_FAIL; + } catch (E $e) { + //Ignore unknown errors. + } + if (null !== $this->registry) { + $this->registry->setTaglessMode(false); + } + } + $result = $result && $this->com->close(); + $this->callbacks = array(); + $this->pendingRequestsCount = 0; + return $result; + } + + /** + * Closes the connection, unless it's a persistent one. + */ + public function __destruct() + { + if ($this->com->getTransmitter()->isPersistent()) { + if (0 !== $this->pendingRequestsCount) { + $this->cancelRequest(); + } + } else { + $this->close(); + } + } + + /** + * Sends a request to RouterOS. + * + * @param Request $request The request to send. + * + * @return $this The client object. + * @see sendSync() + * @see sendAsync() + */ + protected function send(Request $request) + { + $request->send($this->com, $this->registry); + $this->pendingRequestsCount++; + return $this; + } + + /** + * Dispatches the next response in queue. + * + * Dispatches the next response in queue, i.e. it executes the associated + * callback if there is one, or places the response in the response buffer. + * + * @param int $sTimeout If a response is not immediatly available, wait + * this many seconds. If NULL, wait indefinetly. + * @param int $usTimeout Microseconds to add to the waiting time. + * + * @throws SocketException When there's no response within the time limit. + * @return Response The dispatched response. + */ + protected function dispatchNextResponse($sTimeout = 0, $usTimeout = 0) + { + $response = new Response( + $this->com, + $this->_streamingResponses, + $sTimeout, + $usTimeout, + $this->registry + ); + if ($response->getType() === Response::TYPE_FATAL) { + $this->pendingRequestsCount = 0; + $this->com->close(); + return $response; + } + + $tag = $response->getTag(); + $isLastForRequest = $response->getType() === Response::TYPE_FINAL; + if ($isLastForRequest) { + $this->pendingRequestsCount--; + } + + if ('' != $tag) { + if ($this->isRequestActive($tag, self::FILTER_CALLBACK)) { + if ($this->callbacks[$tag]($response, $this)) { + $this->cancelRequest($tag); + } elseif ($isLastForRequest) { + unset($this->callbacks[$tag]); + } + } else { + $this->responseBuffer[$tag][] = $response; + } + } + return $response; + } +} diff --git a/PEAR2/Net/RouterOS/Communicator.php b/PEAR2/Net/RouterOS/Communicator.php new file mode 100644 index 0000000..8176cfd --- /dev/null +++ b/PEAR2/Net/RouterOS/Communicator.php @@ -0,0 +1,671 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Using transmitters. + */ +use PEAR2\Net\Transmitter as T; + +/** + * A RouterOS communicator. + * + * Implementation of the RouterOS API protocol. Unlike the other classes in this + * package, this class doesn't provide any conviniences beyond the low level + * implementation details (automatic word length encoding/decoding, charset + * translation and data integrity), and because of that, its direct usage is + * strongly discouraged. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + * @see Client + */ +class Communicator +{ + /** + * Used when getting/setting all (default) charsets. + */ + const CHARSET_ALL = -1; + + /** + * Used when getting/setting the (default) remote charset. + * + * The remote charset is the charset in which RouterOS stores its data. + * If you want to keep compatibility with your Winbox, this charset should + * match the default charset from your Windows' regional settings. + */ + const CHARSET_REMOTE = 0; + + /** + * Used when getting/setting the (default) local charset. + * + * The local charset is the charset in which the data from RouterOS will be + * returned as. This charset should match the charset of the place the data + * will eventually be written to. + */ + const CHARSET_LOCAL = 1; + + /** + * @var array An array with the default charset types as keys, and the + * default charsets as values. + */ + protected static $defaultCharsets = array( + self::CHARSET_REMOTE => null, + self::CHARSET_LOCAL => null + ); + + /** + * @var array An array with the current charset types as keys, and the + * current charsets as values. + */ + protected $charsets = array(); + + /** + * @var T\TcpClient The transmitter for the connection. + */ + protected $trans; + + /** + * Creates a new connection with the specified options. + * + * @param string $host Hostname (IP or domain) of the RouterOS server. + * @param int|null $port The port on which the RouterOS server provides + * the API service. You can also specify NULL, in which case the port + * will automatically be chosen between 8728 and 8729, depending on the + * value of $crypto. + * @param bool $persist Whether or not the connection should be a + * persistent one. + * @param float $timeout The timeout for the connection. + * @param string $key A string that uniquely identifies the + * connection. + * @param string $crypto The encryption for this connection. Must be one + * of the PEAR2\Net\Transmitter\NetworkStream::CRYPTO_* constants. Off + * by default. RouterOS currently supports only TLS, but the setting is + * provided in this fashion for forward compatibility's sake. And for + * the sake of simplicity, if you specify an encryption, don't specify a + * context and your default context uses the value "DEFAULT" for + * ciphers, "ADH" will be automatically added to the list of ciphers. + * @param resource $context A context for the socket. + * + * @see sendWord() + */ + public function __construct( + $host, + $port = 8728, + $persist = false, + $timeout = null, + $key = '', + $crypto = T\NetworkStream::CRYPTO_OFF, + $context = null + ) { + $isUnencrypted = T\NetworkStream::CRYPTO_OFF === $crypto; + if (($context === null) && !$isUnencrypted) { + $context = stream_context_get_default(); + $opts = stream_context_get_options($context); + if (!isset($opts['ssl']['ciphers']) + || 'DEFAULT' === $opts['ssl']['ciphers'] + ) { + stream_context_set_option($context, 'ssl', 'ciphers', 'ADH'); + } + } + // @codeCoverageIgnoreStart + // The $port is customizable in testing. + if (null === $port) { + $port = $isUnencrypted ? 8728 : 8729; + } + // @codeCoverageIgnoreEnd + + try { + $this->trans = new T\TcpClient( + $host, + $port, + $persist, + $timeout, + $key, + $crypto, + $context + ); + } catch (T\Exception $e) { + throw new SocketException( + 'Error connecting to RouterOS', + SocketException::CODE_CONNECTION_FAIL, + $e + ); + } + $this->setCharset( + self::getDefaultCharset(self::CHARSET_ALL), + self::CHARSET_ALL + ); + } + + /** + * A shorthand gateway. + * + * This is a magic PHP method that allows you to call the object as a + * function. Depending on the argument given, one of the other functions in + * the class is invoked and its returned value is returned by this function. + * + * @param string $string A string of the word to send, or NULL to get the + * next word as a string. + * + * @return int|string If a string is provided, returns the number of bytes + * sent, otherwise retuns the next word as a string. + */ + public function __invoke($string = null) + { + return null === $string ? $this->getNextWord() + : $this->sendWord($string); + } + + /** + * Checks whether a variable is a seekable stream resource. + * + * @param mixed $var The value to check. + * + * @return bool TRUE if $var is a seekable stream, FALSE otherwise. + */ + public static function isSeekableStream($var) + { + if (T\Stream::isStream($var)) { + $meta = stream_get_meta_data($var); + return $meta['seekable']; + } + return false; + } + + /** + * Uses iconv to convert a stream from one charset to another. + * + * @param string $inCharset The charset of the stream. + * @param string $outCharset The desired resulting charset. + * @param resource $stream The stream to convert. The stream is assumed + * to be seekable, and is read from its current position to its end, + * after which, it is seeked back to its starting position. + * + * @return resource A new stream that uses the $out_charset. The stream is a + * subset from the original stream, from its current position to its + * end, seeked at its start. + */ + public static function iconvStream($inCharset, $outCharset, $stream) + { + $bytes = 0; + $result = fopen('php://temp', 'r+b'); + $iconvFilter = stream_filter_append( + $result, + 'convert.iconv.' . $inCharset . '.' . $outCharset, + STREAM_FILTER_WRITE + ); + + flock($stream, LOCK_SH); + while (!feof($stream)) { + $bytes += stream_copy_to_stream($stream, $result, 0xFFFFF); + } + fseek($stream, -$bytes, SEEK_CUR); + flock($stream, LOCK_UN); + + stream_filter_remove($iconvFilter); + rewind($result); + return $result; + } + + /** + * Sets the default charset(s) for new connections. + * + * @param mixed $charset The charset to set. If $charsetType is + * {@link self::CHARSET_ALL}, you can supply either a string to use for + * all charsets, or an array with the charset types as keys, and the + * charsets as values. + * @param int $charsetType Which charset to set. Valid values are the + * CHARSET_* constants. Any other value is treated as + * {@link self::CHARSET_ALL}. + * + * @return string|array The old charset. If $charsetType is + * {@link self::CHARSET_ALL}, the old values will be returned as an + * array with the types as keys, and charsets as values. + * @see setCharset() + */ + public static function setDefaultCharset( + $charset, + $charsetType = self::CHARSET_ALL + ) { + if (array_key_exists($charsetType, self::$defaultCharsets)) { + $oldCharset = self::$defaultCharsets[$charsetType]; + self::$defaultCharsets[$charsetType] = $charset; + return $oldCharset; + } else { + $oldCharsets = self::$defaultCharsets; + self::$defaultCharsets = is_array($charset) ? $charset : array_fill( + 0, + count(self::$defaultCharsets), + $charset + ); + return $oldCharsets; + } + } + + /** + * Gets the default charset(s). + * + * @param int $charsetType Which charset to get. Valid values are the + * CHARSET_* constants. Any other value is treated as + * {@link self::CHARSET_ALL}. + * + * @return string|array The current charset. If $charsetType is + * {@link self::CHARSET_ALL}, the current values will be returned as an + * array with the types as keys, and charsets as values. + * @see setDefaultCharset() + */ + public static function getDefaultCharset($charsetType) + { + return array_key_exists($charsetType, self::$defaultCharsets) + ? self::$defaultCharsets[$charsetType] : self::$defaultCharsets; + } + + /** + * Gets the length of a seekable stream. + * + * Gets the length of a seekable stream. + * + * @param resource $stream The stream to check. The stream is assumed to be + * seekable. + * + * @return double The number of bytes in the stream between its current + * position and its end. + */ + public static function seekableStreamLength($stream) + { + $streamPosition = (double) sprintf('%u', ftell($stream)); + fseek($stream, 0, SEEK_END); + $streamLength = ((double) sprintf('%u', ftell($stream))) + - $streamPosition; + fseek($stream, $streamPosition, SEEK_SET); + return $streamLength; + } + + /** + * Sets the charset(s) for this connection. + * + * Sets the charset(s) for this connection. The specified charset(s) will be + * used for all future words. When sending, {@link self::CHARSET_LOCAL} is + * converted to {@link self::CHARSET_REMOTE}, and when receiving, + * {@link self::CHARSET_REMOTE} is converted to {@link self::CHARSET_LOCAL}. + * Setting NULL to either charset will disable charset convertion, and data + * will be both sent and received "as is". + * + * @param mixed $charset The charset to set. If $charsetType is + * {@link self::CHARSET_ALL}, you can supply either a string to use for + * all charsets, or an array with the charset types as keys, and the + * charsets as values. + * @param int $charsetType Which charset to set. Valid values are the + * CHARSET_* constants. Any other value is treated as + * {@link self::CHARSET_ALL}. + * + * @return string|array The old charset. If $charsetType is + * {@link self::CHARSET_ALL}, the old values will be returned as an + * array with the types as keys, and charsets as values. + * @see setDefaultCharset() + */ + public function setCharset($charset, $charsetType = self::CHARSET_ALL) + { + if (array_key_exists($charsetType, $this->charsets)) { + $oldCharset = $this->charsets[$charsetType]; + $this->charsets[$charsetType] = $charset; + return $oldCharset; + } else { + $oldCharsets = $this->charsets; + $this->charsets = is_array($charset) ? $charset : array_fill( + 0, + count($this->charsets), + $charset + ); + return $oldCharsets; + } + } + + /** + * Gets the charset(s) for this connection. + * + * @param int $charsetType Which charset to get. Valid values are the + * CHARSET_* constants. Any other value is treated as + * {@link self::CHARSET_ALL}. + * + * @return string|array The current charset. If $charsetType is + * {@link self::CHARSET_ALL}, the current values will be returned as an + * array with the types as keys, and charsets as values. + * @see getDefaultCharset() + * @see setCharset() + */ + public function getCharset($charsetType) + { + return array_key_exists($charsetType, $this->charsets) + ? $this->charsets[$charsetType] : $this->charsets; + } + + /** + * Gets the transmitter for this connection. + * + * @return T\TcpClient The transmitter for this connection. + */ + public function getTransmitter() + { + return $this->trans; + } + + /** + * Sends a word. + * + * Sends a word and automatically encodes its length when doing so. + * + * @param string $word The word to send. + * + * @return int The number of bytes sent. + * @see sendWordFromStream() + * @see getNextWord() + */ + public function sendWord($word) + { + if (null !== ($remoteCharset = $this->getCharset(self::CHARSET_REMOTE)) + && null !== ($localCharset = $this->getCharset(self::CHARSET_LOCAL)) + ) { + $word = iconv( + $localCharset, + $remoteCharset . '//IGNORE//TRANSLIT', + $word + ); + } + $length = strlen($word); + static::verifyLengthSupport($length); + if ($this->trans->isPersistent()) { + $old = $this->trans->lock(T\Stream::DIRECTION_SEND); + $bytes = $this->trans->send(self::encodeLength($length) . $word); + $this->trans->lock($old, true); + return $bytes; + } + return $this->trans->send(self::encodeLength($length) . $word); + } + + /** + * Sends a word based on a stream. + * + * Sends a word based on a stream and automatically encodes its length when + * doing so. The stream is read from its current position to its end, and + * then returned to its current position. Because of those operations, the + * supplied stream must be seekable. + * + * @param string $prefix A string to prepend before the stream contents. + * @param resource $stream The seekable stream to send. + * + * @return int The number of bytes sent. + * @see sendWord() + */ + public function sendWordFromStream($prefix, $stream) + { + if (!self::isSeekableStream($stream)) { + throw new InvalidArgumentException( + 'The stream must be seekable.', + InvalidArgumentException::CODE_SEEKABLE_REQUIRED + ); + } + if (null !== ($remoteCharset = $this->getCharset(self::CHARSET_REMOTE)) + && null !== ($localCharset = $this->getCharset(self::CHARSET_LOCAL)) + ) { + $prefix = iconv( + $localCharset, + $remoteCharset . '//IGNORE//TRANSLIT', + $prefix + ); + $stream = self::iconvStream( + $localCharset, + $remoteCharset . '//IGNORE//TRANSLIT', + $stream + ); + } + + flock($stream, LOCK_SH); + $totalLength = strlen($prefix) + self::seekableStreamLength($stream); + static::verifyLengthSupport($totalLength); + + $bytes = $this->trans->send(self::encodeLength($totalLength) . $prefix); + $bytes += $this->trans->send($stream); + + flock($stream, LOCK_UN); + return $bytes; + } + + /** + * Verifies that the length is supported. + * + * Verifies if the specified length is supported by the API. Throws a + * {@link LengthException} if that's not the case. Currently, RouterOS + * supports words up to 0xFFFFFFFF in length, so that's the only check + * performed. + * + * @param int $length The length to verify. + * + * @return void + */ + protected static function verifyLengthSupport($length) + { + if ($length > 0xFFFFFFFF) { + throw new LengthException( + 'Words with length above 0xFFFFFFFF are not supported.', + LengthException::CODE_UNSUPPORTED, + null, + $length + ); + } + } + + /** + * Encodes the length as requred by the RouterOS API. + * + * @param int $length The length to encode. + * + * @return string The encoded length. + */ + public static function encodeLength($length) + { + if ($length < 0) { + throw new LengthException( + 'Length must not be negative.', + LengthException::CODE_INVALID, + null, + $length + ); + } elseif ($length < 0x80) { + return chr($length); + } elseif ($length < 0x4000) { + return pack('n', $length |= 0x8000); + } elseif ($length < 0x200000) { + $length |= 0xC00000; + return pack('n', $length >> 8) . chr($length & 0xFF); + } elseif ($length < 0x10000000) { + return pack('N', $length |= 0xE0000000); + } elseif ($length <= 0xFFFFFFFF) { + return chr(0xF0) . pack('N', $length); + } elseif ($length <= 0x7FFFFFFFF) { + $length = 'f' . base_convert($length, 10, 16); + return chr(hexdec(substr($length, 0, 2))) . + pack('N', hexdec(substr($length, 2))); + } + throw new LengthException( + 'Length must not be above 0x7FFFFFFFF.', + LengthException::CODE_BEYOND_SHEME, + null, + $length + ); + } + + /** + * Get the next word in queue as a string. + * + * Get the next word in queue as a string, after automatically decoding its + * length. + * + * @return string The word. + * @see close() + */ + public function getNextWord() + { + if ($this->trans->isPersistent()) { + $old = $this->trans->lock(T\Stream::DIRECTION_RECEIVE); + $word = $this->trans->receive( + self::decodeLength($this->trans), + 'word' + ); + $this->trans->lock($old, true); + } else { + $word = $this->trans->receive( + self::decodeLength($this->trans), + 'word' + ); + } + + if (null !== ($remoteCharset = $this->getCharset(self::CHARSET_REMOTE)) + && null !== ($localCharset = $this->getCharset(self::CHARSET_LOCAL)) + ) { + $word = iconv( + $remoteCharset, + $localCharset . '//IGNORE//TRANSLIT', + $word + ); + } + + return $word; + } + + /** + * Get the next word in queue as a stream. + * + * Get the next word in queue as a stream, after automatically decoding its + * length. + * + * @return resource The word, as a stream. + * @see close() + */ + public function getNextWordAsStream() + { + $filters = new T\FilterCollection(); + if (null !== ($remoteCharset = $this->getCharset(self::CHARSET_REMOTE)) + && null !== ($localCharset = $this->getCharset(self::CHARSET_LOCAL)) + ) { + $filters->append( + 'convert.iconv.' . + $remoteCharset . '.' . $localCharset . '//IGNORE//TRANSLIT' + ); + } + + if ($this->trans->isPersistent()) { + $old = $this->trans->lock(T\Stream::DIRECTION_RECEIVE); + $stream = $this->trans->receiveStream( + self::decodeLength($this->trans), + $filters, + 'stream word' + ); + $this->trans->lock($old, true); + } else { + $stream = $this->trans->receiveStream( + self::decodeLength($this->trans), + $filters, + 'stream word' + ); + } + + return $stream; + } + + /** + * Decodes the lenght of the incoming message. + * + * Decodes the lenght of the incoming message, as specified by the RouterOS + * API. + * + * @param T\Stream $trans The transmitter from which to decode the length of + * the incoming message. + * + * @return int The decoded length. + */ + public static function decodeLength(T\Stream $trans) + { + if ($trans->isPersistent() && $trans instanceof T\TcpClient) { + $old = $trans->lock($trans::DIRECTION_RECEIVE); + $length = self::_decodeLength($trans); + $trans->lock($old, true); + return $length; + } + return self::_decodeLength($trans); + } + + /** + * Decodes the lenght of the incoming message. + * + * Decodes the lenght of the incoming message, as specified by the RouterOS + * API. + * + * Difference with the non private function is that this one doesn't perform + * locking if the connection is a persistent one. + * + * @param T\Stream $trans The transmitter from which to decode the length of + * the incoming message. + * + * @return int The decoded length. + */ + private static function _decodeLength(T\Stream $trans) + { + $byte = ord($trans->receive(1, 'initial length byte')); + if ($byte & 0x80) { + if (($byte & 0xC0) === 0x80) { + return (($byte & 077) << 8 ) + ord($trans->receive(1)); + } elseif (($byte & 0xE0) === 0xC0) { + $rem = unpack('n~', $trans->receive(2)); + return (($byte & 037) << 16 ) + $rem['~']; + } elseif (($byte & 0xF0) === 0xE0) { + $rem = unpack('n~/C~~', $trans->receive(3)); + return (($byte & 017) << 24 ) + ($rem['~'] << 8) + $rem['~~']; + } elseif (($byte & 0xF8) === 0xF0) { + $rem = unpack('N~', $trans->receive(4)); + return (($byte & 007) * 0x100000000/* '<< 32' or '2^32' */) + + (double) sprintf('%u', $rem['~']); + } + throw new NotSupportedException( + 'Unknown control byte encountered.', + NotSupportedException::CODE_CONTROL_BYTE, + null, + $byte + ); + } else { + return $byte; + } + } + + /** + * Closes the opened connection, even if it is a persistent one. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function close() + { + return $this->trans->close(); + } +} diff --git a/PEAR2/Net/RouterOS/DataFlowException.php b/PEAR2/Net/RouterOS/DataFlowException.php new file mode 100644 index 0000000..2d7f279 --- /dev/null +++ b/PEAR2/Net/RouterOS/DataFlowException.php @@ -0,0 +1,44 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Base of this class. + */ +use RuntimeException; + +/** + * Exception thrown when the request/response cycle goes an unexpected way. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class DataFlowException extends RuntimeException implements Exception +{ + const CODE_INVALID_CREDENTIALS = 10000; + const CODE_TAG_REQUIRED = 10500; + const CODE_TAG_UNIQUE = 10501; + const CODE_UNKNOWN_REQUEST = 10900; + const CODE_CANCEL_FAIL = 11200; +} diff --git a/PEAR2/Net/RouterOS/Exception.php b/PEAR2/Net/RouterOS/Exception.php new file mode 100644 index 0000000..842f128 --- /dev/null +++ b/PEAR2/Net/RouterOS/Exception.php @@ -0,0 +1,34 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Generic exception class of this package. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +interface Exception +{ +} diff --git a/PEAR2/Net/RouterOS/InvalidArgumentException.php b/PEAR2/Net/RouterOS/InvalidArgumentException.php new file mode 100644 index 0000000..e0181da --- /dev/null +++ b/PEAR2/Net/RouterOS/InvalidArgumentException.php @@ -0,0 +1,43 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +use InvalidArgumentException as I; + +/** + * Exception thrown when there's something wrong with message arguments. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class InvalidArgumentException extends I implements Exception +{ + const CODE_SEEKABLE_REQUIRED = 1100; + const CODE_NAME_INVALID = 20100; + const CODE_ABSOLUTE_REQUIRED = 40200; + const CODE_CMD_UNRESOLVABLE = 40201; + const CODE_CMD_INVALID = 40202; + const CODE_NAME_UNPARSABLE = 41000; + const CODE_VALUE_UNPARSABLE = 41001; +} diff --git a/PEAR2/Net/RouterOS/LengthException.php b/PEAR2/Net/RouterOS/LengthException.php new file mode 100644 index 0000000..cd69adb --- /dev/null +++ b/PEAR2/Net/RouterOS/LengthException.php @@ -0,0 +1,93 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Base of this class. + */ +use LengthException as L; + +/** + * Exception thrown when there is a problem with a word's length. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class LengthException extends L implements Exception +{ + + const CODE_UNSUPPORTED = 1200; + const CODE_INVALID = 1300; + const CODE_BEYOND_SHEME = 1301; + + /** + * + * @var mixed The problematic length. + */ + private $_length; + + /** + * Creates a new LengthException. + * + * @param string $message The Exception message to throw. + * @param int $code The Exception code. + * @param \Exception $previous The previous exception used for the exception + * chaining. + * @param number $length The length. + */ + public function __construct( + $message, + $code = 0, + $previous = null, + $length = null + ) { + parent::__construct($message, $code, $previous); + $this->_length = $length; + } + + /** + * Gets the length. + * + * @return number The length. + */ + public function getLength() + { + return $this->_length; + } + + // @codeCoverageIgnoreStart + // String representation is not reliable in testing + + /** + * Returns a string representation of the exception. + * + * @return string The exception as a string. + */ + public function __toString() + { + return parent::__toString() . "\nLength:{$this->_length}"; + } + + // @codeCoverageIgnoreEnd +} diff --git a/PEAR2/Net/RouterOS/Message.php b/PEAR2/Net/RouterOS/Message.php new file mode 100644 index 0000000..8935b31 --- /dev/null +++ b/PEAR2/Net/RouterOS/Message.php @@ -0,0 +1,237 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Implements this interface. + */ +use Countable; + +/** + * Implements this interface. + */ +use IteratorAggregate; + +/** + * Requred for IteratorAggregate::getIterator() to work properly with foreach. + */ +use ArrayObject; + +/** + * Represents a RouterOS message. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +abstract class Message implements IteratorAggregate, Countable +{ + + /** + * @var array An array with message attributes. Each array key is the the + * name of an attribute, and the correspding array value is the value + * for that attribute. + */ + protected $attributes = array(); + + /** + * @var string An optional tag to associate the message with. + */ + private $_tag = null; + + /** + * A shorthand gateway. + * + * This is a magic PHP method that allows you to call the object as a + * function. Depending on the argument given, one of the other functions in + * the class is invoked and its returned value is returned by this function. + * + * @param string $name The name of an attribute to get the value of, or NULL + * to get the tag. + * + * @return string|resource The value of the specified attribute, + * or the tag if NULL is provided. + */ + public function __invoke($name = null) + { + if (null === $name) { + return $this->getTag(); + } + return $this->getAttribute($name); + } + + /** + * Sanitizes a name of an attribute (message or query one). + * + * @param mixed $name The name to sanitize. + * + * @return string The sanitized name. + */ + public static function sanitizeAttributeName($name) + { + $name = (string) $name; + if ((empty($name) && $name !== '0') + || preg_match('/[=\s]/s', $name) + ) { + throw new InvalidArgumentException( + 'Invalid name of argument supplied.', + InvalidArgumentException::CODE_NAME_INVALID + ); + } + return $name; + } + + /** + * Sanitizes a value of an attribute (message or query one). + * + * @param mixed $value The value to sanitize. + * + * @return string The sanitized value. + */ + public static function sanitizeAttributeValue($value) + { + if (Communicator::isSeekableStream($value)) { + return $value; + } else { + return (string) $value; + } + } + + /** + * Gets the tag that the message is associated with. + * + * @return string The current tag or NULL if there isn't a tag. + * @see setTag() + */ + public function getTag() + { + return $this->_tag; + } + + /** + * Sets the tag to associate the request with. + * + * Sets the tag to associate the message with. Setting NULL erases the + * currently set tag. + * + * @param string $tag The tag to set. + * + * @return $this The message object. + * @see getTag() + */ + protected function setTag($tag) + { + $this->_tag = (null === $tag) ? null : (string) $tag; + return $this; + } + + /** + * Gets the value of an attribute. + * + * @param string $name The name of the attribute. + * + * @return string|resource|null The value of the specified attribute. + * Returns NULL if such an attribute is not set. + * @see setAttribute() + */ + protected function getAttribute($name) + { + $name = self::sanitizeAttributeName($name); + if (array_key_exists($name, $this->attributes)) { + return $this->attributes[$name]; + } + return null; + } + + /** + * Gets all arguments in an array. + * + * @return ArrayObject An ArrayObject with the keys being argument names, + * and the array values being argument values. + * @see getArgument() + * @see setArgument() + */ + public function getIterator() + { + return new ArrayObject($this->attributes); + } + + /** + * Counts the number of arguments. + * + * @param int $mode The counter mode. + * Either COUNT_NORMAL or COUNT_RECURSIVE. + * When in normal mode, counts the number of arguments. + * When in recursive mode, counts the number of API words + * (including the empty word at the end). + * + * @return int The number of arguments/words. + */ + public function count($mode = COUNT_NORMAL) + { + $result = count($this->attributes); + if ($mode !== COUNT_NORMAL) { + $result += 2/*first+last word*/ + + (int)(null !== $this->getTag()); + } + return $result; + } + + /** + * Sets an attribute for the message. + * + * @param string $name Name of the attribute. + * @param string|resource|null $value Value of the attribute as a string or + * seekable stream. + * Setting the value to NULL removes an argument of this name. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * + * @return $this The message object. + * @see getArgument() + */ + protected function setAttribute($name, $value = '') + { + if (null === $value) { + unset($this->attributes[self::sanitizeAttributeName($name)]); + } else { + $this->attributes[self::sanitizeAttributeName($name)] + = self::sanitizeAttributeValue($value); + } + return $this; + } + + /** + * Removes all attributes from the message. + * + * @return $this The message object. + */ + protected function removeAllAttributes() + { + $this->attributes = array(); + return $this; + } +} diff --git a/PEAR2/Net/RouterOS/NotSupportedException.php b/PEAR2/Net/RouterOS/NotSupportedException.php new file mode 100644 index 0000000..2a7e309 --- /dev/null +++ b/PEAR2/Net/RouterOS/NotSupportedException.php @@ -0,0 +1,91 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Base of this class. + */ +use Exception as E; + +/** + * Exception thrown when encountering something not supported by RouterOS or + * this package. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class NotSupportedException extends E implements Exception +{ + + const CODE_CONTROL_BYTE = 1601; + + /** + * @var mixed The unsuppported value. + */ + private $_value; + + /** + * Creates a new NotSupportedException. + * + * @param string $message The Exception message to throw. + * @param int $code The Exception code. + * @param \Exception $previous The previous exception used for the exception + * chaining. + * @param mixed $value The unsupported value. + */ + public function __construct( + $message, + $code = 0, + $previous = null, + $value = null + ) { + parent::__construct($message, $code, $previous); + $this->_value = $value; + } + + /** + * Gets the unsupported value. + * + * @return mixed The unsupported value. + */ + public function getValue() + { + return $this->_value; + } + + // @codeCoverageIgnoreStart + // String representation is not reliable in testing + + /** + * Returns a string representation of the exception. + * + * @return string The exception as a string. + */ + public function __toString() + { + return parent::__toString() . "\nValue:{$this->_value}"; + } + + // @codeCoverageIgnoreEnd +} diff --git a/PEAR2/Net/RouterOS/Query.php b/PEAR2/Net/RouterOS/Query.php new file mode 100644 index 0000000..4e759aa --- /dev/null +++ b/PEAR2/Net/RouterOS/Query.php @@ -0,0 +1,267 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Refers to transmitter direction constants. + */ +use PEAR2\Net\Transmitter as T; + +/** + * Represents a query for RouterOS requests. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Query +{ + + /** + * Checks if the property exists. + */ + const OP_EX = ''; + + /** + * Checks if the property does not exist. + */ + const OP_NEX = '-'; + + /** + * Checks if the property equals a certain value. + */ + const OP_EQ = '='; + + /** + * Checks if the property is less than a certain value. + */ + const OP_LT = '<'; + + /** + * Checks if the property is greather than a certain value. + */ + const OP_GT = '>'; + + /** + * @var array An array of the words forming the query. Each value is an + * array with the first member being the predicate (operator and name), + * and the second member being the value for the predicate. + */ + protected $words = array(); + + /** + * This class is not to be instantiated normally, but by static methods + * instead. Use {@link static::where()} to create an instance of it. + */ + private function __construct() + { + + } + + /** + * Sanitizes the operator of a condition. + * + * @param string $operator The operator to sanitize. + * + * @return string The sanitized operator. + */ + protected static function sanitizeOperator($operator) + { + $operator = (string) $operator; + switch ($operator) { + case Query::OP_EX: + case Query::OP_NEX: + case Query::OP_EQ: + case Query::OP_LT: + case Query::OP_GT: + return $operator; + default: + throw new UnexpectedValueException( + 'Unknown operator specified', + UnexpectedValueException::CODE_ACTION_UNKNOWN, + null, + $operator + ); + } + } + + /** + * Creates a new query with an initial condition. + * + * @param string $name The name of the property to test. + * @param string|resource|null $value Value of the property as a string + * or seekable stream. Not required for existence tests. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * @param string $operator One of the OP_* constants. + * Describes the operation to perform. + * + * @return static A new query object. + */ + public static function where( + $name, + $value = null, + $operator = self::OP_EX + ) { + $query = new static; + return $query->addWhere($name, $value, $operator); + } + + /** + * Negates the query. + * + * @return $this The query object. + */ + public function not() + { + $this->words[] = array('#!', null); + return $this; + } + + /** + * Adds a condition as an alternative to the query. + * + * @param string $name The name of the property to test. + * @param string|resource|null $value Value of the property as a string + * or seekable stream. Not required for existence tests. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * @param string $operator One of the OP_* constants. + * Describes the operation to perform. + * + * @return $this The query object. + */ + public function orWhere($name, $value = null, $operator = self::OP_EX) + { + $this->addWhere($name, $value, $operator)->words[] = array('#|', null); + return $this; + } + + /** + * Adds a condition in addition to the query. + * + * @param string $name The name of the property to test. + * @param string|resource|null $value Value of the property as a string + * or seekable stream. Not required for existence tests. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * @param string $operator One of the OP_* constants. + * Describes the operation to perform. + * + * @return $this The query object. + */ + public function andWhere($name, $value = null, $operator = self::OP_EX) + { + $this->addWhere($name, $value, $operator)->words[] = array('#&', null); + return $this; + } + + /** + * Sends the query over a communicator. + * + * @param Communicator $com The communicator to send the query over. + * + * @return int The number of bytes sent. + */ + public function send(Communicator $com) + { + if ($com->getTransmitter()->isPersistent()) { + $old = $com->getTransmitter()->lock(T\Stream::DIRECTION_SEND); + $bytes = $this->_send($com); + $com->getTransmitter()->lock($old, true); + return $bytes; + } + return $this->_send($com); + } + + /** + * Sends the query over a communicator. + * + * The only difference with the non private equivalent is that this one does + * not do locking. + * + * @param Communicator $com The communicator to send the query over. + * + * @return int The number of bytes sent. + */ + private function _send(Communicator $com) + { + if (!$com->getTransmitter()->isAcceptingData()) { + throw new SocketException( + 'Transmitter is invalid. Sending aborted.', + SocketException::CODE_QUERY_SEND_FAIL + ); + } + $bytes = 0; + foreach ($this->words as $queryWord) { + list($predicate, $value) = $queryWord; + $prefix = '?' . $predicate; + if (null === $value) { + $bytes += $com->sendWord($prefix); + } else { + $prefix .= '='; + if (is_string($value)) { + $bytes += $com->sendWord($prefix . $value); + } else { + $bytes += $com->sendWordFromStream($prefix, $value); + } + } + } + return $bytes; + } + + /** + * Adds a condition. + * + * @param string $name The name of the property to test. + * @param string|resource|null $value Value of the property as a string + * or seekable stream. Not required for existence tests. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * @param string $operator One of the ACTION_* constants. + * Describes the operation to perform. + * + * @return $this The query object. + */ + protected function addWhere($name, $value, $operator) + { + $this->words[] = array( + static::sanitizeOperator($operator) + . Message::sanitizeAttributeName($name), + (null === $value ? null : Message::sanitizeAttributeValue($value)) + ); + return $this; + } +} diff --git a/PEAR2/Net/RouterOS/Registry.php b/PEAR2/Net/RouterOS/Registry.php new file mode 100644 index 0000000..30d2e75 --- /dev/null +++ b/PEAR2/Net/RouterOS/Registry.php @@ -0,0 +1,279 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Uses shared memory to keep responses in. + */ +use PEAR2\Cache\SHM; + +/** + * A RouterOS registry. + * + * Provides functionality for managing the request/response flow. Particularly + * useful in persistent connections. + * + * Note that this class is not meant to be called directly. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Registry +{ + /** + * @var SHM The storage. + */ + protected $shm; + + /** + * @var int ID of request. Populated at first instance in request. + */ + protected static $requestId = -1; + + /** + * @var int ID to be given to next instance, after incrementing it. + */ + protected static $instanceIdSeed = -1; + + /** + * @var int ID of instance within the request. + */ + protected $instanceId; + + /** + * Creates a registry. + * + * @param string $uri An URI to bind the registry to. + */ + public function __construct($uri) + { + $this->shm = SHM::factory(__CLASS__ . ' ' . $uri); + if (-1 === self::$requestId) { + self::$requestId = $this->shm->add('requestId', 0) + ? 0 : $this->shm->inc('requestId'); + } + $this->instanceId = ++self::$instanceIdSeed; + $this->shm->add('responseBuffer_' . $this->getOwnershipTag(), array()); + } + + /** + * Parses a tag. + * + * Parses a tag to reveal the ownership part of it, and the original tag. + * + * @param string $tag The tag (as received) to parse. + * + * @return array An array with the first member being the ownership tag, and + * the second one being the original tag. + */ + public static function parseTag($tag) + { + if (null === $tag) { + return array(null, null); + } + $result = explode('__', $tag, 2); + $result[0] .= '__'; + if ('' === $result[1]) { + $result[1] = null; + } + return $result; + } + + /** + * Checks if this instance is the tagless mode owner. + * + * @return bool TRUE if this instance is the tagless mode owner, FALSE + * otherwise. + */ + public function isTaglessModeOwner() + { + $this->shm->lock('taglessModeOwner'); + $result = $this->shm->exists('taglessModeOwner') + && $this->getOwnershipTag() === $this->shm->get('taglessModeOwner'); + $this->shm->unlock('taglessModeOwner'); + return $result; + } + + /** + * Sets the "tagless mode" setting. + * + * While in tagless mode, this instance will claim owhership of any + * responses without a tag. While not in this mode, any requests without a + * tag will be given to all instances. + * + * Regardless of mode, if the type of the response is + * {@link Response::TYPE_FATAL}, it will be given to all instances. + * + * @param bool $taglessMode TRUE to claim tagless ownership, FALSE to + * release such ownership, if taken. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setTaglessMode($taglessMode) + { + return $taglessMode + ? ($this->shm->lock('taglessMode') + && $this->shm->lock('taglessModeOwner') + && $this->shm->add('taglessModeOwner', $this->getOwnershipTag()) + && $this->shm->unlock('taglessModeOwner')) + : ($this->isTaglessModeOwner() + && $this->shm->lock('taglessModeOwner') + && $this->shm->delete('taglessModeOwner') + && $this->shm->unlock('taglessModeOwner') + && $this->shm->unlock('taglessMode')); + } + + /** + * Get the ownership tag for this instance. + * + * @return string The ownership tag for this registry instance. + */ + public function getOwnershipTag() + { + return self::$requestId . '_' . $this->instanceId . '__'; + } + + /** + * Add a response to the registry. + * + * @param Response $response The response to add. The caller of this + * function is responsible for ensuring that the ownership tag and the + * original tag are separated, so that only the original one remains in + * the response. + * @param string $ownershipTag The ownership tag that the response had. + * + * @return bool TRUE if the request was added to its buffer, FALSE if + * this instance owns the response, and therefore doesn't need to add + * the response to its buffer. + */ + public function add(Response $response, $ownershipTag) + { + if ($this->getOwnershipTag() === $ownershipTag + || ($this->isTaglessModeOwner() + && $response->getType() !== Response::TYPE_FATAL) + ) { + return false; + } + + if (null === $ownershipTag) { + $this->shm->lock('taglessModeOwner'); + if ($this->shm->exists('taglessModeOwner') + && $response->getType() !== Response::TYPE_FATAL + ) { + $ownershipTag = $this->shm->get('taglessModeOwner'); + $this->shm->unlock('taglessModeOwner'); + } else { + $this->shm->unlock('taglessModeOwner'); + foreach ($this->shm->getIterator( + '/^(responseBuffer\_)/', + true + ) as $targetBufferName) { + $this->_add($response, $targetBufferName); + } + return true; + } + } + + $this->_add($response, 'responseBuffer_' . $ownershipTag); + return true; + } + + /** + * Adds a response to a buffer. + * + * @param Response $response The response to add. + * @param string $targetBufferName The name of the buffer to add the + * response to. + * + * @return void + */ + private function _add(Response $response, $targetBufferName) + { + if ($this->shm->lock($targetBufferName)) { + $targetBuffer = $this->shm->get($targetBufferName); + $targetBuffer[] = $response; + $this->shm->set($targetBufferName, $targetBuffer); + $this->shm->unlock($targetBufferName); + } + } + + /** + * Gets the next response from this instance's buffer. + * + * @return Response|null The next response, or NULL if there isn't one. + */ + public function getNextResponse() + { + $response = null; + $targetBufferName = 'responseBuffer_' . $this->getOwnershipTag(); + if ($this->shm->exists($targetBufferName) + && $this->shm->lock($targetBufferName) + ) { + $targetBuffer = $this->shm->get($targetBufferName); + if (!empty($targetBuffer)) { + $response = array_shift($targetBuffer); + $this->shm->set($targetBufferName, $targetBuffer); + } + $this->shm->unlock($targetBufferName); + } + return $response; + } + + /** + * Closes the registry. + * + * Closes the registry, meaning that all buffers are cleared. + * + * @return void + */ + public function close() + { + self::$requestId = -1; + self::$instanceIdSeed = -1; + $this->shm->clear(); + } + + /** + * Removes a buffer. + * + * @param string $targetBufferName The buffer to remove. + * + * @return void + */ + private function _close($targetBufferName) + { + if ($this->shm->lock($targetBufferName)) { + $this->shm->delete($targetBufferName); + $this->shm->unlock($targetBufferName); + } + } + + /** + * Removes this instance's buffer. + */ + public function __destruct() + { + $this->_close('responseBuffer_' . $this->getOwnershipTag()); + } +} diff --git a/PEAR2/Net/RouterOS/Request.php b/PEAR2/Net/RouterOS/Request.php new file mode 100644 index 0000000..eeba12f --- /dev/null +++ b/PEAR2/Net/RouterOS/Request.php @@ -0,0 +1,403 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Refers to transmitter direction constants. + */ +use PEAR2\Net\Transmitter as T; + +/** + * Represents a RouterOS request. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Request extends Message +{ + + /** + * @var string The command to be executed. + */ + private $_command; + + /** + * @var Query A query for the command. + */ + private $_query; + + /** + * Creates a request to send to RouterOS. + * + * @param string $command The command to send. Can also contain arguments + * expressed in a shell-like syntax. + * @param Query $query A query to associate with the request. + * @param string $tag The tag for the request. + * + * @see setCommand() + * @see setArgument() + * @see setTag() + * @see setQuery() + */ + public function __construct($command, Query $query = null, $tag = null) + { + if (false !== strpos($command, '=') + && false !== ($spaceBeforeEquals = strrpos( + strstr($command, '=', true), + ' ' + )) + ) { + $this->parseArgumentString(substr($command, $spaceBeforeEquals)); + $command = rtrim(substr($command, 0, $spaceBeforeEquals)); + } + $this->setCommand($command); + $this->setQuery($query); + $this->setTag($tag); + } + + /** + * A shorthand gateway. + * + * This is a magic PHP method that allows you to call the object as a + * function. Depending on the argument given, one of the other functions in + * the class is invoked and its returned value is returned by this function. + * + * @param Query|Communicator|string|null $arg A {@link Query} to associate + * the request with, a {@link Communicator} to send the request over, + * an argument to get the value of, or NULL to get the tag. If a + * second argument is provided, this becomes the name of the argument to + * set the value of, and the second argument is the value to set. + * + * @return string|resource|int|$this Whatever the long form + * function returns. + */ + public function __invoke($arg = null) + { + if (func_num_args() > 1) { + return $this->setArgument(func_get_arg(0), func_get_arg(1)); + } + if ($arg instanceof Query) { + return $this->setQuery($arg); + } + if ($arg instanceof Communicator) { + return $this->send($arg); + } + return parent::__invoke($arg); + } + + /** + * Sets the command to send to RouterOS. + * + * Sets the command to send to RouterOS. The command can use the API or CLI + * syntax of RouterOS, but either way, it must be absolute (begin with a + * "/") and without arguments. + * + * @param string $command The command to send. + * + * @return $this The request object. + * @see getCommand() + * @see setArgument() + */ + public function setCommand($command) + { + $command = (string) $command; + if (strpos($command, '/') !== 0) { + throw new InvalidArgumentException( + 'Commands must be absolute.', + InvalidArgumentException::CODE_ABSOLUTE_REQUIRED + ); + } + if (substr_count($command, '/') === 1) { + //Command line syntax convertion + $cmdParts = preg_split('#[\s/]+#sm', $command); + $cmdRes = array($cmdParts[0]); + for ($i = 1, $n = count($cmdParts); $i < $n; $i++) { + if ('..' === $cmdParts[$i]) { + $delIndex = count($cmdRes) - 1; + if ($delIndex < 1) { + throw new InvalidArgumentException( + 'Unable to resolve command', + InvalidArgumentException::CODE_CMD_UNRESOLVABLE + ); + } + unset($cmdRes[$delIndex]); + $cmdRes = array_values($cmdRes); + } else { + $cmdRes[] = $cmdParts[$i]; + } + } + $command = implode('/', $cmdRes); + } + if (!preg_match('#^/\S+$#sm', $command)) { + throw new InvalidArgumentException( + 'Invalid command supplied.', + InvalidArgumentException::CODE_CMD_INVALID + ); + } + $this->_command = $command; + return $this; + } + + /** + * Gets the command that will be send to RouterOS. + * + * Gets the command that will be send to RouterOS in its API syntax. + * + * @return string The command to send. + * @see setCommand() + */ + public function getCommand() + { + return $this->_command; + } + + /** + * Sets the query to send with the command. + * + * @param Query $query The query to be set. Setting NULL will remove the + * currently associated query. + * + * @return $this The request object. + * @see getQuery() + */ + public function setQuery(Query $query = null) + { + $this->_query = $query; + return $this; + } + + /** + * Gets the currently associated query + * + * @return Query The currently associated query. + * @see setQuery() + */ + public function getQuery() + { + return $this->_query; + } + + /** + * Sets the tag to associate the request with. + * + * Sets the tag to associate the request with. Setting NULL erases the + * currently set tag. + * + * @param string $tag The tag to set. + * + * @return $this The request object. + * @see getTag() + */ + public function setTag($tag) + { + return parent::setTag($tag); + } + + /** + * Sets an argument for the request. + * + * @param string $name Name of the argument. + * @param string|resource|null $value Value of the argument as a string or + * seekable stream. + * Setting the value to NULL removes an argument of this name. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * + * @return $this The request object. + * @see getArgument() + */ + public function setArgument($name, $value = '') + { + return parent::setAttribute($name, $value); + } + + /** + * Gets the value of an argument. + * + * @param string $name The name of the argument. + * + * @return string|resource|null The value of the specified argument. + * Returns NULL if such an argument is not set. + * @see setAttribute() + */ + public function getArgument($name) + { + return parent::getAttribute($name); + } + + /** + * Removes all arguments from the request. + * + * @return $this The request object. + */ + public function removeAllArguments() + { + return parent::removeAllAttributes(); + } + + /** + * Sends a request over a communicator. + * + * @param Communicator $com The communicator to send the request over. + * @param Registry $reg An optional registry to sync the request with. + * + * @return int The number of bytes sent. + * @see Client::sendSync() + * @see Client::sendAsync() + */ + public function send(Communicator $com, Registry $reg = null) + { + if (null !== $reg + && (null != $this->getTag() || !$reg->isTaglessModeOwner()) + ) { + $originalTag = $this->getTag(); + $this->setTag($reg->getOwnershipTag() . $originalTag); + $bytes = $this->send($com); + $this->setTag($originalTag); + return $bytes; + } + if ($com->getTransmitter()->isPersistent()) { + $old = $com->getTransmitter()->lock(T\Stream::DIRECTION_SEND); + $bytes = $this->_send($com); + $com->getTransmitter()->lock($old, true); + return $bytes; + } + return $this->_send($com); + } + + /** + * Sends a request over a communicator. + * + * The only difference with the non private equivalent is that this one does + * not do locking. + * + * @param Communicator $com The communicator to send the request over. + * + * @return int The number of bytes sent. + * @see Client::sendSync() + * @see Client::sendAsync() + */ + private function _send(Communicator $com) + { + if (!$com->getTransmitter()->isAcceptingData()) { + throw new SocketException( + 'Transmitter is invalid. Sending aborted.', + SocketException::CODE_REQUEST_SEND_FAIL + ); + } + $bytes = 0; + $bytes += $com->sendWord($this->getCommand()); + if (null !== ($tag = $this->getTag())) { + $bytes += $com->sendWord('.tag=' . $tag); + } + foreach ($this->attributes as $name => $value) { + $prefix = '=' . $name . '='; + if (is_string($value)) { + $bytes += $com->sendWord($prefix . $value); + } else { + $bytes += $com->sendWordFromStream($prefix, $value); + } + } + $query = $this->getQuery(); + if ($query instanceof Query) { + $bytes += $query->send($com); + } + $bytes += $com->sendWord(''); + return $bytes; + } + + /** + * Parses the arguments of a command. + * + * @param string $string The argument string to parse. + * + * @return void + */ + protected function parseArgumentString($string) + { + /* + * Grammar: + * + * := (<<\s+>>, )*, + * := , ? + * := <<[^\=\s]+>> + * := "=", ( | ) + * := <<">>, <<([^"]|\\"|\\\\)*>>, <<">> + * := <<\S+>> + */ + + $token = ''; + $name = null; + while ($string = substr($string, strlen($token))) { + if (null === $name) { + if (preg_match('/^\s+([^\s=]+)/sS', $string, $matches)) { + $token = $matches[0]; + $name = $matches[1]; + } else { + throw new InvalidArgumentException( + "Parsing of argument name failed near '{$string}'", + InvalidArgumentException::CODE_NAME_UNPARSABLE + ); + } + } elseif (preg_match('/^\s/s', $string, $matches)) { + //Empty argument + $token = ''; + $this->setArgument($name); + $name = null; + } elseif (preg_match( + '/^="(([^\\\"]|\\\"|\\\\)*)"/sS', + $string, + $matches + )) { + $token = $matches[0]; + $this->setArgument( + $name, + str_replace( + array('\\"', '\\\\'), + array('"', '\\'), + $matches[1] + ) + ); + $name = null; + } elseif (preg_match('/^=(\S+)/sS', $string, $matches)) { + $token = $matches[0]; + $this->setArgument($name, $matches[1]); + $name = null; + } else { + throw new InvalidArgumentException( + "Parsing of argument value failed near '{$string}'", + InvalidArgumentException::CODE_VALUE_UNPARSABLE + ); + } + } + + if (null !== $name && ('' !== ($name = trim($name)))) { + $this->setArgument($name, ''); + } + + } +} diff --git a/PEAR2/Net/RouterOS/Response.php b/PEAR2/Net/RouterOS/Response.php new file mode 100644 index 0000000..c5fd414 --- /dev/null +++ b/PEAR2/Net/RouterOS/Response.php @@ -0,0 +1,335 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Refers to transmitter direction constants. + */ +use PEAR2\Net\Transmitter as T; + +/** + * Locks are released upon any exception from anywhere. + */ +use Exception as E; + +/** + * Represents a RouterOS response. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Response extends Message +{ + + /** + * The last response for a request. + */ + const TYPE_FINAL = '!done'; + + /** + * A response with data. + */ + const TYPE_DATA = '!re'; + + /** + * A response signifying error. + */ + const TYPE_ERROR = '!trap'; + + /** + * A response signifying a fatal error, due to which the connection would be + * terminated. + */ + const TYPE_FATAL = '!fatal'; + + /** + * @var array An array of unrecognized words in network order. + */ + protected $unrecognizedWords = array(); + + /** + * @var string The response type. + */ + private $_type; + + /** + * Extracts a new response from a communicator. + * + * @param Communicator $com The communicator from which to extract + * the new response. + * @param bool $asStream Whether to populate the argument values + * with streams instead of strings. + * @param int $sTimeout If a response is not immediatly + * available, wait this many seconds. If NULL, wait indefinetly. + * @param int $usTimeout Microseconds to add to the waiting time. + * @param Registry $reg An optional registry to sync the + * response with. + * + * @see getType() + * @see getArgument() + */ + public function __construct( + Communicator $com, + $asStream = false, + $sTimeout = 0, + $usTimeout = null, + Registry $reg = null + ) { + if (null === $reg) { + if ($com->getTransmitter()->isPersistent()) { + $old = $com->getTransmitter() + ->lock(T\Stream::DIRECTION_RECEIVE); + try { + $this->_receive($com, $asStream, $sTimeout, $usTimeout); + } catch (E $e) { + $com->getTransmitter()->lock($old, true); + throw $e; + } + $com->getTransmitter()->lock($old, true); + } else { + $this->_receive($com, $asStream, $sTimeout, $usTimeout); + } + } else { + while (null === ($response = $reg->getNextResponse())) { + $newResponse = new self($com, true, $sTimeout, $usTimeout); + $tagInfo = $reg::parseTag($newResponse->getTag()); + $newResponse->setTag($tagInfo[1]); + if (!$reg->add($newResponse, $tagInfo[0])) { + $response = $newResponse; + break; + } + } + + $this->_type = $response->_type; + $this->attributes = $response->attributes; + $this->unrecognizedWords = $response->unrecognizedWords; + $this->setTag($response->getTag()); + + if (!$asStream) { + foreach ($this->attributes as $name => $value) { + $this->setAttribute( + $name, + stream_get_contents($value) + ); + } + foreach ($response->unrecognizedWords as $i => $value) { + $this->unrecognizedWords[$i] = stream_get_contents($value); + } + } + } + } + + /** + * Extracts a new response from a communicator. + * + * This is the function that performs the actual receiving, while the + * constructor is also involved in locks and registry sync. + * + * @param Communicator $com The communicator from which to extract + * the new response. + * @param bool $asStream Whether to populate the argument values + * with streams instead of strings. + * @param int $sTimeout If a response is not immediatly + * available, wait this many seconds. If NULL, wait indefinetly. + * Note that if an empty sentence is received, the timeout will be + * reset for another sentence receiving. + * @param int $usTimeout Microseconds to add to the waiting time. + * + * @return void + */ + private function _receive( + Communicator $com, + $asStream = false, + $sTimeout = 0, + $usTimeout = null + ) { + do { + if (!$com->getTransmitter()->isDataAwaiting( + $sTimeout, + $usTimeout + )) { + throw new SocketException( + 'No data within the time limit', + SocketException::CODE_NO_DATA + ); + } + $type = $com->getNextWord(); + } while ('' === $type); + $this->setType($type); + if ($asStream) { + for ($word = $com->getNextWordAsStream(), fseek($word, 0, SEEK_END); + ftell($word) !== 0; + $word = $com->getNextWordAsStream(), fseek( + $word, + 0, + SEEK_END + )) { + rewind($word); + $ind = fread($word, 1); + if ('=' === $ind || '.' === $ind) { + $prefix = stream_get_line($word, null, '='); + } + if ('=' === $ind) { + $value = fopen('php://temp', 'r+b'); + $bytesCopied = ftell($word); + while (!feof($word)) { + $bytesCopied += stream_copy_to_stream( + $word, + $value, + 0xFFFFF, + $bytesCopied + ); + } + rewind($value); + $this->setAttribute($prefix, $value); + continue; + } + if ('.' === $ind && 'tag' === $prefix) { + $this->setTag(stream_get_contents($word, -1, -1)); + continue; + } + rewind($word); + $this->unrecognizedWords[] = $word; + } + } else { + for ($word = $com->getNextWord(); '' !== $word; + $word = $com->getNextWord()) { + if (preg_match('/^=([^=]+)=(.*)$/sS', $word, $matches)) { + $this->setAttribute($matches[1], $matches[2]); + } elseif (preg_match('/^\.tag=(.*)$/sS', $word, $matches)) { + $this->setTag($matches[1]); + } else { + $this->unrecognizedWords[] = $word; + } + } + } + } + + /** + * Sets the response type. + * + * Sets the response type. Valid values are the TYPE_* constants. + * + * @param string $type The new response type. + * + * @return $this The response object. + * @see getType() + */ + protected function setType($type) + { + switch ($type) { + case self::TYPE_FINAL: + case self::TYPE_DATA: + case self::TYPE_ERROR: + case self::TYPE_FATAL: + $this->_type = $type; + return $this; + default: + throw new UnexpectedValueException( + 'Unrecognized response type.', + UnexpectedValueException::CODE_RESPONSE_TYPE_UNKNOWN, + null, + $type + ); + } + } + + /** + * Gets the response type. + * + * @return string The response type. + * @see setType() + */ + public function getType() + { + return $this->_type; + } + + /** + * Gets the value of an argument. + * + * @param string $name The name of the argument. + * + * @return string|resource|null The value of the specified argument. + * Returns NULL if such an argument is not set. + * @deprecated 1.0.0b5 Use {@link static::getProperty()} instead. + * This method will be removed upon final release, and is currently + * left standing merely because it can't be easily search&replaced in + * existing code, due to the fact the name "getArgument()" is shared + * with {@link Request::getArgument()}, which is still valid. + * @codeCoverageIgnore + */ + public function getArgument($name) + { + trigger_error( + 'Response::getArgument() is deprecated in favor of ' . + 'Response::getProperty() (but note that Request::getArgument() ' . + 'is still valid)', + E_USER_DEPRECATED + ); + return $this->getAttribute($name); + } + + /** + * Gets the value of a property. + * + * @param string $name The name of the property. + * + * @return string|resource|null The value of the specified property. + * Returns NULL if such a property is not set. + */ + public function getProperty($name) + { + return parent::getAttribute($name); + } + + /** + * Gets a list of unrecognized words. + * + * @return array The list of unrecognized words. + */ + public function getUnrecognizedWords() + { + return $this->unrecognizedWords; + } + + /** + * Counts the number of arguments or words. + * + * @param int $mode The counter mode. + * Either COUNT_NORMAL or COUNT_RECURSIVE. + * When in normal mode, counts the number of arguments. + * When in recursive mode, counts the number of API words. + * + * @return int The number of arguments/words. + */ + public function count($mode = COUNT_NORMAL) + { + $result = parent::count($mode); + if ($mode !== COUNT_NORMAL) { + $result += count($this->unrecognizedWords); + } + return $result; + } +} diff --git a/PEAR2/Net/RouterOS/ResponseCollection.php b/PEAR2/Net/RouterOS/ResponseCollection.php new file mode 100644 index 0000000..9b27575 --- /dev/null +++ b/PEAR2/Net/RouterOS/ResponseCollection.php @@ -0,0 +1,569 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Implemented by this class. + */ +use ArrayAccess; + +/** + * Implemented by this class. + */ +use Countable; + +/** + * Implemented by this class. + */ +use SeekableIterator; + +/** + * Represents a collection of RouterOS responses. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + * + * @method string getType() + * Calls {@link Response::getType()} + * on the response pointed by the pointer. + * @method string[] getUnrecognizedWords() + * Calls {@link Response::getUnrecognizedWords()} + * on the response pointed by the pointer. + * @method string|resource|null getProperty(string $name) + * Calls {@link Response::getProperty()} + * on the response pointed by the pointer. + * @method string getTag() + * Calls {@link Response::getTag()} + * on the response pointed by the pointer. + */ +class ResponseCollection implements ArrayAccess, SeekableIterator, Countable +{ + + /** + * @var array An array with all {@link Response} objects. + */ + protected $responses = array(); + + /** + * @var array An array with each {@link Response} object's type. + */ + protected $responseTypes = array(); + + /** + * @var array An array with each {@link Response} object's tag. + */ + protected $responseTags = array(); + + /** + * @var array An array with positions of responses, based on an property + * name. The name of each property is the array key, and the array value + * is another array where the key is the value for that property, and + * the value is the posistion of the response. For performance reasons, + * each key is built only when {@link static::setIndex()} is called with + * that property, and remains available for the lifetime of this + * collection. + */ + protected $responsesIndex = array(); + + /** + * @var array An array with all distinct properties across all + * {@link Response} objects. Created at the first call of + * {@link static::getPropertyMap()}. + */ + protected $propertyMap = null; + + /** + * @var int A pointer, as required by SeekableIterator. + */ + protected $position = 0; + + /** + * @var string|null Name of property to use as index. NULL when disabled. + */ + protected $index = null; + + /** + * @var array Criterias used by {@link compare()} to determine the order + * between two respones. See {@link orderBy()} for a detailed + * description of this array's format. + */ + protected $compareBy = array(); + + /** + * Creates a new collection. + * + * @param array $responses An array of responses, in network order. + */ + public function __construct(array $responses) + { + $pos = 0; + foreach ($responses as $response) { + if ($response instanceof Response) { + $this->responseTypes[$pos] = $response->getType(); + $this->responseTags[$pos] = $response->getTag(); + $this->responses[$pos++] = $response; + } + } + } + + /** + * A shorthand gateway. + * + * This is a magic PHP method that allows you to call the object as a + * function. Depending on the argument given, one of the other functions in + * the class is invoked and its returned value is returned by this function. + * + * @param int|string|null $offset The offset of the response to seek to. + * If the offset is negative, seek to that relative to the end. + * If the collection is indexed, you can also supply a value to seek to. + * Setting NULL will get the current response's interator. + * + * @return Response|ArrayObject The {@link Response} at the specified + * offset, the current response's iterator (which is an ArrayObject) + * when NULL is given, or FALSE if the offset is invalid + * or the collection is empty. + */ + public function __invoke($offset = null) + { + return null === $offset + ? $this->current()->getIterator() + : $this->seek($offset); + } + + /** + * Sets a property to be usable as a key in the collection. + * + * @param string|null $name The name of the property to use. Future calls + * that accept a position will then also be able to search values of + * that property for a matching value. + * Specifying NULL will disable such lookups (as is by default). + * Note that in case this value occures multiple times within the + * collection, only the last matching response will be accessible by + * that value. + * + * @return $this The object itself. + */ + public function setIndex($name) + { + if (null !== $name) { + $name = (string)$name; + if (!isset($this->responsesIndex[$name])) { + $this->responsesIndex[$name] = array(); + foreach ($this->responses as $pos => $response) { + $val = $response->getProperty($name); + if (null !== $val) { + $this->responsesIndex[$name][$val] = $pos; + } + } + } + } + $this->index = $name; + return $this; + } + + /** + * Gets the name of the property used as an index. + * + * @return string|null Name of property used as index. NULL when disabled. + */ + public function getIndex() + { + return $this->index; + } + + /** + * Gets the whole collection as an array. + * + * @param bool $useIndex Whether to use the index values as keys for the + * resulting array. + * + * @return array An array with all responses, in network order. + */ + public function toArray($useIndex = false) + { + if ($useIndex) { + $positions = $this->responsesIndex[$this->index]; + asort($positions, SORT_NUMERIC); + $positions = array_flip($positions); + return array_combine( + $positions, + array_intersect_key($this->responses, $positions) + ); + } + return $this->responses; + } + + /** + * Counts the responses/words in the collection. + * + * @param int $mode The counter mode. + * Either COUNT_NORMAL or COUNT_RECURSIVE. + * When in normal mode, counts the number of responses. + * When in recursive mode, counts the total number of API words. + * + * @return int The number of responses in the collection. + */ + public function count($mode = COUNT_NORMAL) + { + if ($mode !== COUNT_NORMAL) { + $result = 0; + foreach ($this->responses as $response) { + $result += $response->count($mode); + } + return $result; + } else { + return count($this->responses); + } + } + + /** + * Checks if an offset exists. + * + * @param int|string $offset The offset to check. If the + * collection is indexed, you can also supply a value to check. + * Note that negative numeric offsets are NOT accepted. + * + * @return bool TRUE if the offset exists, FALSE otherwise. + */ + public function offsetExists($offset) + { + return is_int($offset) + ? array_key_exists($offset, $this->responses) + : array_key_exists($offset, $this->responsesIndex[$this->index]); + } + + /** + * Gets a {@link Response} from a specified offset. + * + * @param int|string $offset The offset of the desired response. If the + * collection is indexed, you can also supply the value to search for. + * + * @return Response The response at the specified offset. + */ + public function offsetGet($offset) + { + return is_int($offset) + ? $this->responses[$offset >= 0 + ? $offset + : count($this->responses) + $offset] + : $this->responses[$this->responsesIndex[$this->index][$offset]]; + } + + /** + * N/A + * + * This method exists only because it is required for ArrayAccess. The + * collection is read only. + * + * @param int|string $offset N/A + * @param Response $value N/A + * + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function offsetSet($offset, $value) + { + + } + + /** + * N/A + * + * This method exists only because it is required for ArrayAccess. The + * collection is read only. + * + * @param int|string $offset N/A + * + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function offsetUnset($offset) + { + + } + + /** + * Resets the pointer to 0, and returns the first response. + * + * @return Response The first response in the collection, or FALSE if the + * collection is empty. + */ + public function rewind() + { + return $this->seek(0); + } + + /** + * Moves the position pointer to a specified position. + * + * @param int|string $position The position to move to. If the collection is + * indexed, you can also supply a value to move the pointer to. + * A non-existent index will move the pointer to "-1". + * + * @return Response The {@link Response} at the specified position, or FALSE + * if the specified position is not valid. + */ + public function seek($position) + { + $this->position = is_int($position) + ? ($position >= 0 + ? $position + : count($this->responses) + $position) + : ($this->offsetExists($position) + ? $this->responsesIndex[$this->index][$position] + : -1); + return $this->current(); + } + + /** + * Moves the pointer forward by 1, and gets the next response. + * + * @return Response The next {@link Response} object, or FALSE if the + * position is not valid. + */ + public function next() + { + ++$this->position; + return $this->current(); + } + + /** + * Gets the response at the current pointer position. + * + * @return Response The response at the current pointer position, or FALSE + * if the position is not valid. + */ + public function current() + { + return $this->valid() ? $this->responses[$this->position] : false; + } + + /** + * Moves the pointer backwards by 1, and gets the previous response. + * + * @return Response The next {@link Response} object, or FALSE if the + * position is not valid. + */ + public function prev() + { + --$this->position; + return $this->current(); + } + + /** + * Moves the pointer to the last valid position, and returns the last + * response. + * + * @return Response The last response in the collection, or FALSE if the + * collection is empty. + */ + public function end() + { + $this->position = count($this->responses) - 1; + return $this->current(); + } + + /** + * Gets the key at the current pointer position. + * + * @return int The key at the current pointer position, i.e. the pointer + * position itself, or FALSE if the position is not valid. + */ + public function key() + { + return $this->valid() ? $this->position : false; + } + + /** + * Checks if the pointer is still pointing to an existing offset. + * + * @return bool TRUE if the pointer is valid, FALSE otherwise. + */ + public function valid() + { + return $this->offsetExists($this->position); + } + + /** + * Gets all distinct property names. + * + * Gets all distinct property names across all responses. + * + * @return array An array with all distinct property names as keys, and the + * indexes at which they occur as values. + */ + public function getPropertyMap() + { + if (null === $this->propertyMap) { + $properties = array(); + foreach ($this->responses as $index => $response) { + $names = array_keys($response->getIterator()->getArrayCopy()); + foreach ($names as $name) { + if (!isset($properties[$name])) { + $properties[$name] = array(); + } + $properties[$name][] = $index; + } + } + $this->propertyMap = $properties; + } + return $this->propertyMap; + } + + /** + * Gets all responses of a specified type. + * + * @param string $type The response type to filter by. Valid values are the + * Response::TYPE_* constants. + * + * @return static A new collection with responses of the + * specified type. + */ + public function getAllOfType($type) + { + $result = array(); + foreach (array_keys($this->responseTypes, $type, true) as $index) { + $result[] = $this->responses[$index]; + } + return new static($result); + } + + /** + * Gets all responses with a specified tag. + * + * @param string $tag The tag to filter by. + * + * @return static A new collection with responses having the + * specified tag. + */ + public function getAllTagged($tag) + { + $result = array(); + foreach (array_keys($this->responseTags, $tag, true) as $index) { + $result[] = $this->responses[$index]; + } + return new static($result); + } + + /** + * Order resones by criteria. + * + * @param mixed[] $criteria The criteria to order respones by. It takes the + * form of an array where each key is the name of the property to use + * as (N+1)th sorting key. The value of each member can be either NULL + * (for that property, sort normally in ascending order), a single sort + * order constant (SORT_ASC or SORT_DESC) to sort normally in the + * specified order, an array where the first member is an order + * constant, and the second one is sorting flags (same as built in PHP + * array functions) or a callback. + * If a callback is provided, it must accept two arguments + * (the two values to be compared), and return -1, 0 or 1 if the first + * value is respectively less than, equal to or greather than the second + * one. + * Each key of $criteria can also be numeric, in which case the + * value is the name of the property, and sorting is done normally in + * ascending order. + * + * @return static A new collection with the responses sorted in the + * specified order. + */ + public function orderBy(array $criteria) + { + $this->compareBy = $criteria; + $sortedResponses = $this->responses; + usort($sortedResponses, array($this, 'compare')); + return new static($sortedResponses); + } + + /** + * Calls a method of the response pointed by the pointer. + * + * Calls a method of the response pointed by the pointer. This is a magic + * PHP method, thanks to which any function you call on the collection that + * is not defined will be redirected to the response. + * + * @param string $method The name of the method to call. + * @param array $args The arguments to pass to the method. + * + * @return mixed Whatever the called function returns. + */ + public function __call($method, array $args) + { + return call_user_func_array( + array($this->current(), $method), + $args + ); + } + + /** + * Compares two respones. + * + * Compares two respones, based on criteria defined in + * {@link static::$compareBy}. + * + * @param Response $itemA The response to compare. + * @param Response $itemB The response to compare $a against. + * + * @return int Returns 0 if the two respones are equal according to every + * criteria specified, -1 if $a should be placed before $b, and 1 if $b + * should be placed before $a. + */ + protected function compare(Response $itemA, Response $itemB) + { + foreach ($this->compareBy as $name => $spec) { + if (!is_string($name)) { + $name = $spec; + $spec = null; + } + + $members = array( + 0 => $itemA->getProperty($name), + 1 => $itemB->getProperty($name) + ); + + if (is_callable($spec)) { + uasort($members, $spec); + } elseif ($members[0] === $members[1]) { + continue; + } else { + $flags = SORT_REGULAR; + $order = SORT_ASC; + if (is_array($spec)) { + list($order, $flags) = $spec; + } elseif (null !== $spec) { + $order = $spec; + } + + if (SORT_ASC === $order) { + asort($members, $flags); + } else { + arsort($members, $flags); + } + } + return (key($members) === 0) ? -1 : 1; + } + + return 0; + } +} diff --git a/PEAR2/Net/RouterOS/SocketException.php b/PEAR2/Net/RouterOS/SocketException.php new file mode 100644 index 0000000..0beb740 --- /dev/null +++ b/PEAR2/Net/RouterOS/SocketException.php @@ -0,0 +1,44 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Base of this class. + */ +use RuntimeException; + +/** + * Exception thrown when something goes wrong with the connection. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class SocketException extends RuntimeException implements Exception +{ + const CODE_SERVICE_INCOMPATIBLE = 10200; + const CODE_CONNECTION_FAIL = 100; + const CODE_QUERY_SEND_FAIL = 30600; + const CODE_REQUEST_SEND_FAIL = 40900; + const CODE_NO_DATA = 50000; +} diff --git a/PEAR2/Net/RouterOS/UnexpectedValueException.php b/PEAR2/Net/RouterOS/UnexpectedValueException.php new file mode 100644 index 0000000..b09ce5c --- /dev/null +++ b/PEAR2/Net/RouterOS/UnexpectedValueException.php @@ -0,0 +1,88 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +use UnexpectedValueException as U; + +/** + * Exception thrown when encountering an invalid value in a function argument. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class UnexpectedValueException extends U implements Exception +{ + const CODE_CALLBACK_INVALID = 10502; + const CODE_ACTION_UNKNOWN = 30100; + const CODE_RESPONSE_TYPE_UNKNOWN = 50100; + + /** + * @var mixed The unexpected value. + */ + private $_value; + + /** + * Creates a new UnexpectedValueException. + * + * @param string $message The Exception message to throw. + * @param int $code The Exception code. + * @param \Exception $previous The previous exception used for the exception + * chaining. + * @param mixed $value The unexpected value. + */ + public function __construct( + $message, + $code = 0, + $previous = null, + $value = null + ) { + parent::__construct($message, $code, $previous); + $this->_value = $value; + } + + /** + * Gets the unexpected value. + * + * @return mixed The unexpected value. + */ + public function getValue() + { + return $this->_value; + } + + // @codeCoverageIgnoreStart + // String representation is not reliable in testing + + /** + * Returns a string representation of the exception. + * + * @return string The exception as a string. + */ + public function __toString() + { + return parent::__toString() . "\nValue:{$this->_value}"; + } + + // @codeCoverageIgnoreEnd +} diff --git a/PEAR2/Net/RouterOS/Util.php b/PEAR2/Net/RouterOS/Util.php new file mode 100644 index 0000000..8222980 --- /dev/null +++ b/PEAR2/Net/RouterOS/Util.php @@ -0,0 +1,1177 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0b5 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\RouterOS; + +/** + * Values at {@link Util::exec()} can be casted from this type. + */ +use DateTime; + +/** + * Values at {@link Util::exec()} can be casted from this type. + */ +use DateInterval; + +/** + * Implemented by this class. + */ +use Countable; + +/** + * Used to reliably write to streams at {@link static::prepareScript()}. + */ +use PEAR2\Net\Transmitter\Stream; + +/** + * Utility class. + * + * Abstracts away frequently used functionality (particularly CRUD operations) + * in convinient to use methods by wrapping around a connection. + * + * @category Net + * @package PEAR2_Net_RouterOS + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_RouterOS + */ +class Util implements Countable +{ + /** + * @var Client The connection to wrap around. + */ + protected $client; + + /** + * @var string The current menu. + */ + protected $menu = '/'; + + /** + * @var array|null An array with the numbers of items in the current menu as + * keys, and the corresponding IDs as values. NULL when the cache needs + * regenerating. + */ + protected $idCache = null; + + /** + * Parses a value from a RouterOS scripting context. + * + * Turns a value from RouterOS into an equivalent PHP value, based on + * determining the type in the same way RouterOS would determine it for a + * literal. + * + * This method is intended to be the very opposite of + * {@link static::escapeValue()}. hat is, results from that method, if + * given to this method, should produce equivalent results. + * + * @param string $value The value to be parsed. Must be a literal of a + * value, e.g. what {@link static::escapeValue()} will give you. + * + * @return mixed Depending on RouterOS type detected: + * - "nil" or "nothing" - NULL. + * - "number" - int or double for large values. + * - "bool" - a boolean. + * - "time" - a {@link DateInterval} object. + * - "array" - an array, with the values processed recursively. + * - "str" - a string. + * - Unrecognized type - treated as an unquoted string. + */ + public static function parseValue($value) + { + $value = (string)$value; + + if (in_array($value, array('', 'nil'), true)) { + return null; + } elseif (in_array($value, array('true', 'false', 'yes', 'no'), true)) { + return $value === 'true' || $value === 'yes'; + } elseif ($value === (string)($num = (int)$value) + || $value === (string)($num = (double)$value) + ) { + return $num; + } elseif (preg_match( + '/^ + (?:(\d+)w)? + (?:(\d+)d)? + (?:(\d\d)\:)? + (\d\d)\: + (\d\d(:\.\d{1,6})?) + $/x', + $value, + $time + )) { + $days = isset($time[2]) ? (int)$time[2] : 0; + if (isset($time[1])) { + $days += 7 * (int)$time[1]; + } + if ('' === $time[3]) { + $time[3] = 0; + } + return new DateInterval( + "P{$days}DT{$time[3]}H{$time[4]}M{$time[5]}S" + ); + } elseif (('"' === $value[0]) && substr(strrev($value), 0, 1) === '"') { + return str_replace( + array('\"', '\\\\', "\\\n", "\\\r\n", "\\\r"), + array('"', '\\'), + substr($value, 1, -1) + ); + } elseif ('{' === $value[0]) { + $len = strlen($value); + if ($value[$len - 1] === '}') { + $value = substr($value, 1, -1); + if ('' === $value) { + return array(); + } + $parsedValue = preg_split( + '/ + (\"(?:\\\\\\\\|\\\\"|[^"])*\") + | + (\{[^{}]*(?2)?\}) + | + ([^;=]+) + /sx', + $value, + null, + PREG_SPLIT_DELIM_CAPTURE + ); + $result = array(); + $newVal = null; + $newKey = null; + for ($i = 0, $l = count($parsedValue); $i < $l; ++$i) { + switch ($parsedValue[$i]) { + case '': + break; + case ';': + if (null === $newKey) { + $result[] = $newVal; + } else { + $result[$newKey] = $newVal; + } + $newKey = $newVal = null; + break; + case '=': + $newKey = static::parseValue($parsedValue[$i - 1]); + $newVal = static::parseValue($parsedValue[++$i]); + break; + default: + $newVal = static::parseValue($parsedValue[$i]); + } + } + if (null === $newKey) { + $result[] = $newVal; + } else { + $result[$newKey] = $newVal; + } + return $result; + } + } + return $value; + } + + /** + * Prepares a script. + * + * Prepares a script for eventual execution by prepending parameters as + * variables to it. + * + * This is particularly useful when you're creating scripts that you don't + * want to execute right now (as with {@link static::exec()}, but instead + * you want to store it for later execution, perhaps by supplying it to + * "/system scheduler". + * + * @param string|resource $source The source of the script, as a string + * or stream. If a stream is provided, reading starts from the current + * position to the end of the stream, and the pointer stays at the end + * after reading is done. + * @param array $params An array of parameters to make available + * in the script as local variables. + * Variable names are array keys, and variable values are array values. + * Array values are automatically processed with + * {@link static::escapeValue()}. Streams are also supported, and are + * processed in chunks, each with + * {@link static::escapeString()}. Processing starts from the current + * position to the end of the stream, and the stream's pointer stays at + * the end after reading is done. + * + * @return resource A new PHP temporary stream with the script as contents, + * with the pointer back at the start. + * @see static::appendScript() + */ + public static function prepareScript( + $source, + array $params = array() + ) { + $resultStream = fopen('php://temp', 'r+b'); + self::appendScript($resultStream, $source, $params); + rewind($resultStream); + return $resultStream; + } + + /** + * Appends a script. + * + * Appends a script to an existing stream. + * + * @param resource $stream An existing stream to write the resulting + * script to. + * @param string|resource $source The source of the script, as a string + * or stream. If a stream is provided, reading starts from the current + * position to the end of the stream, and the pointer stays at the end + * after reading is done. + * @param array $params An array of parameters to make available + * in the script as local variables. + * Variable names are array keys, and variable values are array values. + * Array values are automatically processed with + * {@link static::escapeValue()}. Streams are also supported, and are + * processed in chunks, each with + * {@link static::escapeString()}. Processing starts from the current + * position to the end of the stream, and the stream's pointer stays at + * the end after reading is done. + * + * @return int The number of bytes written to $stream is returned, + * and the pointer remains where it was after the write + * (i.e. it is not seeked back, even if seeking is supported). + */ + public static function appendScript( + $stream, + $source, + array $params = array() + ) { + $writer = new Stream($stream, false); + $bytes = 0; + + foreach ($params as $pname => $pvalue) { + $pname = static::escapeString($pname); + $bytes += $writer->send(":local \"{$pname}\" "); + if (Stream::isStream($pvalue)) { + $reader = new Stream($pvalue, false); + $chunkSize = $reader->getChunk(Stream::DIRECTION_RECEIVE); + $bytes += $writer->send('"'); + while ($reader->isAvailable() && $reader->isDataAwaiting()) { + $bytes += $writer->send( + static::escapeString(fread($pvalue, $chunkSize)) + ); + } + $bytes += $writer->send("\";\n"); + } else { + $bytes += $writer->send(static::escapeValue($pvalue) . ";\n"); + } + } + + $bytes += $writer->send($source); + return $bytes; + } + + /** + * Escapes a value for a RouterOS scripting context. + * + * Turns any native PHP value into an equivalent whole value that can be + * inserted as part of a RouterOS script. + * + * DateTime and DateInterval objects will be casted to RouterOS' "time" + * type. A DateTime object will be converted to a time relative to the UNIX + * epoch time. Note that if a DateInterval does not have the "days" property + * ("a" in formatting), then its months and years will be ignored, because + * they can't be unambigiously converted to a "time" value. + * + * Unrecognized types (i.e. resources and other objects) are casted to + * strings. + * + * @param mixed $value The value to be escaped. + * + * @return string A string representation that can be directly inserted in a + * script as a whole value. + */ + public static function escapeValue($value) + { + switch(gettype($value)) { + case 'NULL': + $value = ''; + break; + case 'integer': + $value = (string)$value; + break; + case 'boolean': + $value = $value ? 'true' : 'false'; + break; + case 'array': + if (0 === count($value)) { + $value = '({})'; + break; + } + $result = ''; + foreach ($value as $key => $val) { + $result .= ';'; + if (!is_int($key)) { + $result .= static::escapeValue($key) . '='; + } + $result .= static::escapeValue($val); + } + $value = '{' . substr($result, 1) . '}'; + break; + case 'object': + if ($value instanceof DateTime) { + $usec = $value->format('u'); + if ('000000' === $usec) { + unset($usec); + } + $unixEpoch = new DateTime('@0'); + $value = $unixEpoch->diff($value); + } + if ($value instanceof DateInterval) { + if (false === $value->days || $value->days < 0) { + $value = $value->format('%r%dd%H:%I:%S'); + } else { + $value = $value->format('%r%ad%H:%I:%S'); + } + if (strpos('.', $value) === false && isset($usec)) { + $value .= '.' . $usec; + } + break; + } + //break; intentionally omitted + default: + $value = '"' . static::escapeString((string)$value) . '"'; + break; + } + return $value; + } + + /** + * Escapes a string for a RouterOS scripting context. + * + * Escapes a string for a RouterOS scripting context. The value can then be + * surrounded with quotes at a RouterOS script (or concatenated onto a + * larger string first), and you can be sure there won't be any code + * injections coming from it. + * + * @param string $value Value to be escaped. + * + * @return string The escaped value. + */ + public static function escapeString($value) + { + return preg_replace_callback( + '/[^\\_A-Za-z0-9]+/S', + array(__CLASS__, '_escapeCharacters'), + $value + ); + } + + /** + * Escapes a character for a RouterOS scripting context. + * + * Escapes a character for a RouterOS scripting context. Intended to only be + * called for non-alphanumeric characters. + * + * @param string $chars The matches array, expected to contain exactly one + * member, in which is the whole string to be escaped. + * + * @return string The escaped characters. + */ + private static function _escapeCharacters($chars) + { + $result = ''; + for ($i = 0, $l = strlen($chars[0]); $i < $l; ++$i) { + $result .= '\\' . str_pad( + strtoupper(dechex(ord($chars[0][$i]))), + 2, + '0', + STR_PAD_LEFT + ); + } + return $result; + } + + /** + * Creates a new Util instance. + * + * Wraps around a connection to provide convinience methods. + * + * @param Client $client The connection to wrap around. + */ + public function __construct(Client $client) + { + $this->client = $client; + } + + /** + * Gets the current menu. + * + * @return string The current menu. + */ + public function getMenu() + { + return $this->menu; + } + + /** + * Sets the current menu. + * + * Sets the current menu. + * + * @param string $newMenu The menu to change to. Can be specified with API + * or CLI syntax and can be either absolute or relative. If relative, + * it's relative to the current menu, which by default is the root. + * + * @return $this The object itself. If an empty string is given for + * a new menu, no change is performed, + * but the ID cache is cleared anyway. + * + * @see static::clearIdCache() + */ + public function setMenu($newMenu) + { + $newMenu = (string)$newMenu; + if ('' !== $newMenu) { + $menuRequest = new Request('/menu'); + if ('/' === $newMenu[0]) { + $this->menu = $menuRequest->setCommand($newMenu)->getCommand(); + } else { + $this->menu = $menuRequest->setCommand( + '/' . str_replace('/', ' ', substr($this->menu, 1)) . ' ' . + str_replace('/', ' ', $newMenu) + )->getCommand(); + } + } + $this->clearIdCache(); + return $this; + } + + /** + * Executes a RouterOS script. + * + * Executes a RouterOS script, written as a string or a stream. + * Note that in cases of errors, the line numbers will be off, because the + * script is executed at the current menu as context, with the specified + * variables pre declared. This is achieved by prepending 1+count($params) + * lines before your actual script. + * + * @param string|resource $source The source of the script, as a string or + * stream. If a stream is provided, reading starts from the current + * position to the end of the stream, and the pointer stays at the end + * after reading is done. + * @param array $params An array of parameters to make available + * in the script as local variables. + * Variable names are array keys, and variable values are array values. + * Array values are automatically processed with + * {@link static::escapeValue()}. Streams are also supported, and are + * processed in chunks, each processed with + * {@link static::escapeString()}. Processing starts from the current + * position to the end of the stream, and the stream's pointer is left + * untouched after the reading is done. + * Note that the script's (generated) name is always added as the + * variable "_", which will be inadvertently lost if you overwrite it + * from here. + * @param string $policy Allows you to specify a policy the script + * must follow. Has the same format as in terminal. + * If left NULL, the script has no restrictions beyond those imposed by + * the username. + * @param string $name The script is executed after being saved + * in "/system script" under a random name (prefixed with the computer's + * name), and is removed after execution. To eliminate any possibility + * of name clashes, you can specify your own name. + * + * @return ResponseCollection Returns the response collection of the + * run, allowing you to inspect errors, if any. + * If the script was not added successfully before execution, the + * ResponseCollection from the add attempt is going to be returned. + */ + public function exec( + $source, + array $params = array(), + $policy = null, + $name = null + ) { + return $this->_exec($source, $params, $policy, $name); + } + + /** + * Clears the ID cache. + * + * Normally, the ID cache improves performance when targeting items by a + * number. If you're using both Util's methods and other means (e.g. + * {@link Client} or {@link Util::exec()}) to add/move/remove items, the + * cache may end up being out of date. By calling this method right before + * targeting an item with a number, you can ensure number accuracy. + * + * Note that Util's {@link static::move()} and {@link static::remove()} + * methods automatically clear the cache before returning, while + * {@link static::add()} adds the new item's ID to the cache as the next + * number. A change in the menu also clears the cache. + * + * Note also that the cache is being rebuilt unconditionally every time you + * use {@link static::find()} with a callback. + * + * @return $this The Util object itself. + */ + public function clearIdCache() + { + $this->idCache = null; + return $this; + } + + /** + * Finds the IDs of items at the current menu. + * + * Finds the IDs of items based on specified criteria, and returns them as + * a comma separated string, ready for insertion at a "numbers" argument. + * + * Accepts zero or more criteria as arguments. If zero arguments are + * specified, returns all items' IDs. The value of each criteria can be a + * number (just as in Winbox), a literal ID to be included, a {@link Query} + * object, or a callback. If a callback is specified, it is called for each + * item, with the item as an argument. If it returns a true value, the + * item's ID is included in the result. Every other value is casted to a + * string. A string is treated as a comma separated values of IDs, numbers + * or callback names. Non-existent callback names are instead placed in the + * result, which may be useful in menus that accept identifiers other than + * IDs, but note that it can cause errors on other menus. + * + * @return string A comma separated list of all items matching the + * specified criteria. + */ + public function find() + { + if (func_num_args() === 0) { + if (null === $this->idCache) { + $idCache = str_replace( + ';', + ',', + $this->client->sendSync( + new Request($this->menu . '/find') + )->getProperty('ret') + ); + $this->idCache = explode(',', $idCache); + return $idCache; + } + return implode(',', $this->idCache); + } + $idList = ''; + foreach (func_get_args() as $criteria) { + if ($criteria instanceof Query) { + foreach ($this->client->sendSync( + new Request($this->menu . '/print .proplist=.id', $criteria) + ) as $response) { + $idList .= $response->getProperty('.id') . ','; + } + } elseif (is_callable($criteria)) { + $idCache = array(); + foreach ($this->client->sendSync( + new Request($this->menu . '/print') + ) as $response) { + if ($criteria($response)) { + $idList .= $response->getProperty('.id') . ','; + } + $idCache[] = $response->getProperty('.id'); + } + $this->idCache = $idCache; + } else { + $this->find(); + if (is_int($criteria)) { + if (isset($this->idCache[$criteria])) { + $idList = $this->idCache[$criteria] . ','; + } + } else { + $criteria = (string)$criteria; + if ($criteria === (string)(int)$criteria) { + if (isset($this->idCache[(int)$criteria])) { + $idList .= $this->idCache[(int)$criteria] . ','; + } + } elseif (false === strpos($criteria, ',')) { + $idList .= $criteria . ','; + } else { + $criteriaArr = explode(',', $criteria); + for ($i = count($criteriaArr) - 1; $i >= 0; --$i) { + if ('' === $criteriaArr[$i]) { + unset($criteriaArr[$i]); + } elseif ('*' === $criteriaArr[$i][0]) { + $idList .= $criteriaArr[$i] . ','; + unset($criteriaArr[$i]); + } + } + if (!empty($criteriaArr)) { + $idList .= call_user_func_array( + array($this, 'find'), + $criteriaArr + ) . ','; + } + } + } + } + } + return rtrim($idList, ','); + } + + /** + * Gets a value of a specified item at the current menu. + * + * @param int|string|null $number A number identifying the item you're + * targeting. Can also be an ID or (in some menus) name. For menus where + * there are no items (e.g. "/system identity"), you can specify NULL. + * @param string $valueName The name of the value you want to get. + * + * @return string|null|bool The value of the specified property. If the + * property is not set, NULL will be returned. FALSE on failure + * (e.g. no such item, invalid property, etc.). + */ + public function get($number, $valueName) + { + if (is_int($number) || ((string)$number === (string)(int)$number)) { + $this->find(); + if (isset($this->idCache[(int)$number])) { + $number = $this->idCache[(int)$number]; + } else { + return false; + } + } + + //For new RouterOS versions + $request = new Request($this->menu . '/get'); + $request->setArgument('number', $number); + $request->setArgument('value-name', $valueName); + $responses = $this->client->sendSync($request); + if (Response::TYPE_ERROR === $responses->getType()) { + return false; + } + $result = $responses->getProperty('ret'); + if (null !== $result) { + return $result; + } + + // The "get" of old RouterOS versions returns an empty !done response. + // New versions return such only when the property is not set. + // This is a backup for old versions' sake. + $query = null; + if (null !== $number) { + $number = (string)$number; + $query = Query::where('.id', $number)->orWhere('name', $number); + } + $responses = $this->getAll( + array('.proplist' => $valueName, 'detail'), + $query + ); + + if (0 === count($responses)) { + // @codeCoverageIgnoreStart + // New versions of RouterOS can't possibly reach this section. + return false; + // @codeCoverageIgnoreEnd + } + return $responses->getProperty($valueName); + } + + /** + * Enables all items at the current menu matching certain criteria. + * + * Zero or more arguments can be specified, each being a criteria. + * If zero arguments are specified, enables all items. + * See {@link static::find()} for a description of what criteria are + * accepted. + * + * @return ResponseCollection returns the response collection, allowing you + * to inspect errors, if any. + */ + public function enable() + { + return $this->doBulk('enable', func_get_args()); + } + + /** + * Disables all items at the current menu matching certain criteria. + * + * Zero or more arguments can be specified, each being a criteria. + * If zero arguments are specified, disables all items. + * See {@link static::find()} for a description of what criteria are + * accepted. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function disable() + { + return $this->doBulk('disable', func_get_args()); + } + + /** + * Removes all items at the current menu matching certain criteria. + * + * Zero or more arguments can be specified, each being a criteria. + * If zero arguments are specified, removes all items. + * See {@link static::find()} for a description of what criteria are + * accepted. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function remove() + { + $result = $this->doBulk('remove', func_get_args()); + $this->clearIdCache(); + return $result; + } + + /** + * Sets new values. + * + * Sets new values on certain properties on all items at the current menu + * which match certain criteria. + * + * @param mixed $numbers Targeted items. Can be any criteria accepted by + * {@link static::find()} or NULL in case the menu is one without items + * (e.g. "/system identity"). + * @param array $newValues An array with the names of each property to set + * as an array key, and the new value as an array value. + * Flags (properties with a value "true" that is interpreted as + * equivalent of "yes" from CLI) can also be specified with a numeric + * index as the array key, and the name of the flag as the array value. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function set($numbers, array $newValues) + { + $setRequest = new Request($this->menu . '/set'); + foreach ($newValues as $name => $value) { + if (is_int($name)) { + $setRequest->setArgument($value, 'true'); + } else { + $setRequest->setArgument($name, $value); + } + } + if (null !== $numbers) { + $setRequest->setArgument('numbers', $this->find($numbers)); + } + return $this->client->sendSync($setRequest); + } + + /** + * Alias of {@link static::set()} + * + * @param mixed $numbers Targeted items. Can be any criteria accepted by + * {@link static::find()}. + * @param array $newValues An array with the names of each changed property + * as an array key, and the new value as an array value. + * Flags (properties with a value "true" that is interpreted as + * equivalent of "yes" from CLI) can also be specified with a numeric + * index as the array key, and the name of the flag as the array value. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function edit($numbers, array $newValues) + { + return $this->set($numbers, $newValues); + } + + /** + * Unsets a value of a specified item at the current menu. + * + * Equivalent of scripting's "unset" command. The "Value" part in the method + * name is added because "unset" is a language construct, and thus a + * reserved word. + * + * @param mixed $numbers Targeted items. Can be any criteria accepted + * by {@link static::find()}. + * @param string $valueName The name of the value you want to unset. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function unsetValue($numbers, $valueName) + { + $unsetRequest = new Request($this->menu . '/unset'); + return $this->client->sendSync( + $unsetRequest->setArgument('numbers', $this->find($numbers)) + ->setArgument('value-name', $valueName) + ); + } + + /** + * Adds a new item at the current menu. + * + * @param array $values Accepts one or more items to add to the + * current menu. The data about each item is specified as an array with + * the names of each property as an array key, and the value as an array + * value. + * Flags (properties with a value "true" that is interpreted as + * equivalent of "yes" from CLI) can also be specified with a numeric + * index as the array key, and the name of the flag as the array value. + * @param array $... Additional items. + * + * @return string A comma separated list of the new items' IDs. If a + * particular item was not added, this will be indicated by an empty + * string in its spot on the list. e.g. "*1D,,*1E" means that + * you supplied three items to be added, of which the second one was + * not added for some reason. + */ + public function add(array $values) + { + $addRequest = new Request($this->menu . '/add'); + $idList = ''; + foreach (func_get_args() as $values) { + $idList .= ','; + if (!is_array($values)) { + continue; + } + foreach ($values as $name => $value) { + if (is_int($name)) { + $addRequest->setArgument($value, 'true'); + } else { + $addRequest->setArgument($name, $value); + } + } + $id = $this->client->sendSync($addRequest)->getProperty('ret'); + if (null !== $this->idCache) { + $this->idCache[] = $id; + } + $idList .= $id; + $addRequest->removeAllArguments(); + } + return substr($idList, 1); + } + + /** + * Moves items at the current menu before a certain other item. + * + * Moves items before a certain other item. Note that the "move" + * command is not available on all menus. As a rule of thumb, if the order + * of items in a menu is irrelevant to their interpretation, there won't + * be a move command on that menu. If in doubt, check from a terminal. + * + * @param mixed $numbers Targeted items. Can be any criteria accepted + * by {@link static::find()}. + * @param mixed $destination item before which the targeted items will be + * moved to. Can be any criteria accepted by {@link static::find()}. + * If multiple items match the criteria, the targeted items will move + * above the first match. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + public function move($numbers, $destination) + { + $moveRequest = new Request($this->menu . '/move'); + $moveRequest->setArgument('numbers', $this->find($numbers)); + $destination = $this->find($destination); + if (false !== strpos($destination, ',')) { + $destination = strstr($destination, ',', true); + } + $moveRequest->setArgument('destination', $destination); + $this->clearIdCache(); + return $this->client->sendSync($moveRequest); + } + + /** + * Counts items at the current menu. + * + * Counts items at the current menu. This executes a dedicated command + * ("print" with a "count-only" argument) on RouterOS, which is why only + * queries are allowed as a criteria, in contrast with + * {@link static::find()}, where numbers and callbacks are allowed also. + * + * @param int $mode The counter mode. + * Currently ignored, but present for compatiblity with PHP 5.6+. + * @param Query $query A query to filter items by. Without it, all items + * are included in the count. + * + * @return int The number of items, or -1 on failure (e.g. if the + * current menu does not have a "print" command or items to be counted). + */ + public function count($mode = COUNT_NORMAL, Query $query = null) + { + $result = $this->client->sendSync( + new Request($this->menu . '/print count-only=""', $query) + )->end()->getProperty('ret'); + + if (null === $result) { + return -1; + } + if (Stream::isStream($result)) { + $result = stream_get_contents($result); + } + return (int)$result; + } + + /** + * Gets all items in the current menu. + * + * Gets all items in the current menu, using a print request. + * + * @param array $args Additional arguments to pass + * to the request. + * Each array key is the name of the argument, and each array value is + * the value of the argument to be passed. + * Arguments without a value (i.e. empty arguments) can also be + * specified using a numeric key, and the name of the argument as the + * array value. + * @param Query|null $query A query to filter items by. + * NULL to get all items. + * + * @return ResponseCollection|false A response collection with all + * {@link Response::TYPE_DATA} responses. The collection will be empty + * when there are no matching items. FALSE on failure. + */ + public function getAll(array $args = array(), Query $query = null) + { + $printRequest = new Request($this->menu . '/print', $query); + foreach ($args as $name => $value) { + if (is_int($name)) { + $printRequest->setArgument($value); + } else { + $printRequest->setArgument($name, $value); + } + } + $responses = $this->client->sendSync($printRequest); + + if (count($responses->getAllOfType(Response::TYPE_ERROR)) > 0) { + return false; + } + return $responses->getAllOfType(Response::TYPE_DATA); + } + + /** + * Puts a file on RouterOS's file system. + * + * Puts a file on RouterOS's file system, regardless of the current menu. + * Note that this is a **VERY VERY VERY** time consuming method - it takes a + * minimum of a little over 4 seconds, most of which are in sleep. It waits + * 2 seconds after a file is first created (required to actually start + * writing to the file), and another 2 seconds after its contents is written + * (performed in order to verify success afterwards). + * Similarly for removal (when $data is NULL) - there are two seconds in + * sleep, used to verify the file was really deleted. + * + * If you want an efficient way of transferring files, use (T)FTP. + * If you want an efficient way of removing files, use + * {@link static::setMenu()} to move to the "/file" menu, and call + * {@link static::remove()} without performing verification afterwards. + * + * @param string $filename The filename to write data in. + * @param string|resource|null $data The data the file is going to have + * as a string or a seekable stream. + * Setting the value to NULL removes a file of this name. + * If a seekable stream is provided, it is sent from its current + * posistion to its end, and the pointer is seeked back to its current + * position after sending. + * Non seekable streams, as well as all other types, are casted to a + * string. + * @param bool $overwrite Whether to overwrite the file if + * it exists. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function filePutContents($filename, $data, $overwrite = false) + { + $printRequest = new Request( + '/file/print .proplist=""', + Query::where('name', $filename) + ); + $fileExists = count($this->client->sendSync($printRequest)) > 1; + + if (null === $data) { + if (!$fileExists) { + return false; + } + $removeRequest = new Request('/file/remove'); + $this->client->sendSync( + $removeRequest->setArgument('numbers', $filename) + ); + //Required for RouterOS to REALLY remove the file. + sleep(2); + return !(count($this->client->sendSync($printRequest)) > 1); + } + + if (!$overwrite && $fileExists) { + return false; + } + $result = $this->client->sendSync( + $printRequest->setArgument('file', $filename) + ); + if (count($result->getAllOfType(Response::TYPE_ERROR)) > 0) { + return false; + } + //Required for RouterOS to write the initial file. + sleep(2); + $setRequest = new Request('/file/set contents=""'); + $setRequest->setArgument('numbers', $filename); + $this->client->sendSync($setRequest); + $this->client->sendSync($setRequest->setArgument('contents', $data)); + //Required for RouterOS to write the file's new contents. + sleep(2); + + $fileSize = $this->client->sendSync( + $printRequest->setArgument('file', null) + ->setArgument('.proplist', 'size') + )->getProperty('size'); + if (Stream::isStream($fileSize)) { + $fileSize = stream_get_contents($fileSize); + } + if (Communicator::isSeekableStream($data)) { + return Communicator::seekableStreamLength($data) == $fileSize; + } else { + return sprintf('%u', strlen((string)$data)) === $fileSize; + }; + } + + /** + * Gets the contents of a specified file. + * + * @param string $filename The name of the file to get the contents of. + * @param string $tmpScriptName In order to get the file's contents, a + * script is created at "/system script" with a random name, the + * source of which is then overwriten with the file's contents, and + * finally retrieved. To eliminate any possibility of name clashes, you + * can specify your own name for the script. + * + * @return string|resource|false The contents of the file as a string or as + * new PHP temp stream if the underliying + * {@link Client::isStreamingResponses()} is set to TRUE. + * FALSE is returned if there is no such file. + */ + public function fileGetContents($filename, $tmpScriptName = null) + { + $checkRequest = new Request( + '/file/print', + Query::where('name', $filename) + ); + if (1 === count($this->client->sendSync($checkRequest))) { + return false; + } + $contents = $this->_exec( + '/system script set $"_" source=[/file get $filename contents]', + array('filename' => $filename), + null, + $tmpScriptName, + true + ); + return $contents; + } + + /** + * Performs an action on a bulk of items at the current menu. + * + * @param string $what What action to perform. + * @param array $args Zero or more arguments can be specified, each being + * a criteria. If zero arguments are specified, removes all items. + * See {@link static::find()} for a description of what criteria are + * accepted. + * + * @return ResponseCollection Returns the response collection, allowing you + * to inspect errors, if any. + */ + protected function doBulk($what, array $args = array()) + { + $bulkRequest = new Request($this->menu . '/' . $what); + $bulkRequest->setArgument( + 'numbers', + call_user_func_array(array($this, 'find'), $args) + ); + return $this->client->sendSync($bulkRequest); + } + + /** + * Executes a RouterOS script. + * + * Same as the public equivalent, with the addition of allowing you to get + * the contents of the script post execution, instead of removing it. + * + * @param string|resource $source The source of the script, as a string or + * stream. If a stream is provided, reading starts from the current + * position to the end of the stream, and the pointer stays at the end + * after reading is done. + * @param array $params An array of parameters to make available + * in the script as local variables. + * Variable names are array keys, and variable values are array values. + * Array values are automatically processed with + * {@link static::escapeValue()}. Streams are also supported, and are + * processed in chunks, each processed with + * {@link static::escapeString()}. Processing starts from the current + * position to the end of the stream, and the stream's pointer is left + * untouched after the reading is done. + * Note that the script's (generated) name is always added as the + * variable "_", which will be inadvertently lost if you overwrite it + * from here. + * @param string $policy Allows you to specify a policy the script + * must follow. Has the same format as in terminal. + * If left NULL, the script has no restrictions beyond those imposed by + * the username. + * @param string $name The script is executed after being saved + * in "/system script" under a random name (prefixed with the computer's + * name), and is removed after execution. To eliminate any possibility + * of name clashes, you can specify your own name. + * @param bool $get Whether to get the source of the script. + * + * @return ResponseCollection|string Returns the response collection of the + * run, allowing you to inspect errors, if any. + * If the script was not added successfully before execution, the + * ResponseCollection from the add attempt is going to be returned. + * If $get is TRUE, returns the source of the script on success. + */ + private function _exec( + $source, + array $params = array(), + $policy = null, + $name = null, + $get = false + ) { + $request = new Request('/system/script/add'); + if (null === $name) { + $name = uniqid(gethostname(), true); + } + $request->setArgument('name', $name); + $request->setArgument('policy', $policy); + + $params += array('_' => $name); + + $finalSource = fopen('php://temp', 'r+b'); + fwrite( + $finalSource, + '/' . str_replace('/', ' ', substr($this->menu, 1)). "\n" + ); + static::appendScript($finalSource, $source, $params); + fwrite($finalSource, "\n"); + rewind($finalSource); + + $request->setArgument('source', $finalSource); + $result = $this->client->sendSync($request); + + if (0 === count($result->getAllOfType(Response::TYPE_ERROR))) { + $request = new Request('/system/script/run'); + $request->setArgument('number', $name); + $result = $this->client->sendSync($request); + + if ($get) { + $result = $this->client->sendSync( + new Request( + '/system/script/print .proplist="source"', + Query::where('name', $name) + ) + )->getProperty('source'); + } + $request = new Request('/system/script/remove'); + $request->setArgument('numbers', $name); + $this->client->sendSync($request); + } + + return $result; + } +} diff --git a/PEAR2/Net/Transmitter/Exception.php b/PEAR2/Net/Transmitter/Exception.php new file mode 100644 index 0000000..e6f37b2 --- /dev/null +++ b/PEAR2/Net/Transmitter/Exception.php @@ -0,0 +1,36 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * Generic exception class of this package. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +interface Exception +{ +} diff --git a/PEAR2/Net/Transmitter/FilterCollection.php b/PEAR2/Net/Transmitter/FilterCollection.php new file mode 100644 index 0000000..66f299a --- /dev/null +++ b/PEAR2/Net/Transmitter/FilterCollection.php @@ -0,0 +1,229 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * A filter collection. + * + * Represents a collection of stream filters. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + * @see Client + */ +class FilterCollection implements \SeekableIterator, \Countable +{ + /** + * @var array The filter collection itself. + */ + protected $filters = array(); + + /** + * @var int A pointer, as required by SeekableIterator. + */ + protected $position = 0; + + /** + * Appends a filter to the collection + * + * @param string $name The name of the filter. + * @param array $params An array of parameters for the filter. + * + * @return $this The collection itself. + */ + public function append($name, array $params = array()) + { + $this->filters[] = array((string) $name, $params); + return $this; + } + + /** + * Inserts the filter before a position. + * + * Inserts the specified filter before a filter at a specified position. The + * new filter takes the specified position, while previous filters are moved + * forward by one. + * + * @param int $position The position before which the filter will be + * inserted. + * @param string $name The name of the filter. + * @param array $params An array of parameters for the filter. + * + * @return $this The collection itself. + */ + public function insertBefore($position, $name, array $params = array()) + { + $position = (int) $position; + if ($position <= 0) { + $this->filters = array_merge( + array(0 => array((string) $name, $params)), + $this->filters + ); + return $this; + } + if ($position > count($this->filters)) { + return $this->append($name, $params); + } + $this->filters = array_merge( + array_slice($this->filters, 0, $position), + array(0 => array((string) $name, $params)), + array_slice($this->filters, $position) + ); + return $this; + } + + /** + * Removes a filter at a specified position. + * + * @param int $position The position from which to remove a filter. + * + * @return $this The collection itself. + */ + public function removeAt($position) + { + unset($this->filters[$position]); + $this->filters = array_values($this->filters); + return $this; + } + + /** + * Clears the collection + * + * @return $this The collection itself. + */ + public function clear() + { + $this->filters = array(); + return $this; + } + + /** + * Gets the number of filters in the collection. + * + * @return int The number of filters in the collection. + */ + public function count() + { + return count($this->filters); + } + + /** + * Resets the pointer to 0. + * + * @return bool TRUE if the collection is not empty, FALSE otherwise. + */ + public function rewind() + { + return $this->seek(0); + } + + /** + * Moves the pointer to a specified position. + * + * @param int $position The position to move to. + * + * @return bool TRUE if the specified position is valid, FALSE otherwise. + */ + public function seek($position) + { + $this->position = $position; + return $this->valid(); + } + + /** + * Gets the current position. + * + * @return int The current position. + */ + public function getCurrentPosition() + { + return $this->position; + } + + /** + * Moves the pointer forward by 1. + * + * @return bool TRUE if the new position is valid, FALSE otherwise. + */ + public function next() + { + ++$this->position; + return $this->valid(); + } + + /** + * Gets the filter name at the current pointer position. + * + * @return string The name of the filter at the current position. + */ + public function key() + { + return $this->valid() ? $this->filters[$this->position][0] : false; + } + + /** + * Gets the filter parameters at the current pointer position. + * + * @return array An array of parameters for the filter at the current + * position. + */ + public function current() + { + return $this->valid() ? $this->filters[$this->position][1] : false; + } + + /** + * Moves the pointer backwards by 1. + * + * @return bool TRUE if the new position is valid, FALSE otherwise. + */ + public function prev() + { + --$this->position; + return $this->valid(); + } + + /** + * Moves the pointer to the last valid position. + * + * @return bool TRUE if the collection is not empty, FALSE otherwise. + */ + public function end() + { + $this->position = count($this->filters) - 1; + return $this->valid(); + } + + /** + * Checks if the pointer is still pointing to an existing offset. + * + * @return bool TRUE if the pointer is valid, FALSE otherwise. + */ + public function valid() + { + return array_key_exists($this->position, $this->filters); + } +} diff --git a/PEAR2/Net/Transmitter/LockException.php b/PEAR2/Net/Transmitter/LockException.php new file mode 100644 index 0000000..afbc279 --- /dev/null +++ b/PEAR2/Net/Transmitter/LockException.php @@ -0,0 +1,36 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * Exception thrown when something goes wrong when dealing with locks. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class LockException extends \RuntimeException implements Exception +{ +} diff --git a/PEAR2/Net/Transmitter/NetworkStream.php b/PEAR2/Net/Transmitter/NetworkStream.php new file mode 100644 index 0000000..e7aec87 --- /dev/null +++ b/PEAR2/Net/Transmitter/NetworkStream.php @@ -0,0 +1,181 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * A network transmitter. + * + * This is a convinience wrapper for network streams. Used to ensure data + * integrity. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +abstract class NetworkStream extends Stream +{ + /** + * Used in {@link setCrypto()} to disable encryption. + */ + const CRYPTO_OFF = ''; + + /** + * Used in {@link setCrypto()} to set encryption to either SSLv2 or SSLv3, + * depending on what the other end supports. + */ + const CRYPTO_SSL = 'SSLv23'; + + /** + * Used in {@link setCrypto()} to set encryption to SSLv2. + */ + const CRYPTO_SSL2 = 'SSLv2'; + + /** + * Used in {@link setCrypto()} to set encryption to SSLv3. + */ + const CRYPTO_SSL3 = 'SSLv3'; + + /** + * Used in {@link setCrypto()} to set encryption to TLS (exact version + * negotiated between 1.0 and 1.2). + */ + const CRYPTO_TLS = 'TLS'; + + /** + * @var string The type of stream. Can be either "_CLIENT" or "_SERVER". + * Used to complement the encryption type. Must be set by child classes + * for {@link setCrypto()} to work properly. + */ + protected $streamType = ''; + + /** + * @var string The current cryptography setting. + */ + protected $crypto = ''; + + /** + * Wraps around the specified stream. + * + * @param resource $stream The stream to wrap around. + */ + public function __construct($stream) + { + parent::__construct($stream, true); + } + + /** + * Gets the current cryptography setting. + * + * @return string One of this class' CRYPTO_* constants. + */ + public function getCrypto() + { + return $this->crypto; + } + + /** + * Sets the current connection's cryptography setting. + * + * @param string $type The encryption type to set. Must be one of this + * class' CRYPTO_* constants. + * + * @return boolean TRUE on success, FALSE on failure. + */ + public function setCrypto($type) + { + if (self::CRYPTO_OFF === $type) { + $result = stream_socket_enable_crypto($this->stream, false); + } else { + $result = stream_socket_enable_crypto( + $this->stream, + true, + constant("STREAM_CRYPTO_METHOD_{$type}{$this->streamType}") + ); + } + + if ($result) { + $this->crypto = $type; + } + return $result; + } + + /** + * Checks whether the stream is available for operations. + * + * @return bool TRUE if the stream is available, FALSE otherwise. + */ + public function isAvailable() + { + if (parent::isStream($this->stream)) { + if ($this->isBlocking && feof($this->stream)) { + return false; + } + $meta = stream_get_meta_data($this->stream); + return !$meta['eof']; + } + return false; + } + + /** + * Sets the size of a stream's buffer. + * + * @param int $size The desired size of the buffer, in bytes. + * @param string $direction The buffer of which direction to set. Valid + * values are the DIRECTION_* constants. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setBuffer($size, $direction = self::DIRECTION_ALL) + { + $result = parent::setBuffer($size, $direction); + if (self::DIRECTION_SEND === $direction + && function_exists('stream_set_chunk_size') && !$result + ) { + return false !== @stream_set_chunk_size($this->stream, $size); + } + return $result; + } + + /** + * Shutdown a full-duplex connection + * + * Shutdowns (partially or not) a full-duplex connection. + * + * @param string $direction The direction for which to disable further + * communications. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function shutdown($direction = self::DIRECTION_ALL) + { + $directionMap = array( + self::DIRECTION_ALL => STREAM_SHUT_RDWR, + self::DIRECTION_SEND => STREAM_SHUT_WR, + self::DIRECTION_RECEIVE => STREAM_SHUT_RD + ); + return array_key_exists($direction, $directionMap) + && stream_socket_shutdown($this->stream, $directionMap[$direction]); + } +} diff --git a/PEAR2/Net/Transmitter/SocketException.php b/PEAR2/Net/Transmitter/SocketException.php new file mode 100644 index 0000000..69cbe0e --- /dev/null +++ b/PEAR2/Net/Transmitter/SocketException.php @@ -0,0 +1,124 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * Used to enable any exception in chaining. + */ +use Exception as E; + +/** + * Exception thrown when something goes wrong with the connection. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class SocketException extends StreamException +{ + + /** + * @var int The system level error code. + */ + protected $errorNo; + + /** + * @var string The system level error message. + */ + protected $errorStr; + + /** + * Creates a new socket exception. + * + * @param string $message The Exception message to throw. + * @param int $code The Exception code. + * @param E|null $previous Previous exception thrown, + * or NULL if there is none. + * @param int|string|resource|null $fragment The fragment up until the + * point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * NULL if the failure occured before the operation started. + * @param int $errorNo The system level error number. + * @param string $errorStr The system level + * error message. + */ + public function __construct( + $message = '', + $code = 0, + E $previous = null, + $fragment = null, + $errorNo = null, + $errorStr = null + ) { + parent::__construct($message, $code, $previous, $fragment); + $this->errorNo = $errorNo; + $this->errorStr = $errorStr; + } + + /** + * Gets the system level error code on the socket. + * + * @return int The system level error number. + */ + public function getSocketErrorNumber() + { + return $this->errorNo; + } + + // @codeCoverageIgnoreStart + // Unreliable in testing. + + /** + * Gets the system level error message on the socket. + * + * @return string The system level error message. + */ + public function getSocketErrorMessage() + { + return $this->errorStr; + } + + /** + * Returns a string representation of the exception. + * + * @return string The exception as a string. + */ + public function __toString() + { + $result = parent::__toString(); + if (null !== $this->getSocketErrorNumber()) { + $result .= "\nSocket error number:" . $this->getSocketErrorNumber(); + } + if (null !== $this->getSocketErrorMessage()) { + $result .= "\nSocket error message:" + . $this->getSocketErrorMessage(); + } + return $result; + } + // @codeCoverageIgnoreEnd +} diff --git a/PEAR2/Net/Transmitter/Stream.php b/PEAR2/Net/Transmitter/Stream.php new file mode 100644 index 0000000..bbe6829 --- /dev/null +++ b/PEAR2/Net/Transmitter/Stream.php @@ -0,0 +1,605 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +use Exception as E; + +/** + * A stream transmitter. + * + * This is a convinience wrapper for stream functionality. Used to ensure data + * integrity. Designed for TCP sockets, but it has intentionally been made to + * accept any stream. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class Stream +{ + /** + * Used to stop settings in either direction being applied. + */ + const DIRECTION_NONE = 0; + /** + * Used to apply settings only to receiving. + */ + const DIRECTION_RECEIVE = 1; + /** + * Used to apply settings only to sending. + */ + const DIRECTION_SEND = 2; + /** + * Used to apply settings to both sending and receiving. + */ + const DIRECTION_ALL = 3; + + /** + * @var resource The stream to wrap around. + */ + protected $stream; + + /** + * @var bool Whether to automaticaly close the stream on + * object destruction if it's not a persistent one. Setting this to + * FALSE may be useful if you're only using this class "part time", + * while setting it to TRUE might be useful if you're doing some + * "on offs". + */ + protected $autoClose = false; + + /** + * @var bool A flag that tells whether or not the stream is persistent. + */ + protected $persist; + + /** + * @var bool Whether the wrapped stream is in blocking mode or not. + */ + protected $isBlocking = true; + + /** + * @var array An associative array with the chunk size of each direction. + * Key is the direction, value is the size in bytes as integer. + */ + protected $chunkSize = array( + self::DIRECTION_SEND => 0xFFFFF, self::DIRECTION_RECEIVE => 0xFFFFF + ); + + /** + * Wraps around the specified stream. + * + * @param resource $stream The stream to wrap around. + * @param bool $autoClose Whether to automaticaly close the stream on + * object destruction if it's not a persistent one. Setting this to + * FALSE may be useful if you're only using this class "part time", + * while setting it to TRUE might be useful if you're doing some + * "on offs". + * + * @see static::isFresh() + */ + public function __construct($stream, $autoClose = false) + { + if (!self::isStream($stream)) { + throw $this->createException('Invalid stream supplied.', 1); + } + $this->stream = $stream; + $this->autoClose = (bool) $autoClose; + $this->persist = (bool) preg_match( + '#\s?persistent\s?#sm', + get_resource_type($stream) + ); + $meta = stream_get_meta_data($stream); + $this->isBlocking = isset($meta['blocked']) ? $meta['blocked'] : true; + } + + /** + * PHP error handler for connection errors. + * + * @param string $level Level of PHP error raised. Ignored. + * @param string $message Message raised by PHP. + * + * @return void + * @throws SocketException That's how the error is handled. + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function handleError($level, $message) + { + throw $this->createException($message, 0); + } + + /** + * Checks if a given variable is a stream resource. + * + * @param mixed $var The variable to check. + * + * @return bool TRUE on success, FALSE on failure. + */ + public static function isStream($var) + { + return is_resource($var) + && (bool) preg_match('#\s?stream$#sm', get_resource_type($var)); + } + + /** + * Checks whether the wrapped stream is fresh. + * + * Checks whether the wrapped stream is fresh. A stream is considered fresh + * if there hasn't been any activity on it. Particularly useful for + * detecting reused persistent connections. + * + * @return bool TRUE if the socket is fresh, FALSE otherwise. + */ + public function isFresh() + { + return ftell($this->stream) === 0; + } + + /** + * Checks whether the wrapped stream is a persistent one. + * + * @return bool TRUE if the stream is a persistent one, FALSE otherwise. + */ + public function isPersistent() + { + return $this->persist; + } + + /** + * Checks whether the wrapped stream is a blocking one. + * + * @return bool TRUE if the stream is a blocking one, FALSE otherwise. + */ + public function isBlocking() + { + return $this->isBlocking; + } + + /** + * Sets blocking mode. + * + * @param bool $block Sets whether the stream is in blocking mode. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setIsBlocking($block) + { + $block = (bool)$block; + if (stream_set_blocking($this->stream, (int)$block)) { + $this->isBlocking = $block; + return true; + } + return false; + } + + /** + * Sets the timeout for the stream. + * + * @param int $seconds Timeout in seconds. + * @param int $microseconds Timeout in microseconds to be added to the + * seconds. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setTimeout($seconds, $microseconds = 0) + { + return stream_set_timeout($this->stream, $seconds, $microseconds); + } + + /** + * Sets the size of a stream's buffer. + * + * @param int $size The desired size of the buffer, in bytes. + * @param string $direction The buffer of which direction to set. Valid + * values are the DIRECTION_* constants. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setBuffer($size, $direction = self::DIRECTION_ALL) + { + switch($direction) { + case self::DIRECTION_SEND: + return stream_set_write_buffer($this->stream, $size) === 0; + case self::DIRECTION_RECEIVE: + return stream_set_read_buffer($this->stream, $size) === 0; + case self::DIRECTION_ALL: + return $this->setBuffer($size, self::DIRECTION_RECEIVE) + && $this->setBuffer($size, self::DIRECTION_SEND); + } + return false; + } + + /** + * Sets the size of the chunk. + * + * To ensure data integrity, as well as to allow for lower memory + * consumption, data is sent/received in chunks. This function + * allows you to set the size of each chunk. The default is 0xFFFFF. + * + * @param int $size The desired size of the chunk, in bytes. + * @param string $direction The chunk of which direction to set. Valid + * values are the DIRECTION_* constants. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function setChunk($size, $direction = self::DIRECTION_ALL) + { + $size = (int) $size; + if ($size <= 0) { + return false; + } + switch($direction) { + case self::DIRECTION_SEND: + case self::DIRECTION_RECEIVE: + $this->chunkSize[$direction] = $size; + return true; + case self::DIRECTION_ALL: + $this->chunkSize[self::DIRECTION_SEND] + = $this->chunkSize[self::DIRECTION_RECEIVE] = $size; + return true; + } + return false; + } + + /** + * Gets the size of the chunk. + * + * @param string $direction The chunk of which direction to get. Valid + * values are the DIRECTION_* constants. + * + * @return int|array|false The chunk size in bytes, + * or an array of chunk sizes with the directions as keys. + * FALSE on invalid direction. + */ + public function getChunk($direction = self::DIRECTION_ALL) + { + switch($direction) { + case self::DIRECTION_SEND: + case self::DIRECTION_RECEIVE: + return $this->chunkSize[$direction]; + case self::DIRECTION_ALL: + return $this->chunkSize; + } + return false; + } + + /** + * Sends a string or stream over the wrapped stream. + * + * Sends a string or stream over the wrapped stream. If a seekable stream is + * provided, it will be seeked back to the same position it was passed as, + * regardless of the $offset parameter. + * + * @param string|resource $contents The string or stream to send. + * @param int $offset The offset from which to start sending. + * If a stream is provided, and this is set to NULL, sending will start + * from the current stream position. + * @param int $length The maximum length to send. If omitted, + * the string/stream will be sent to its end. + * + * @return int The number of bytes sent. + */ + public function send($contents, $offset = null, $length = null) + { + $bytes = 0; + $chunkSize = $this->chunkSize[self::DIRECTION_SEND]; + $lengthIsNotNull = null !== $length; + $offsetIsNotNull = null !== $offset; + if (self::isStream($contents)) { + if ($offsetIsNotNull) { + $oldPos = ftell($contents); + fseek($contents, $offset, SEEK_SET); + } + while (!feof($contents)) { + if ($lengthIsNotNull + && 0 === $chunkSize = min($chunkSize, $length - $bytes) + ) { + break; + } + $bytesNow = @fwrite( + $this->stream, + fread($contents, $chunkSize) + ); + if (0 != $bytesNow) { + $bytes += $bytesNow; + } elseif ($this->isBlocking || false === $bytesNow) { + throw $this->createException( + 'Failed while sending stream.', + 2, + null, + $bytes + ); + } else { + usleep(300000); + } + $this->isAcceptingData(null); + } + if ($offsetIsNotNull) { + fseek($contents, $oldPos, SEEK_SET); + } else { + fseek($contents, -$bytes, SEEK_CUR); + } + } else { + $contents = (string) $contents; + if ($offsetIsNotNull) { + $contents = substr($contents, $offset); + } + if ($lengthIsNotNull) { + $contents = substr($contents, 0, $length); + } + $bytesToSend = (double) sprintf('%u', strlen($contents)); + while ($bytes < $bytesToSend) { + $bytesNow = @fwrite( + $this->stream, + substr($contents, $bytes, $chunkSize) + ); + if (0 != $bytesNow) { + $bytes += $bytesNow; + } elseif ($this->isBlocking || false === $bytesNow) { + throw $this->createException( + 'Failed while sending string.', + 3, + null, + $bytes + ); + } else { + usleep(300000); + } + $this->isAcceptingData(null); + } + } + return $bytes; + } + + /** + * Reads from the wrapped stream to receive. + * + * Reads from the wrapped stream to receive content as a string. + * + * @param int $length The number of bytes to receive. + * @param string $what Descriptive string about what is being received + * (used in exception messages). + * + * @return string The received content. + */ + public function receive($length, $what = 'data') + { + $result = ''; + $chunkSize = $this->chunkSize[self::DIRECTION_RECEIVE]; + while ($length > 0) { + while ($this->isAvailable()) { + $fragment = fread($this->stream, min($length, $chunkSize)); + if ('' != $fragment) { + $length -= strlen($fragment); + $result .= $fragment; + continue 2; + } elseif (!$this->isBlocking && !(false === $fragment)) { + usleep(3000); + continue 2; + } + } + throw $this->createException( + "Failed while receiving {$what}", + 4, + null, + $result + ); + } + return $result; + } + + /** + * Reads from the wrapped stream to receive. + * + * Reads from the wrapped stream to receive content as a stream. + * + * @param int $length The number of bytes to receive. + * @param FilterCollection $filters A collection of filters to apply to the + * stream while receiving. Note that the filters will not be present on + * the stream after receiving is done. + * @param string $what Descriptive string about what is being + * received (used in exception messages). + * + * @return resource The received content. + */ + public function receiveStream( + $length, + FilterCollection $filters = null, + $what = 'stream data' + ) { + $result = fopen('php://temp', 'r+b'); + $appliedFilters = array(); + if (null !== $filters) { + foreach ($filters as $filtername => $params) { + $appliedFilters[] = stream_filter_append( + $result, + $filtername, + STREAM_FILTER_WRITE, + $params + ); + } + } + + $chunkSize = $this->chunkSize[self::DIRECTION_RECEIVE]; + while ($length > 0) { + while ($this->isAvailable()) { + $fragment = fread($this->stream, min($length, $chunkSize)); + if ('' != $fragment) { + $length -= strlen($fragment); + fwrite($result, $fragment); + continue 2; + } elseif (!$this->isBlocking && !(false === $fragment)) { + usleep(3000); + continue 2; + } + } + + foreach ($appliedFilters as $filter) { + stream_filter_remove($filter); + } + rewind($result); + throw $this->createException( + "Failed while receiving {$what}", + 5, + null, + $result + ); + } + + foreach ($appliedFilters as $filter) { + stream_filter_remove($filter); + } + rewind($result); + return $result; + } + + /** + * Checks whether the stream is available for operations. + * + * For network streams, this means whether the other end has closed the + * connection. + * + * @return bool TRUE if the stream is available, FALSE otherwise. + */ + public function isAvailable() + { + return self::isStream($this->stream) && !feof($this->stream); + } + + /** + * Checks whether there is data to be read from the wrapped stream. + * + * @param int|null $sTimeout If theere isn't data awaiting currently, + * wait for it this many seconds for data to arrive. If NULL is + * specified, wait indefinetly for that. + * @param int $usTimeout Microseconds to add to the waiting time. + * + * @return bool TRUE if there is data to be read, FALSE otherwise. + * @SuppressWarnings(PHPMD.ShortVariable) + */ + public function isDataAwaiting($sTimeout = 0, $usTimeout = 0) + { + if (self::isStream($this->stream)) { + if (null === $sTimeout && !$this->isBlocking) { + $meta = stream_get_meta_data($this->stream); + return !$meta['eof']; + } + + $w = $e = null; + $r = array($this->stream); + return 1 === @/* due to PHP bug #54563 */stream_select( + $r, + $w, + $e, + $sTimeout, + $usTimeout + ); + } + return false; + } + + /** + * Checks whether the wrapped stream can be written to without a block. + * + * @param int|null $sTimeout If the stream isn't currently accepting data, + * wait for it this many seconds to start accepting data. If NULL is + * specified, wait indefinetly for that. + * @param int $usTimeout Microseconds to add to the waiting time. + * + * @return bool TRUE if the wrapped stream would not block on a write, FALSE + * otherwise. + * @SuppressWarnings(PHPMD.ShortVariable) + */ + public function isAcceptingData($sTimeout = 0, $usTimeout = 0) + { + if (self::isStream($this->stream)) { + if (!$this->isBlocking) { + $meta = stream_get_meta_data($this->stream); + return !$meta['eof']; + } elseif (feof($this->stream)) { + return false; + } + + $r = $e = null; + $w = array($this->stream); + return 1 === @/* due to PHP bug #54563 */stream_select( + $r, + $w, + $e, + $sTimeout, + $usTimeout + ); + } + return false; + } + + /** + * Closes the opened stream, unless it's a persistent one. + */ + public function __destruct() + { + if ((!$this->persist) && $this->autoClose) { + $this->close(); + } + } + + /** + * Closes the opened stream, even if it is a persistent one. + * + * @return bool TRUE on success, FALSE on failure. + */ + public function close() + { + return self::isStream($this->stream) && fclose($this->stream); + } + + /** + * Creates a new exception. + * + * Creates a new exception. Used by the rest of the functions in this class. + * Override in derived classes for custom exception handling. + * + * @param string $message The exception message. + * @param int $code The exception code. + * @param E|null $previous Previous exception thrown, + * or NULL if there is none. + * @param int|string|resource|null $fragment The fragment up until the + * point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * + * @return StreamException The exception to then be thrown. + */ + protected function createException( + $message, + $code = 0, + E $previous = null, + $fragment = null + ) { + return new StreamException($message, $code, $previous, $fragment); + } +} diff --git a/PEAR2/Net/Transmitter/StreamException.php b/PEAR2/Net/Transmitter/StreamException.php new file mode 100644 index 0000000..7a00f1c --- /dev/null +++ b/PEAR2/Net/Transmitter/StreamException.php @@ -0,0 +1,119 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * Base for this exception. + */ +use RuntimeException; + +/** + * Used to enable any exception in chaining. + */ +use Exception as E; + +/** + * Exception thrown when something goes wrong with the connection. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class StreamException extends RuntimeException implements Exception +{ + /** + * @var int|string|resource|null The fragment up until the point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * NULL if the failure occured before the operation started. + */ + protected $fragment = null; + + /** + * Creates a new stream exception. + * + * @param string $message The Exception message to throw. + * @param int $code The Exception code. + * @param E|null $previous Previous exception thrown, + * or NULL if there is none. + * @param int|string|resource|null $fragment The fragment up until the + * point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * NULL if the failure occured before the operation started. + */ + public function __construct( + $message, + $code, + E $previous = null, + $fragment = null + ) { + parent::__construct($message, $code, $previous); + $this->fragment = $fragment; + } + + /** + * Gets the stream fragment. + * + * @return int|string|resource|null The fragment up until the + * point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * NULL if the failure occured before the operation started. + */ + public function getFragment() + { + return $this->fragment; + } + + // @codeCoverageIgnoreStart + // Unreliable in testing. + + /** + * Returns a string representation of the exception. + * + * @return string The exception as a string. + */ + public function __toString() + { + $result = parent::__toString(); + if (null !== $this->fragment) { + $result .= "\nFragment: "; + if (is_scalar($this->fragment)) { + $result .= (string)$this->fragment; + } else { + $result .= stream_get_contents($this->fragment); + } + } + return $result; + } + // @codeCoverageIgnoreEnd +} diff --git a/PEAR2/Net/Transmitter/TcpClient.php b/PEAR2/Net/Transmitter/TcpClient.php new file mode 100644 index 0000000..c2f0ab7 --- /dev/null +++ b/PEAR2/Net/Transmitter/TcpClient.php @@ -0,0 +1,400 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +/** + * Used for managing persistent connections. + */ +use PEAR2\Cache\SHM; + +/** + * Used for matching arbitrary exceptions in + * {@link TcpClient::createException()} and releasing locks properly. + */ +use Exception as E; + +/** + * A socket transmitter. + * + * This is a convinience wrapper for socket functionality. Used to ensure data + * integrity. + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class TcpClient extends NetworkStream +{ + + /** + * @var int The error code of the last error on the socket. + */ + protected $errorNo = 0; + + /** + * @var string The error message of the last error on the socket. + */ + protected $errorStr = null; + + /** + * @var SHM Persistent connection handler. Remains NULL for non-persistent + * connections. + */ + protected $shmHandler = null; + + /** + * @var array An array with all connections from this PHP request (as keys) + * and their lock state (as a value). + */ + protected static $lockState = array(); + + protected static $cryptoScheme = array( + parent::CRYPTO_OFF => 'tcp', + parent::CRYPTO_SSL2 => 'sslv2', + parent::CRYPTO_SSL3 => 'sslv3', + parent::CRYPTO_SSL => 'ssl', + parent::CRYPTO_TLS => 'tls' + ); + + /** + * @var string The URI of this connection. + */ + protected $uri; + + /** + * Creates a new connection with the specified options. + * + * @param string $host Hostname (IP or domain) of the server. + * @param int $port The port on the server. + * @param bool $persist Whether or not the connection should be a + * persistent one. + * @param float $timeout The timeout for the connection. + * @param string $key A string that uniquely identifies the + * connection. + * @param string $crypto Encryption setting. Must be one of the + * NetworkStream::CRYPTO_* constants. By default, encryption is + * disabled. If the setting has an associated scheme for it, it will be + * used, and if not, the setting will be adjusted right after the + * connection is estabilished. + * @param resource $context A context for the socket. + */ + public function __construct( + $host, + $port, + $persist = false, + $timeout = null, + $key = '', + $crypto = parent::CRYPTO_OFF, + $context = null + ) { + $this->streamType = '_CLIENT'; + + if (strpos($host, ':') !== false) { + $host = "[{$host}]"; + } + $flags = STREAM_CLIENT_CONNECT; + if ($persist) { + $flags |= STREAM_CLIENT_PERSISTENT; + } + + $timeout + = null == $timeout ? ini_get('default_socket_timeout') : $timeout; + + $key = rawurlencode($key); + + if (null === $context) { + $context = stream_context_get_default(); + } elseif ((!is_resource($context)) + || ('stream-context' !== get_resource_type($context)) + ) { + throw $this->createException('Invalid context supplied.', 6); + } + $hasCryptoScheme = array_key_exists($crypto, static::$cryptoScheme); + $scheme = $hasCryptoScheme ? static::$cryptoScheme[$crypto] : 'tcp'; + $this->uri = "{$scheme}://{$host}:{$port}/{$key}"; + set_error_handler(array($this, 'handleError')); + try { + parent::__construct( + stream_socket_client( + $this->uri, + $this->errorNo, + $this->errorStr, + $timeout, + $flags, + $context + ) + ); + restore_error_handler(); + } catch (E $e) { + restore_error_handler(); + if (0 === $this->errorNo) { + throw $this->createException( + 'Failed to initialize socket.', + 7, + $e + ); + } + throw $this->createException( + 'Failed to connect with socket.', + 8, + $e + ); + } + + if ($hasCryptoScheme) { + $this->crypto = $crypto; + } elseif (parent::CRYPTO_OFF !== $crypto) { + $this->setCrypto($crypto); + } + $this->setIsBlocking(parent::CRYPTO_OFF === $crypto); + + if ($persist) { + $this->shmHandler = SHM::factory( + __CLASS__ . ' ' . $this->uri . ' ' + ); + self::$lockState[$this->uri] = self::DIRECTION_NONE; + } + } + + /** + * Creates a new exception. + * + * Creates a new exception. Used by the rest of the functions in this class. + * + * @param string $message The exception message. + * @param int $code The exception code. + * @param E|null $previous Previous exception thrown, + * or NULL if there is none. + * @param int|string|resource|null $fragment The fragment up until the + * point of failure. + * On failure with sending, this is the number of bytes sent + * successfully before the failure. + * On failure when receiving, this is a string/stream holding + * the contents received successfully before the failure. + * + * @return SocketException The exception to then be thrown. + */ + protected function createException( + $message, + $code = 0, + E $previous = null, + $fragment = null + ) { + return new SocketException( + $message, + $code, + $previous, + $fragment, + $this->errorNo, + $this->errorStr + ); + } + + /** + * Locks transmission. + * + * Locks transmission in one or more directions. Useful when dealing with + * persistent connections. Note that every send/receive call implicitly + * calls this function and then restores it to the previous state. You only + * need to call this function if you need to do an uninterrputed sequence of + * such calls. + * + * @param int $direction The direction(s) to have locked. Acceptable values + * are the DIRECTION_* constants. If a lock for a direction can't be + * obtained immediatly, the function will block until one is aquired. + * Note that if you specify {@link DIRECTION_ALL}, the sending lock will + * be obtained before the receiving one, and if obtaining the receiving + * lock afterwards fails, the sending lock will be released too. + * @param bool $replace Whether to replace all locks with the specified + * ones. Setting this to FALSE will make the function only obtain the + * locks which are not already obtained. + * + * @return int|false The previous state or FALSE if the connection is not + * persistent or arguments are invalid. + */ + public function lock($direction = self::DIRECTION_ALL, $replace = false) + { + if ($this->persist && is_int($direction)) { + $old = self::$lockState[$this->uri]; + + if ($direction & self::DIRECTION_SEND) { + if (($old & self::DIRECTION_SEND) + || $this->shmHandler->lock(self::DIRECTION_SEND) + ) { + self::$lockState[$this->uri] |= self::DIRECTION_SEND; + } else { + throw new LockException('Unable to obtain sending lock.'); + } + } elseif ($replace) { + if (!($old & self::DIRECTION_SEND) + || $this->shmHandler->unlock(self::DIRECTION_SEND) + ) { + self::$lockState[$this->uri] &= ~self::DIRECTION_SEND; + } else { + throw new LockException('Unable to release sending lock.'); + } + } + + try { + if ($direction & self::DIRECTION_RECEIVE) { + if (($old & self::DIRECTION_RECEIVE) + || $this->shmHandler->lock(self::DIRECTION_RECEIVE) + ) { + self::$lockState[$this->uri] |= self::DIRECTION_RECEIVE; + } else { + throw new LockException( + 'Unable to obtain receiving lock.' + ); + } + } elseif ($replace) { + if (!($old & self::DIRECTION_RECEIVE) + || $this->shmHandler->unlock(self::DIRECTION_RECEIVE) + ) { + self::$lockState[$this->uri] + &= ~self::DIRECTION_RECEIVE; + } else { + throw new LockException( + 'Unable to release receiving lock.' + ); + } + } + } catch (LockException $e) { + if ($direction & self::DIRECTION_SEND + && !($old & self::DIRECTION_SEND) + ) { + $this->shmHandler->unlock(self::DIRECTION_SEND); + } + throw $e; + } + return $old; + } + return false; + } + + + /** + * Sends a string or stream to the server. + * + * Sends a string or stream to the server. If a seekable stream is + * provided, it will be seeked back to the same position it was passed as, + * regardless of the $offset parameter. + * + * @param string|resource $contents The string or stream to send. + * @param int $offset The offset from which to start sending. + * If a stream is provided, and this is set to NULL, sending will start + * from the current stream position. + * @param int $length The maximum length to send. If omitted, + * the string/stream will be sent to its end. + * + * @return int The number of bytes sent. + */ + public function send($contents, $offset = null, $length = null) + { + if (false === ($previousState = $this->lock(self::DIRECTION_SEND)) + && $this->persist + ) { + throw $this->createException( + 'Unable to obtain sending lock', + 10 + ); + } + try { + $result = parent::send($contents, $offset, $length); + } catch (E $e) { + $this->lock($previousState, true); + throw $e; + } + $this->lock($previousState, true); + return $result; + } + + /** + * Receives data from the server. + * + * Receives data from the server as a string. + * + * @param int $length The number of bytes to receive. + * @param string $what Descriptive string about what is being received + * (used in exception messages). + * + * @return string The received content. + */ + public function receive($length, $what = 'data') + { + if (false === ($previousState = $this->lock(self::DIRECTION_RECEIVE)) + && $this->persist + ) { + throw $this->createException( + 'Unable to obtain receiving lock', + 9 + ); + } + try { + $result = parent::receive($length, $what); + } catch (E $e) { + $this->lock($previousState, true); + throw $e; + } + $this->lock($previousState, true); + return $result; + } + + /** + * Receives data from the server. + * + * Receives data from the server as a stream. + * + * @param int $length The number of bytes to receive. + * @param FilterCollection $filters A collection of filters to apply to the + * stream while receiving. Note that the filters will not be present on + * the stream after receiving is done. + * @param string $what Descriptive string about what is being + * received (used in exception messages). + * + * @return resource The received content. + */ + public function receiveStream( + $length, + FilterCollection $filters = null, + $what = 'stream data' + ) { + if (false === ($previousState = $this->lock(self::DIRECTION_RECEIVE)) + && $this->persist + ) { + throw $this->createException( + 'Unable to obtain receiving lock', + 9 + ); + } + try { + $result = parent::receiveStream($length, $filters, $what); + } catch (E $e) { + $this->lock($previousState, true); + throw $e; + } + $this->lock($previousState, true); + return $result; + } +} diff --git a/PEAR2/Net/Transmitter/TcpServerConnection.php b/PEAR2/Net/Transmitter/TcpServerConnection.php new file mode 100644 index 0000000..97a14ab --- /dev/null +++ b/PEAR2/Net/Transmitter/TcpServerConnection.php @@ -0,0 +1,147 @@ + + * @copyright 2011 Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @version 1.0.0a5 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +/** + * The namespace declaration. + */ +namespace PEAR2\Net\Transmitter; + +use Exception as E; + +/** + * A transmitter for connections to a socket server. + * + * This is a convinience wrapper for functionality of socket server connections. + * Used to ensure data integrity. Server handling is not part of the class in + * order to allow its usage as part of various server implementations (e.g. fork + * and/or sequential). + * + * @category Net + * @package PEAR2_Net_Transmitter + * @author Vasil Rangelov + * @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1 + * @link http://pear2.php.net/PEAR2_Net_Transmitter + */ +class TcpServerConnection extends NetworkStream +{ + + /** + * @var string The IP address of the connected client. + */ + protected $peerIP; + + /** + * @var int The port of the connected client. + */ + protected $peerPort; + + /** + * Creates a new connection with the specified options. + * + * @param resource $server A socket server, created with + * {@link stream_socket_server()}. + * @param float $timeout The timeout for the connection. + */ + public function __construct($server, $timeout = null) + { + $this->streamType = '_SERVER'; + + if (!self::isStream($server)) { + throw $this->createException('Invalid server supplied.', 9); + } + $timeout + = null == $timeout ? ini_get('default_socket_timeout') : $timeout; + + set_error_handler(array($this, 'handleError')); + try { + parent::__construct( + stream_socket_accept($server, $timeout, $peername) + ); + restore_error_handler(); + $portString = strrchr($peername, ':'); + $this->peerPort = (int) substr($portString, 1); + $ipString = substr( + $peername, + 0, + strlen($peername) - strlen($portString) + ); + if (strpos($ipString, '[') === 0 + && strpos(strrev($ipString), ']') === 0 + ) { + $ipString = substr($ipString, 1, strlen($ipString) - 2); + } + $this->peerIP = $ipString; + } catch (E $e) { + restore_error_handler(); + throw $this->createException( + 'Failed to initialize connection.', + 10, + $e + ); + } + } + + /** + * Gets the IP address of the connected client. + * + * @return string The IP address of the connected client. + */ + public function getPeerIP() + { + return $this->peerIP; + } + + /** + * Gets the port of the connected client. + * + * @return int The port of the connected client. + */ + public function getPeerPort() + { + return $this->peerPort; + } + + /** + * Creates a new exception. + * + * Creates a new exception. Used by the rest of the functions in this class. + * + * @param string $message The exception message. + * @param int $code The exception code. + * @param E|null $previous Previous exception thrown, or NULL if there + * is none. + * @param string|null $fragment The fragment up until the point of failure. + * NULL if the failure occured before the operation started. + * + * @return SocketException The exception to then be thrown. + */ + protected function createException( + $message, + $code = 0, + E $previous = null, + $fragment = null + ) { + return new SocketException( + $message, + $code, + $previous, + $fragment + ); + } +} diff --git a/ajax_add_profile.php b/ajax_add_profile.php new file mode 100644 index 0000000..fe91dda --- /dev/null +++ b/ajax_add_profile.php @@ -0,0 +1,55 @@ +setMenu('/ip hotspot user profile'); + if(strtolower($session_timeout) == 'none') $session_timeout = '00:00:00'; + $util->add( + array( + 'name' => "$profile_name", + 'rate-limit' => "$rate_limit", + 'session-timeout' => "$session_timeout", + 'shared-users' => "$shared_users", + 'mac-cookie-timeout' => "$mac_cookie_timeout", + 'keepalive-timeout' => "$keepalive_timeout" + ) + ); + /* + if(strtolower($session_timeout) == 'none') { + $id = $client->sendSync(new Request('/ip/hotspot/user/profile/print .proplist=.id', null, Query::where('name', $profile_name)))->getArgument('.id'); + $util->setMenu('/ip hotspot user profile'); + $util->unsetValue($id, 'session-timeout'); + } */ + echo 2; //Success + } + else + { + echo 1; //Profile name/Session Timeout Empty + } +} +else + { + echo 0; //Not Authorised +} +?> \ No newline at end of file diff --git a/ajax_add_sysuser.php b/ajax_add_sysuser.php new file mode 100644 index 0000000..e569d86 --- /dev/null +++ b/ajax_add_sysuser.php @@ -0,0 +1,34 @@ +prepare("SELECT * FROM hotspot_users WHERE username =:username"); + $stmt->execute(array(':username' => $username)); + $count = $stmt->rowCount(); + + if ($count != 0) { + echo 1; + } + else + { + $stmt = $DB_con->prepare("insert into hotspot_users (username, password, firstname, lastname, date_added, user_level, status) + values(:username, :password, :firstname, :lastname, CURDATE(), :user_level, :status)"); + $stmt->execute(array(':username' => $username, ':password' => $password, ':firstname' => $firstname, + ':lastname' => $lastname, ':user_level' => $user_level, ':status' => $status)); + echo 2; + } +} +else { + echo 0; +} +// End Adding a new System User Details, Returned from modal_add_user.php +?> \ No newline at end of file diff --git a/ajax_adduser.php b/ajax_adduser.php new file mode 100644 index 0000000..620caf0 --- /dev/null +++ b/ajax_adduser.php @@ -0,0 +1,116 @@ +setMenu('/ip hotspot user'); +$iv = count($util); + +if ((!empty($username)) and (!empty($password)) and (!empty($profile))) { + if (intval($limit_bytes) != 0) { + $limit_bytes_total = (intval($limit_bytes) * 1024 * 1024 * 1024 ); + $util->add( + array( + 'name' => "$username", + 'password' => "$password", + 'limit-uptime' => "$limit_uptime", + 'limit-bytes-total' => "$limit_bytes_total", + 'profile' => "$profile" + ) + ); + } + else + { + $util->add( + array( + 'name' => "$username", + 'password' => "$password", + 'limit-uptime' => "$limit_uptime", + 'profile' => "$profile" + ) + ); + $limit_bytes = 0; // For Adding it to Local database + } + + if ($iv != count($util)) { + include('dbconfig.php'); + $stmt = $DB_con->prepare("SELECT booking_id from hotspot_vouchers ORDER BY booking_id DESC LIMIT 1"); + $stmt->execute(array()); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $booking_id = $row['booking_id']; + $booking_id++; + $uid = $booking_id.'-1-'.date('dmY'); + //$creator = $_SESSION['username'].'['.$_SESSION['id'].']'; + $stmt = $DB_con->prepare("UPDATE hotspot_vouchers set status=:status WHERE 1"); + $stmt->execute(array(':status' => 'Over')); + $stmt = $DB_con->prepare("insert into hotspot_vouchers (created_on, created_by, creator, user_name, password, printed_times, + printed_last, status, group_of, booking_id, limit_uptime, limit_bytes, profile, uid) + values(NOW(), :created_by, :creator, :user_name, :password, :printed_times, :printed_last, :status, :group_of, + :booking_id, :limit_uptime, :limit_bytes, :profile, :uid)"); + $stmt->execute(array(':created_by' => $_SESSION['username'], ':creator' => $_SESSION['id'], ':user_name' => $username, ':password' => $password, + ':printed_times' => 0, ':printed_last' => '', ':status' => 'Active', ':group_of' => 1, + ':booking_id' => $booking_id, ':limit_uptime' => $limit_uptime, ':limit_bytes' => $limit_bytes, + ':profile' => $profile, ':uid' => $uid)); + + // here starts Echo String + $echo_text =' +
+
+
+
+

Hotspot User Voucher

+
+
+
+ + + + + + + + + '; + $echo_text .= ' + + + + + '; + if (intval($limit_bytes) != 0) { + $echo_text .= ''; + } + else + { + $echo_text .= ''; + } + $echo_text .= ' + + +
UsernamePassword
Validity : '.$limit_uptime.'ays; Counts from First login; Data usage Maximum : '.$limit_bytes_total.' Bytes; Bandwidth : '.$profile.'; HAPPY BROWSING...Validity : '.$limit_uptime.'ays; Counts from First login; Bandwidth/Profile : '.$profile.'; HAPPY BROWSING...
+
+
+
+
+
+
+    +    +    +
+
+
'; + echo $echo_text; + } + else + { + echo ''; + } +} +//End Adding a Guest User +?> \ No newline at end of file diff --git a/ajax_addusers.php b/ajax_addusers.php new file mode 100644 index 0000000..6ce1efa --- /dev/null +++ b/ajax_addusers.php @@ -0,0 +1,90 @@ += 1 and $_SESSION['user_level'] <= 3) { + include('dbconfig.php'); + $stmt = $DB_con->prepare("SELECT booking_id from hotspot_vouchers ORDER BY booking_id DESC LIMIT 1"); + $stmt->execute(array()); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $booking_id = $row['booking_id']; + $booking_id++; + + $stmt = $DB_con->prepare("UPDATE hotspot_vouchers set status=:status WHERE 1"); + $stmt->execute(array(':status' => 'Over')); + + $stmt = $DB_con->prepare("insert into hotspot_vouchers (created_on, created_by, creator, user_name, password, printed_times, + printed_last, status, group_of, booking_id, limit_uptime, limit_bytes, profile, uid) + values(NOW(), :created_by, :creator, :user_name, :password, :printed_times, :printed_last, :status, :group_of, + :booking_id, :limit_uptime, :limit_bytes, :profile, :uid)"); + + $k = 1; + for($i=0; $i < $no_of_users; $i++){ + $passAlphabet = 'abcdefghikmnpqrstuvxyz23456789'; + $passAlphabetLimit = strlen($passAlphabet)-1; + $pass = ''; + $uid = ''; + for ($j = 0; $j < $passLength; ++$j) { + $pass .= $passAlphabet[mt_rand(0, $passAlphabetLimit)]; + } + for ($j = 0; $j < $passLength; ++$j) { + $uid .= $passAlphabet[mt_rand(0, $passAlphabetLimit)]; + } + $user_name = $user_prefix.$uid; + if ($same_pass == 2) { $pass_word = $pass; } else { $pass_word = $user_name; } + $util->setMenu('/ip hotspot user'); + $iv = count($util); + + + if (intval($limit_bytes) != 0) { + $limit_bytes_total = (intval($limit_bytes) * 1024 * 1024 * 1024 ); + $util->add( + array( + 'name' => "$user_name", + 'password' => "$pass_word", + 'limit-uptime' => "$limit_uptime", + 'limit-bytes-total' => "$limit_bytes_total", + 'profile' => "$profile" + ) + ); + } + else + { + $util->add( + array( + 'name' => "$user_name", + 'password' => "$pass_word", + 'limit-uptime' => "$limit_uptime", + 'profile' => "$profile" + ) + ); + $limit_bytes = 0; // For Adding it to Local database + } + + if ($iv != count($util)) { + $uid = $booking_id.'-'.$k.'-'.$no_of_users.date('dmY'); + //$creator = $_SESSION['username'].'['.$_SESSION['id'].']'; + $stmt->execute(array(':created_by' => $_SESSION['username'], ':creator' => $_SESSION['id'], ':user_name' => $user_name, ':password' => $pass_word, + ':printed_times' => 0, ':printed_last' => '', ':status' => 'Active', ':group_of' => $no_of_users, + ':booking_id' => $booking_id, ':limit_uptime' => $limit_uptime, ':limit_bytes' => $limit_bytes, + ':profile' => $profile, ':uid' => $uid)); + $k++; + } + } + echo $k - 1; //Successful +} +else + { + echo 0; // Not an Authorised User +} +?> \ No newline at end of file diff --git a/ajax_change_syspass.php b/ajax_change_syspass.php new file mode 100644 index 0000000..9cc9793 --- /dev/null +++ b/ajax_change_syspass.php @@ -0,0 +1,16 @@ +prepare("update hotspot_users set password = :np where user_id = :session_id"); + $stmt->execute(array(':np' => $np, ':session_id' => $_SESSION['id'])); + echo 1; + } +else + { + echo 0; +} +?> \ No newline at end of file diff --git a/ajax_del_profile.php b/ajax_del_profile.php new file mode 100644 index 0000000..ba40ee8 --- /dev/null +++ b/ajax_del_profile.php @@ -0,0 +1,40 @@ +setArgument('.proplist', '.id,name'); + $printRequest->setQuery(RouterOS\Query::where('name', $profile_name)); + + $idList = ''; + foreach ($client->sendSync($printRequest)->getAllOfType(RouterOS\Response::TYPE_DATA) as $item) { + $idList .= ',' . $item->getProperty('.id'); + } + $idList = substr($idList, 1); + //$idList now contains a comma separated list of all IDs. + + $removeRequest = new RouterOS\Request('/ip hotspot user profile remove'); + $removeRequest->setArgument('numbers', $idList); + $client->sendSync($removeRequest); + echo 2; //Success + } + else + { + echo 1; //Profile name Empty + } +} +else + { + echo 0; //Not Authorised +} +?> \ No newline at end of file diff --git a/ajax_del_sysuser.php b/ajax_del_sysuser.php new file mode 100644 index 0000000..9f5728e --- /dev/null +++ b/ajax_del_sysuser.php @@ -0,0 +1,16 @@ +prepare("delete from hotspot_users where user_id=:id and user_id != :myself"); + $stmt->execute(array(':id' => $id, ':myself' => $myself)); + echo 1; + } +else + { + echo 0; + } +// End Adding a new System User Details, Returned from modal_add_user.php +?> \ No newline at end of file diff --git a/ajax_edit_profile.php b/ajax_edit_profile.php new file mode 100644 index 0000000..4855cad --- /dev/null +++ b/ajax_edit_profile.php @@ -0,0 +1,65 @@ +setArgument('.proplist', '.id'); + $printRequest->setQuery(RouterOS\Query::where('name', $profile_name)); + $id = $client->sendSync($printRequest)->getProperty('.id'); + + $setRequest = new RouterOS\Request('/ip/hotspot/user/profile/set'); + $setRequest->setArgument('numbers', $id); + $setRequest->setArgument('rate-limit', $rate_limit); + if(strtolower($session_timeout) != 'none') { + $setRequest->setArgument('session-timeout', $session_timeout); + } + else + { + $setRequest->setArgument('session-timeout', '00:00:00'); + } + $setRequest->setArgument('shared-users', $shared_users); + $setRequest->setArgument('mac-cookie-timeout', $mac_cookie_timeout); + $setRequest->setArgument('keepalive-timeout', $keepalive_timeout); + + $client->sendSync($setRequest); + /* + if(strtolower($session_timeout) == 'none') { + $id = $client->sendSync(new Request('/ip/hotspot/user/profile/print .proplist=.id', null, Query::where('name', $profile_name)))->getArgument('.id'); + $util->setMenu('/ip hotspot user profile'); + $util->unsetValue($id, 'session-timeout'); + } */ + echo 2; //Success + } + else + { + echo 1; //Profile name Improper + } +} +else + { + echo 0; //Not Authorised +} +?> \ No newline at end of file diff --git a/ajax_edit_sysuser.php b/ajax_edit_sysuser.php new file mode 100644 index 0000000..f8c74c6 --- /dev/null +++ b/ajax_edit_sysuser.php @@ -0,0 +1,35 @@ +prepare("SELECT * FROM hotspot_users WHERE username = :username AND user_id != :user_id"); + $stmt->execute(array(':username' => $username, ':user_id' => $user_id)); + $count = $stmt->rowCount(); + + if ($count != 0) { + echo 1; + } + else + { + $firstname=$_GET['firstname']; + $lastname=$_GET['lastname']; + $user_level=$_GET['user_level']; + $status=$_GET['status']; + + $stmt = $DB_con->prepare("update hotspot_users set username=:username, firstname = :firstname , lastname = :lastname, + user_level = :user_level, status = :status where user_id= :user_id"); + $stmt->execute(array(':username' => $username, ':firstname' => $firstname, ':lastname' => $lastname, + ':user_level' => $user_level, ':user_id' => $user_id, ':status' => $status)); + echo 2; + } +} +else + { + echo 0; +} +// End Adding a new System User Details, Returned from modal_add_user.php +?> \ No newline at end of file diff --git a/ajax_expired.php b/ajax_expired.php new file mode 100644 index 0000000..3429e58 --- /dev/null +++ b/ajax_expired.php @@ -0,0 +1,31 @@ +setArgument('.proplist', '.id,limit-uptime,uptime,name'); + //$printRequest->setQuery(RouterOS\Query::where('name', 'admin', RouterOS\Query::OP_EQ) ->not()); + $printRequest->setQuery(RouterOS\Query::where('.id', '*0', RouterOS\Query::OP_EQ) ->not()); + + $idList = ''; + foreach ($client->sendSync($printRequest)->getAllOfType(RouterOS\Response::TYPE_DATA) as $item) { + if (!empty($item->getProperty('limit-uptime'))) { + if (!($item->getProperty('uptime') < $item->getProperty('limit-uptime'))) { + $idList .= ',' . $item->getProperty('.id'); + } + } + } + $idList = substr($idList, 1); + //$idList now contains a comma separated list of all IDs. + + $removeRequest = new RouterOS\Request('/ip hotspot user remove'); + $removeRequest->setArgument('numbers', $idList); + $client->sendSync($removeRequest); +} +//End Removing All Validity Expired Guest User Accounts +?> diff --git a/ajax_get_profiles.php b/ajax_get_profiles.php new file mode 100644 index 0000000..f69492e --- /dev/null +++ b/ajax_get_profiles.php @@ -0,0 +1,35 @@ +setMenu('/ip hotspot user profile print'); + $profile_name=$_GET['profile_name']; + + $printRequest = new RouterOS\Request('/ip hotspot user profile print'); + $printRequest->setArgument('.proplist', '.id,name,address-pool,rate-limit,session-timeout,shared-users,mac-cookie-timeout,keepalive-timeout'); + $printRequest->setQuery(RouterOS\Query::where('name', $profile_name)); + + foreach ($client->sendSync($printRequest)->getAllOfType(RouterOS\Response::TYPE_DATA) as $item) { + + $tname = $item->getProperty("name"); + $taddress_pool = $item->getProperty("address-pool"); + $tshared_users = $item->getProperty("shared-users"); + $trate_limit = $item->getProperty("rate-limit"); + $tsession_timeout = $item->getProperty("session-timeout"); + $tshared_users = $item->getProperty("shared-users"); + $tmac_cookie_timeout = $item->getProperty("mac-cookie-timeout"); + $tkeepalive_timeout = $item->getProperty("keepalive-timeout"); + + $arr = array('name' => $tname, 'address_pool' => $taddress_pool, 'rate_limit' => $trate_limit, 'session_timeout' => $tsession_timeout, + 'shared_users' => $tshared_users, 'mac_cookie_timeout' => $tmac_cookie_timeout, + 'keepalive_timeout' => $tkeepalive_timeout ); + + echo json_encode($arr); + } +} +?> \ No newline at end of file diff --git a/ajax_get_sysuser.php b/ajax_get_sysuser.php new file mode 100644 index 0000000..a25c3f5 --- /dev/null +++ b/ajax_get_sysuser.php @@ -0,0 +1,15 @@ +prepare("SELECT * FROM hotspot_users WHERE user_id =:user_id"); + $stmt->execute(array(':user_id' => $user_id)); + + $row=$stmt->fetch(PDO::FETCH_ASSOC); + echo json_encode($row); +} +// End Getting Sysuser details +?> \ No newline at end of file diff --git a/ajax_rem_selected.php b/ajax_rem_selected.php new file mode 100644 index 0000000..2633b2e --- /dev/null +++ b/ajax_rem_selected.php @@ -0,0 +1,38 @@ +setArgument('.proplist', '.id,name'); + $removeRequest = new RouterOS\Request('/ip/hotspot/user/remove'); + foreach ($guest_list as $guest) { + $i++; + //$printRequest->setArgument('.proplist', '.id,name'); + $printRequest->setQuery(RouterOS\Query::where('name', $guest)); + $id = $client->sendSync($printRequest)->getProperty('.id'); + + //$removeRequest = new RouterOS\Request('/ip/hotspot/user/remove'); + $removeRequest->setArgument('numbers', $id); + $client->sendSync($removeRequest); + } + echo $i; + } + else + { + echo -1; + } +} +else + { + echo 0; +} +//$id = $client->sendSync(new Request('/ip/hotspot/user/profile/print .proplist=.id', null, Query::where('name', $profile_name)))->getArgument('.id'); +?> \ No newline at end of file diff --git a/ajax_rem_user.php b/ajax_rem_user.php new file mode 100644 index 0000000..6a2f2b8 --- /dev/null +++ b/ajax_rem_user.php @@ -0,0 +1,18 @@ +setArgument('.proplist', '.id,name'); +$printRequest->setQuery(RouterOS\Query::where('name', $guest_name)); +$id = $client->sendSync($printRequest)->getProperty('.id'); + +$removeRequest = new RouterOS\Request('/ip/hotspot/user/remove'); +$removeRequest->setArgument('numbers', $id); +$client->sendSync($removeRequest); +?> \ No newline at end of file diff --git a/ajax_reset_pass.php b/ajax_reset_pass.php new file mode 100644 index 0000000..2174bbf --- /dev/null +++ b/ajax_reset_pass.php @@ -0,0 +1,26 @@ +prepare("SELECT * FROM hotspot_users WHERE user_id = :user_id"); + $stmt->execute(array(':user_id' => $user_id)); + $count = $stmt->rowCount(); + if ($count == 0){ + echo 1; + } + else + { + $stmt = $DB_con->prepare("update hotspot_users set password=:password where user_id= :user_id"); + $stmt->execute(array(':password' => $password, ':user_id' => $user_id)); + echo 2; + } +} +else + { + echo 0; +} +//End Resetting a System User Password, called from modal_reset_psd.php Modal +?> \ No newline at end of file diff --git a/ajax_uninitiated.php b/ajax_uninitiated.php new file mode 100644 index 0000000..a548c43 --- /dev/null +++ b/ajax_uninitiated.php @@ -0,0 +1,28 @@ +setArgument('.proplist', '.id,limit-uptime,uptime,name'); + //$printRequest->setQuery(RouterOS\Query::where('name', 'default-trial', RouterOS\Query::OP_EQ) ->not()); + $printRequest->setQuery(RouterOS\Query::where('.id', '*0', RouterOS\Query::OP_EQ) ->not()); + + $idList = ''; + foreach ($client->sendSync($printRequest)->getAllOfType(RouterOS\Response::TYPE_DATA) as $item) { + if ($item->getProperty('uptime') == 0) { + $idList .= ',' . $item->getProperty('.id'); + } + } + $idList = substr($idList, 1); + //$idList now contains a comma separated list of all IDs. + + $removeRequest = new RouterOS\Request('/ip hotspot user remove'); + $removeRequest->setArgument('numbers', $idList); + $client->sendSync($removeRequest); +} +//End Removing All Un-initiated Guest User Accounts +?> diff --git a/backup.php b/backup.php new file mode 100644 index 0000000..469b287 --- /dev/null +++ b/backup.php @@ -0,0 +1,66 @@ + + + + + +
+
+ +
+
+query( 'SHOW TABLES' ); + foreach ( $tables as $table ) { + //echo $table[0] . ' ... '; + flush(); + $sql = '-- TABLE: ' . $table[0] . PHP_EOL; + $create = $DB_con->query( 'SHOW CREATE TABLE `' . $table[0] . '`' )->fetch(); + $sql .= $create['Create Table'] . ';' . PHP_EOL; + fwrite( $f, $sql ); + + $rows = $DB_con->query( 'SELECT * FROM `' . $table[0] . '`' ); + $rows->setFetchMode( PDO::FETCH_ASSOC ); + foreach ( $rows as $row ) { + $row = array_map( array( $DB_con, 'quote' ), $row ); + $sql = 'INSERT INTO `' . $table[0] . '` (`' . implode( '`, `', array_keys( $row ) ) . '`) VALUES (' . implode( ', ', $row ) . ');' . PHP_EOL; + fwrite( $f, $sql ); + } + + $sql = PHP_EOL; + $result = fwrite( $f, $sql ); + if ( $result !== FALSE ) { + echo ''; + } else { + // echo 'ERROR!!' . PHP_EOL; + } + flush(); + } + fclose( $f ); +} catch (Exception $e) { + echo 'Damn it! ' . $e->getMessage() . PHP_EOL; +} +?> + download> + + \ No newline at end of file diff --git a/config.php b/config.php new file mode 100644 index 0000000..de9eb1d --- /dev/null +++ b/config.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/css/animate.css b/css/animate.css new file mode 100644 index 0000000..d4b92d9 --- /dev/null +++ b/css/animate.css @@ -0,0 +1,3591 @@ +.animated.delay-01 { + animation-delay: 0s; + -webkit-animation-delay: 0s; + -moz-animation-delay: 0s; + -o-animation-delay: 0s; +} + +.animated.delay-02 { + animation-delay: 0.5s; + -webkit-animation-delay: 0.5s; + -moz-animation-delay: 0.5s; + -o-animation-delay: 0.5s; +} + +.animated.delay-03 { + animation-delay: 1s; + -webkit-animation-delay: 1s; + -moz-animation-delay: 1s; + -o-animation-delay: 1s; +} + +.animated.delay-04 { + animation-delay: 1.5s; + -webkit-animation-delay: 1.5s; + -moz-animation-delay: 1.5s; + -o-animation-delay: 1.5s; +} + +.animated.delay-05 { + animation-delay: 2s; + -webkit-animation-delay: 2s; + -moz-animation-delay: 2s; + -o-animation-delay: 2s; +} + +.animated.delay-06 { + animation-delay: 2.5s; + -webkit-animation-delay: 2.5s; + -moz-animation-delay: 2.5s; + -o-animation-delay: 2.5s; +} + +.animated.delay-07 { + animation-delay: 3s; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -o-animation-delay: 3s; +} + +.animated.delay-08 { + animation-delay: 3.5s; + -webkit-animation-delay: 3.5s; + -moz-animation-delay: 3.5s; + -o-animation-delay: 3.5s; +} + +.animated.delay-09 { + animation-delay: 4s; + -webkit-animation-delay: 4s; + -moz-animation-delay: 4s; + -o-animation-delay: 4s; +} + +.animated.delay-10 { + animation-delay: 4.5s; + -webkit-animation-delay: 4.5s; + -moz-animation-delay: 4.5s; + -o-animation-delay: 4.5s; +} + +.animated.delay-11 { + animation-delay: 5s; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -o-animation-delay: 5s; +} + +.animated.delay-12 { + animation-delay: 5.5s; + -webkit-animation-delay: 5.5s; + -moz-animation-delay: 5.5s; + -o-animation-delay: 5.5s; +} + +.animated.delay-13 { + animation-delay: 6s; + -webkit-animation-delay: 6s; + -moz-animation-delay: 6s; + -o-animation-delay: 6s; +} + +.animated.delay-14 { + animation-delay: 6.5s; + -webkit-animation-delay: 6.5s; + -moz-animation-delay: 6.5s; + -o-animation-delay: 6.5s; +} + +.animated.delay-15 { + animation-delay: 7s; + -webkit-animation-delay: 7s; + -moz-animation-delay: 7s; + -o-animation-delay: 7s; +} + +.animated.delay-16 { + animation-delay: 7.5s; + -webkit-animation-delay: 7.5s; + -moz-animation-delay: 7.5s; + -o-animation-delay: 7.5s; +} + +.animated.delay-17 { + animation-delay: 8s; + -webkit-animation-delay: 8s; + -moz-animation-delay: 8s; + -o-animation-delay: 8s; +} + +.animated.delay-18 { + animation-delay: 8.5s; + -webkit-animation-delay: 8.5s; + -moz-animation-delay: 8.5s; + -o-animation-delay: 8.5s; +} + +.animated.delay-19 { + animation-delay: 9s; + -webkit-animation-delay: 9s; + -moz-animation-delay: 9s; + -o-animation-delay: 9s; +} + +.animated.delay-20 { + animation-delay: 9.5s; + -webkit-animation-delay: 9.5s; + -moz-animation-delay: 9.5s; + -o-animation-delay: 9.5s; +} + +.animated { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.hinge{ + -webkit-animation-duration:2s; + -moz-animation-duration:2s; + -ms-animation-duration:2s; + -o-animation-duration:2s; + animation-duration:2s; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% {opacity: 1;} 25%, 75% {opacity: 0;} +} + +@-moz-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@-o-keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +@keyframes flash { + 0%, 50%, 100% {opacity: 1;} + 25%, 75% {opacity: 0;} +} + +.flash { + -webkit-animation-name: flash; + -moz-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, 100% {-webkit-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} +} + +@-moz-keyframes shake { + 0%, 100% {-moz-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} +} + +@-o-keyframes shake { + 0%, 100% {-o-transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} + 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} +} + +@keyframes shake { + 0%, 100% {transform: translateX(0);} + 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + 20%, 40%, 60%, 80% {transform: translateX(10px);} +} + +.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} + 40% {-webkit-transform: translateY(-30px);} + 60% {-webkit-transform: translateY(-15px);} +} + +@-moz-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} + 40% {-moz-transform: translateY(-30px);} + 60% {-moz-transform: translateY(-15px);} +} + +@-o-keyframes bounce { + 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} + 40% {-o-transform: translateY(-30px);} + 60% {-o-transform: translateY(-15px);} +} +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} + 40% {transform: translateY(-30px);} + 60% {transform: translateY(-15px);} +} + +.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% {-webkit-transform: scale(1);} + 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} + 100% {-webkit-transform: scale(1) rotate(0);} +} + +@-moz-keyframes tada { + 0% {-moz-transform: scale(1);} + 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} + 100% {-moz-transform: scale(1) rotate(0);} +} + +@-o-keyframes tada { + 0% {-o-transform: scale(1);} + 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} + 100% {-o-transform: scale(1) rotate(0);} +} + +@keyframes tada { + 0% {transform: scale(1);} + 10%, 20% {transform: scale(0.9) rotate(-3deg);} + 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} + 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} + 100% {transform: scale(1) rotate(0);} +} + +.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } + 20% { -webkit-transform: rotate(15deg); } + 40% { -webkit-transform: rotate(-10deg); } + 60% { -webkit-transform: rotate(5deg); } + 80% { -webkit-transform: rotate(-5deg); } + 100% { -webkit-transform: rotate(0deg); } +} + +@-moz-keyframes swing { + 20% { -moz-transform: rotate(15deg); } + 40% { -moz-transform: rotate(-10deg); } + 60% { -moz-transform: rotate(5deg); } + 80% { -moz-transform: rotate(-5deg); } + 100% { -moz-transform: rotate(0deg); } +} + +@-o-keyframes swing { + 20% { -o-transform: rotate(15deg); } + 40% { -o-transform: rotate(-10deg); } + 60% { -o-transform: rotate(5deg); } + 80% { -o-transform: rotate(-5deg); } + 100% { -o-transform: rotate(0deg); } +} + +@keyframes swing { + 20% { transform: rotate(15deg); } + 40% { transform: rotate(-10deg); } + 60% { transform: rotate(5deg); } + 80% { transform: rotate(-5deg); } + 100% { transform: rotate(0deg); } +} + +.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { -webkit-transform: translateX(0%); } + 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } + 30% { -webkit-transform: translateX(20%) rotate(3deg); } + 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } + 60% { -webkit-transform: translateX(10%) rotate(2deg); } + 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } + 100% { -webkit-transform: translateX(0%); } +} + +@-moz-keyframes wobble { + 0% { -moz-transform: translateX(0%); } + 15% { -moz-transform: translateX(-25%) rotate(-5deg); } + 30% { -moz-transform: translateX(20%) rotate(3deg); } + 45% { -moz-transform: translateX(-15%) rotate(-3deg); } + 60% { -moz-transform: translateX(10%) rotate(2deg); } + 75% { -moz-transform: translateX(-5%) rotate(-1deg); } + 100% { -moz-transform: translateX(0%); } +} + +@-o-keyframes wobble { + 0% { -o-transform: translateX(0%); } + 15% { -o-transform: translateX(-25%) rotate(-5deg); } + 30% { -o-transform: translateX(20%) rotate(3deg); } + 45% { -o-transform: translateX(-15%) rotate(-3deg); } + 60% { -o-transform: translateX(10%) rotate(2deg); } + 75% { -o-transform: translateX(-5%) rotate(-1deg); } + 100% { -o-transform: translateX(0%); } +} + +@keyframes wobble { + 0% { transform: translateX(0%); } + 15% { transform: translateX(-25%) rotate(-5deg); } + 30% { transform: translateX(20%) rotate(3deg); } + 45% { transform: translateX(-15%) rotate(-3deg); } + 60% { transform: translateX(10%) rotate(2deg); } + 75% { transform: translateX(-5%) rotate(-1deg); } + 100% { transform: translateX(0%); } +} + +.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} +@-moz-keyframes pulse { + 0% { -moz-transform: scale(1); } + 50% { -moz-transform: scale(1.1); } + 100% { -moz-transform: scale(1); } +} +@-o-keyframes pulse { + 0% { -o-transform: scale(1); } + 50% { -o-transform: scale(1.1); } + 100% { -o-transform: scale(1); } +} +@keyframes pulse { + 0% { transform: scale(1); } + 50% { transform: scale(1.1); } + 100% { transform: scale(1); } +} + +.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + transform: perspective(400px) rotateX(10deg); + } + + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + transform: perspective(400px) rotateY(10deg); + } + + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-moz-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@-o-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} + +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} + +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-moz-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@-o-keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadeOut { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-20px); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} + +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} + +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(20px); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} + +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} + +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-20px); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} + +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} + +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(20px); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes slideInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes slideInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes slideInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 100% { + transform: translateY(0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + -moz-animation-name: slideInDown; + -o-animation-name: slideInDown; + animation-name: slideInDown; +} +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes slideInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes slideInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes slideInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 100% { + transform: translateX(0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + -moz-animation-name: slideInLeft; + -o-animation-name: slideInLeft; + animation-name: slideInLeft; +} +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes slideInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes slideInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes slideInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 100% { + transform: translateX(0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + -moz-animation-name: slideInRight; + -o-animation-name: slideInRight; + animation-name: slideInRight; +} +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes slideOutUp { + 0% { + -moz-transform: translateY(0); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes slideOutUp { + 0% { + -o-transform: translateY(0); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes slideOutUp { + 0% { + transform: translateY(0); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + -moz-animation-name: slideOutUp; + -o-animation-name: slideOutUp; + animation-name: slideOutUp; +} +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes slideOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes slideOutLeft { + 0% { + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes slideOutLeft { + 0% { + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + -moz-animation-name: slideOutLeft; + -o-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes slideOutRight { + 0% { + -moz-transform: translateX(0); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes slideOutRight { + 0% { + -o-transform: translateX(0); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes slideOutRight { + 0% { + transform: translateX(0); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + -moz-animation-name: slideOutRight; + -o-animation-name: slideOutRight; + animation-name: slideOutRight; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + } + + 100% { + -webkit-transform: scale(1); + } +} + +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(.3); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + + 70% { + -moz-transform: scale(.9); + } + + 100% { + -moz-transform: scale(1); + } +} + +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(.3); + } + + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + + 70% { + -o-transform: scale(.9); + } + + 100% { + -o-transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(.3); + } + + 50% { + opacity: 1; + transform: scale(1.05); + } + + 70% { + transform: scale(.9); + } + + 100% { + transform: scale(1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + + 80% { + -moz-transform: translateY(10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + + 80% { + -o-transform: translateY(10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + + 60% { + opacity: 1; + transform: translateY(-30px); + } + + 80% { + transform: translateY(10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + } +} + +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + + 80% { + -moz-transform: translateY(-10px); + } + + 100% { + -moz-transform: translateY(0); + } +} + +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + + 80% { + -o-transform: translateY(-10px); + } + + 100% { + -o-transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + transform: translateY(30px); + } + + 80% { + transform: translateY(-10px); + } + + 100% { + transform: translateY(0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + + 80% { + -moz-transform: translateX(-10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + + 80% { + -o-transform: translateX(-10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + transform: translateX(30px); + } + + 80% { + transform: translateX(-10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + } +} + +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + + 80% { + -moz-transform: translateX(10px); + } + + 100% { + -moz-transform: translateX(0); + } +} + +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + + 80% { + -o-transform: translateX(10px); + } + + 100% { + -o-transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + + 60% { + opacity: 1; + transform: translateX(-30px); + } + + 80% { + transform: translateX(10px); + } + + 100% { + transform: translateX(0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + } +} + +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + + 25% { + -moz-transform: scale(.95); + } + + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + + 100% { + opacity: 0; + -moz-transform: scale(.3); + } +} + +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + + 25% { + -o-transform: scale(.95); + } + + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + + 100% { + opacity: 0; + -o-transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + transform: scale(1); + } + + 25% { + transform: scale(.95); + } + + 50% { + opacity: 1; + transform: scale(1.1); + } + + 100% { + opacity: 0; + transform: scale(.3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} + +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} + +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(20px); + } + + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} + +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} + +@-o-keyframes bounceOutDown { + 0% { + -o-transform: translateY(0); + } + + 20% { + opacity: 1; + -o-transform: translateY(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + + 20% { + opacity: 1; + transform: translateY(-20px); + } + + 100% { + opacity: 0; + transform: translateY(2000px); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -o-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} + +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} + +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(20px); + } + + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} + +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} + +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + + 20% { + opacity: 1; + transform: translateX(-20px); + } + + 100% { + opacity: 0; + transform: translateX(2000px); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} + +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} + +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} + +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + -transform-origin: left bottom; + -transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} + +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} + +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes lightSpeedIn { + 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-moz-keyframes lightSpeedIn { + 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@-o-keyframes lightSpeedIn { + 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +@keyframes lightSpeedIn { + 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; } + 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; } + 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; } + 100% { transform: translateX(0%) skewX(0deg); opacity: 1; } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + -moz-animation-name: lightSpeedIn; + -o-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + -o-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedOut { + 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-moz-keyframes lightSpeedOut { + 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@-o-keyframes lightSpeedOut { + 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +@keyframes lightSpeedOut { + 0% { transform: translateX(0%) skewX(0deg); opacity: 1; } + 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + -moz-animation-name: lightSpeedOut; + -o-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +@-webkit-keyframes hinge { + 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } + 100% { -webkit-transform: translateY(700px); opacity: 0; } +} + +@-moz-keyframes hinge { + 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } + 100% { -moz-transform: translateY(700px); opacity: 0; } +} + +@-o-keyframes hinge { + 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } + 100% { -o-transform: translateY(700px); opacity: 0; } +} + +@keyframes hinge { + 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } + 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } + 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } + 100% { transform: translateY(700px); opacity: 0; } +} + +.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } +} + +@-moz-keyframes rollIn { + 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } +} + +@-o-keyframes rollIn { + 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } +} + +@keyframes rollIn { + 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } + 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } +} + +.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} + +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} + +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} diff --git a/css/awesome-bootstrap-checkbox.css b/css/awesome-bootstrap-checkbox.css new file mode 100644 index 0000000..ce7603d --- /dev/null +++ b/css/awesome-bootstrap-checkbox.css @@ -0,0 +1,317 @@ +.checkbox { + padding-left: 20px; +} +.checkbox label { + display: inline-block; + vertical-align: middle; + position: relative; + padding-left: 5px; +} +.checkbox label::before { + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + left: 0; + margin-left: -20px; + border: 1px solid #cccccc; + border-radius: 3px; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + transition: border 0.15s ease-in-out, color 0.15s ease-in-out; +} +.checkbox label::after { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 0; + top: 0; + margin-left: -20px; + padding-left: 3px; + padding-top: 1px; + font-size: 11px; + color: #555555; +} +.checkbox input[type="checkbox"], +.checkbox input[type="radio"] { + opacity: 0; + z-index: 1; +} +.checkbox input[type="checkbox"]:focus + label::before, +.checkbox input[type="radio"]:focus + label::before { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.checkbox input[type="checkbox"]:checked + label::after, +.checkbox input[type="radio"]:checked + label::after { + font-family: "FontAwesome"; + content: "\f00c"; +} +.checkbox input[type="checkbox"]:indeterminate + label::after, +.checkbox input[type="radio"]:indeterminate + label::after { + display: block; + content: ""; + width: 10px; + height: 3px; + background-color: #555555; + border-radius: 2px; + margin-left: -16.5px; + margin-top: 7px; +} +.checkbox input[type="checkbox"]:disabled + label, +.checkbox input[type="radio"]:disabled + label { + opacity: 0.65; +} +.checkbox input[type="checkbox"]:disabled + label::before, +.checkbox input[type="radio"]:disabled + label::before { + background-color: #eeeeee; + cursor: not-allowed; +} +.checkbox.checkbox-circle label::before { + border-radius: 50%; +} +.checkbox.checkbox-inline { + margin-top: 0; +} + +.checkbox-primary input[type="checkbox"]:checked + label::before, +.checkbox-primary input[type="radio"]:checked + label::before { + background-color: #337ab7; + border-color: #337ab7; +} +.checkbox-primary input[type="checkbox"]:checked + label::after, +.checkbox-primary input[type="radio"]:checked + label::after { + color: #fff; +} + +.checkbox-danger input[type="checkbox"]:checked + label::before, +.checkbox-danger input[type="radio"]:checked + label::before { + background-color: #d9534f; + border-color: #d9534f; +} +.checkbox-danger input[type="checkbox"]:checked + label::after, +.checkbox-danger input[type="radio"]:checked + label::after { + color: #fff; +} + +.checkbox-info input[type="checkbox"]:checked + label::before, +.checkbox-info input[type="radio"]:checked + label::before { + background-color: #5bc0de; + border-color: #5bc0de; +} +.checkbox-info input[type="checkbox"]:checked + label::after, +.checkbox-info input[type="radio"]:checked + label::after { + color: #fff; +} + +.checkbox-warning input[type="checkbox"]:checked + label::before, +.checkbox-warning input[type="radio"]:checked + label::before { + background-color: #f0ad4e; + border-color: #f0ad4e; +} +.checkbox-warning input[type="checkbox"]:checked + label::after, +.checkbox-warning input[type="radio"]:checked + label::after { + color: #fff; +} + +.checkbox-success input[type="checkbox"]:checked + label::before, +.checkbox-success input[type="radio"]:checked + label::before { + background-color: #5cb85c; + border-color: #5cb85c; +} +.checkbox-success input[type="checkbox"]:checked + label::after, +.checkbox-success input[type="radio"]:checked + label::after { + color: #fff; +} + +.checkbox-primary input[type="checkbox"]:indeterminate + label::before, +.checkbox-primary input[type="radio"]:indeterminate + label::before { + background-color: #337ab7; + border-color: #337ab7; +} + +.checkbox-primary input[type="checkbox"]:indeterminate + label::after, +.checkbox-primary input[type="radio"]:indeterminate + label::after { + background-color: #fff; +} + +.checkbox-danger input[type="checkbox"]:indeterminate + label::before, +.checkbox-danger input[type="radio"]:indeterminate + label::before { + background-color: #d9534f; + border-color: #d9534f; +} + +.checkbox-danger input[type="checkbox"]:indeterminate + label::after, +.checkbox-danger input[type="radio"]:indeterminate + label::after { + background-color: #fff; +} + +.checkbox-info input[type="checkbox"]:indeterminate + label::before, +.checkbox-info input[type="radio"]:indeterminate + label::before { + background-color: #5bc0de; + border-color: #5bc0de; +} + +.checkbox-info input[type="checkbox"]:indeterminate + label::after, +.checkbox-info input[type="radio"]:indeterminate + label::after { + background-color: #fff; +} + +.checkbox-warning input[type="checkbox"]:indeterminate + label::before, +.checkbox-warning input[type="radio"]:indeterminate + label::before { + background-color: #f0ad4e; + border-color: #f0ad4e; +} + +.checkbox-warning input[type="checkbox"]:indeterminate + label::after, +.checkbox-warning input[type="radio"]:indeterminate + label::after { + background-color: #fff; +} + +.checkbox-success input[type="checkbox"]:indeterminate + label::before, +.checkbox-success input[type="radio"]:indeterminate + label::before { + background-color: #5cb85c; + border-color: #5cb85c; +} + +.checkbox-success input[type="checkbox"]:indeterminate + label::after, +.checkbox-success input[type="radio"]:indeterminate + label::after { + background-color: #fff; +} + +.radio { + padding-left: 20px; +} +.radio label { + display: inline-block; + vertical-align: middle; + position: relative; + padding-left: 5px; +} +.radio label::before { + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + left: 0; + margin-left: -20px; + border: 1px solid #cccccc; + border-radius: 50%; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out; + transition: border 0.15s ease-in-out; +} +.radio label::after { + display: inline-block; + position: absolute; + content: " "; + width: 11px; + height: 11px; + left: 3px; + top: 3px; + margin-left: -20px; + border-radius: 50%; + background-color: #555555; + -webkit-transform: scale(0, 0); + -ms-transform: scale(0, 0); + -o-transform: scale(0, 0); + transform: scale(0, 0); + -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); +} +.radio input[type="radio"] { + opacity: 0; + z-index: 1; +} +.radio input[type="radio"]:focus + label::before { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.radio input[type="radio"]:checked + label::after { + -webkit-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); +} +.radio input[type="radio"]:disabled + label { + opacity: 0.65; +} +.radio input[type="radio"]:disabled + label::before { + cursor: not-allowed; +} +.radio.radio-inline { + margin-top: 0; +} + +.radio-primary input[type="radio"] + label::after { + background-color: #337ab7; +} +.radio-primary input[type="radio"]:checked + label::before { + border-color: #337ab7; +} +.radio-primary input[type="radio"]:checked + label::after { + background-color: #337ab7; +} + +.radio-danger input[type="radio"] + label::after { + background-color: #d9534f; +} +.radio-danger input[type="radio"]:checked + label::before { + border-color: #d9534f; +} +.radio-danger input[type="radio"]:checked + label::after { + background-color: #d9534f; +} + +.radio-info input[type="radio"] + label::after { + background-color: #5bc0de; +} +.radio-info input[type="radio"]:checked + label::before { + border-color: #5bc0de; +} +.radio-info input[type="radio"]:checked + label::after { + background-color: #5bc0de; +} + +.radio-warning input[type="radio"] + label::after { + background-color: #f0ad4e; +} +.radio-warning input[type="radio"]:checked + label::before { + border-color: #f0ad4e; +} +.radio-warning input[type="radio"]:checked + label::after { + background-color: #f0ad4e; +} + +.radio-success input[type="radio"] + label::after { + background-color: #5cb85c; +} +.radio-success input[type="radio"]:checked + label::before { + border-color: #5cb85c; +} +.radio-success input[type="radio"]:checked + label::after { + background-color: #5cb85c; +} + +input[type="checkbox"].styled:checked + label:after, +input[type="radio"].styled:checked + label:after { + font-family: 'FontAwesome'; + content: "\f00c"; +} +input[type="checkbox"] .styled:checked + label::before, +input[type="radio"] .styled:checked + label::before { + color: #fff; +} +input[type="checkbox"] .styled:checked + label::after, +input[type="radio"] .styled:checked + label::after { + color: #fff; +} \ No newline at end of file diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100644 index 0000000..b6fe4e0 --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/css/customModal.css b/css/customModal.css new file mode 100644 index 0000000..cd708ac --- /dev/null +++ b/css/customModal.css @@ -0,0 +1,168 @@ +.custom-modal { + display: none; + position: fixed; + z-index: 1053; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.5); +} + +.cmodal-content { + position: relative; + margin: 10% auto; + border: 1px solid #888; + border-radius: 10px; + width: 40%; + box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19); + -webkit-animation: cmodalmove .4s ; + -o-animation: cmodalmove .4s; + -moz-animation: cmodalmove .4s; + animation: cmodalmove .4s; +} + +@-webkit-keyframes cmodalmove { + 0% {top:-400px;} + 100% {top:0px;} +} + +@keyframes cmodalmove { + 0% {top:-400px;} + 100% {top:0px;} +} + +.cmodal-header { + display: block; + height: fit-content; + width: 100%; + border-radius: 10px 10px 0px 0px; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.25); + color: white; + padding: -30px; +} + +.cmodal-title { + font-size: 1.08em; + display: inline; + padding: 10px; + font-weight: 500; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +.cmodal-close:hover { + background-color: orangered; +} + +.cmodal-close { + float: right; + height: 100%; + border-color: rgba(0,0,0,0); + border-radius: 5px 5px 0px 5px; + text-align: center; + font-weight: bold; + box-shadow: none; + background: lightgrey; + cursor: pointer; +} + +.cmodal-body { + display: inline; +} + +.cmodal-message { + display: block; + padding: 20px 10px; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +.cmodal-icon { + float: right; +} + +.cmodal-footer { + display: block; + z-index: -1; + border-radius: 0px 0px 10px 10px; + background-color: rgb(255,255,255); + background-color: rgba(255,255,255,.4); + text-align: right; +} + +.cmodal-button { + display: inline; + margin: 3px 3px; + padding: 3px; + color: white; + min-width: 70px; + cursor: pointer; + border-radius: 6px; + border-color: black; + border-color: rgba(0,0,0,0); + -webkit-transition: all .2s; + -moz-transition: all .2s; + transition: all .2s; + text-decoration: none; + text-align: center; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +.cmodal-button:hover { + opacity: .95; + box-shadow: 2px 2px 1px black; +} + +.cmodal-ok { + background: green; + background: linear-gradient( green, mediumseagreen); +} + +.cmodal-cancel { + background: red; + background: linear-gradient( red, indianred); +} + +.cmodal-generic { + background: purple; + background: linear-gradient( purple, mediumpurple); +} + +.cmodal-blue { + background-color: skyblue; + background: linear-gradient( dodgerblue, deepskyblue); +} + +.error { + background: red; + background: -moz-linear-gradient(red, indianred); + background: -webkit-linear-gradient(red, indianred); + background: -o-linear-gradient(red, indianred); + background: linear-gradient(red, indianred); +} + +.information { + background: dodgerblue; + background: -moz-linear-gradient(dodgerblue, lightblue); + background: -webkit-linear-gradient(dodgerblue, lightblue); + background: -o-linear-gradient(dodgerblue, lightblue); + background: linear-gradient(dodgerblue, lightblue); +} + +.success { + background: green; + background: -moz-linear-gradient(green, mediumseagreen); + background: -webkit-linear-gradient(green, mediumseagreen); + background: -o-linear-gradient(green, mediumseagreen); + background: linear-gradient(green, mediumseagreen); +} + +.warning { + background: darkorange; + background: -moz-linear-gradient(orangered, darkorange); + background: -webkit-linear-gradient(orangered, darkorange); + background: -o-linear-gradient(orangered, darkorange); + background: linear-gradient(orangered, darkorange); +} \ No newline at end of file diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/css/print.css b/css/print.css new file mode 100644 index 0000000..29655fe --- /dev/null +++ b/css/print.css @@ -0,0 +1,77 @@ +.navbar{ +display:none; +} +.modal{ + display:none; +} +.action{ + display:none; +} +h1{ + text-transform:uppercase; +} +.title, img { + display:visible; +} +th{ + text-align:left; +} +td{ + text-align:left; + border-top:1px solid; + padding:2px; +} +.btn{ + display:none; +} +.alert{ + display:none; +} +body{ + font-family:arial; + font-size:13px; +} +.no_print{ + display:none; +} +.printable{ +display:visible; +} +span{ +text-transform:uppercase; +} +/* +.name span{ +display:block; +} +.name span strong{ +margin-left:10px; +} +.add_grade{ +display:none; +} +.act{ +display:none; +} +.logout{ +display:none; +} +#add{ +display:none; +} +.dataTables_filter{ +display:none; +} +.nav{ +display:none; +} +.dataTables_paginate { +display:none; +} +#example_length{ +display:none; +} +.dataTables_info{ + display:none; +} +*/ \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..c58c837 --- /dev/null +++ b/css/style.css @@ -0,0 +1,341 @@ +@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300,700,600); +@import url(http://fonts.googleapis.com/css?family=Oswald:400,300); + +body { + background: url(../images/bg.jpg); + background-attachment: fixed; + background-size: cover; + background-position: 50% 50%; + font-family: 'Open Sans', sans-serif; +} + +a, +a:hover, +a:focus, +a:active, +a.active { + outline: 0; +} + +ul,ol { + margin: 0; + padding: 0; +} + +li { + list-style: none; +} + +a { + color: #FF432E; + text-decoration: none; +} + +a:hover { + text-decoration: none; +} + +p { + font-family: 'Open Sans', sans-serif; + font-size: 13px; + line-height: 21px; +} + +/**** Start Logo Section ****/ + +#logo-section { + +} + +.logo h1 { + font-family: 'Lobster', cursive; + color: #fff; + font-size: 60px; +} + +.logo span { + color: #999; +} + + + +/**** Start Background Color ****/ + +.blue { + background: #28ABE3; +} + +.green { + background: #72bf48; +} + +.red { + background: #FF432E; +} + +.olive { + background: #808000; +} + +.purple { + background: #800080; +} +.fuchsia { + background: #FF00FF; +} +.navy { + background: #000080; +} +.bisque { + background: #FFE4C4; +} +.gold { + background: #FFD700; +} +.skyblue { + background: #87CEEB; +} +.lavender { + background: #E6E6FA; +} +.coral { + background: #FB7F50; /* wrong code for color */ +} + + +/**** Start Main Body Section ****/ +.mainbody-section { + padding-top: 50px; + padding-bottom: 30px; +} + +.menu-item { + color: #fff; + padding-top: 20px; + padding-bottom: 20px; + margin-bottom: 30px; + -webkit-transition: all 0.3s; + transition: all 0.3s; + +} + +.menu-item a { + color: #fff; + display: block; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} + +.menu-item a p { + font-family: 'Oswald', sans-serif; + font-weight: 300; + font-size: 20px; +} + +.menu-item a i { + font-size: 50px; + padding-bottom: 20px; +} + +.menu-item:hover a { + text-decoration: none; + //color: #333; + animation: wobble; + -webkit-animation: wobble; + animation-duration: 1000ms; + -webkit-animation-duration: 1000ms; +} + +@media only screen +and (min-width : 600px) +and (max-width : 991px) { + + .menu-item { + display: inline-block; + width: 32.8%; + } + + .menu-item.responsive { + width: 49.5%; + float: left; + margin-right: 3px; + } + + .menu-item.responsive-2 { + width: 49.5%; + float: right; + } + +} + +@media only screen +and (min-width : 992px) +and (max-width : 1199px) { + + .menu-item { + padding-top: 15px; + padding-bottom: 15px; + } + + .menu-item a i { + font-size: 32px; + } + + .menu-item a p { + font-size: 16px; + } + +} + +/**** Start Modal Section ****/ + +.modal-content { + overflow:visible !important; +} +.child-modal .modal-content { + padding: 50px 0 !important; + margin-top: 120px !important; + margin-right: 20px !important; + margin-left: 20px !important; + margin-bottom: 80px !important; + min-height: auto !important; + border: 2 !important; + border-radius: 6 !important; + background-clip: border-box; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: 10px 10px 5px 3px #888888 !important; + font-weight: 200; + color: #666 !important; + font-family: 'Oswald', sans-serif; + text-transform: none; +} + +.modal-footer { + padding: 1px !important; +} + +table#table-01 { + width:100%; + border-radius: 10 !important; + border-spacing: 5px !important; +} +table, th, td { + border: 1px solid black; + border-collapse: collapse; + border-spacing: 5px !important; +} +th, td { + padding: 5px; + text-align: left; +} +table#table-01 tr:nth-child(even) { + background-color: #eee; +} +table#table-01 tr:nth-child(odd) { + background-color:#fff; +} +table#table-01 th { + background-color: black; + color: white; +} +.card-columns { + + @include media-breakpoint-only(lg) { + column-count: 4; + } + @include media-breakpoint-only(xl) { + column-count: 5; + } + @include media-breakpoint-only(sm) { + column-count: 3; + } + @include media-breakpoint-only(xs) { + column-count: 3; +} +} +img.center { + display: block; + margin: 0 auto; +} +.center-element { +width: 100%; +margin: 0px auto 0px auto; +} +/* +@media print { + *, + *:before,enter code here + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +*/ \ No newline at end of file diff --git a/database.php b/database.php new file mode 100644 index 0000000..b4eed96 --- /dev/null +++ b/database.php @@ -0,0 +1,60 @@ +prepare("SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("SET time_zone = '+05:30'"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("CREATE TABLE IF NOT EXISTS `hotspot_users` ( + `user_id` int(11) NOT NULL, + `email` varchar(200) NOT NULL, + `date_added` date NOT NULL, + `firstname` varchar(30) NOT NULL, + `lastname` varchar(30) NOT NULL, + `password` varchar(60) NOT NULL, + `created_at` datetime NOT NULL, + `username` varchar(30) NOT NULL, + `user_level` int(11) NOT NULL DEFAULT '3', + `user_group` int(1) NOT NULL, + `image_path` varchar(50) NOT NULL, + `thumb_path` varchar(50) NOT NULL, + `status` varchar(20) NOT NULL +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("ALTER TABLE `hotspot_users` + ADD PRIMARY KEY (`user_id`), + ADD KEY `username` (`username`)"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("ALTER TABLE `hotspot_users` + MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("CREATE TABLE IF NOT EXISTS `hotspot_vouchers` ( + `id` int(11) NOT NULL, + `created_on` datetime DEFAULT NULL, + `created_by` varchar(30) DEFAULT NULL, + `creator` int(3) DEFAULT NULL, + `user_name` varchar(30) DEFAULT NULL, + `password` varchar(30) DEFAULT NULL, + `printed_times` int(3) DEFAULT NULL, + `printed_last` varchar(30) DEFAULT NULL, + `status` varchar(10) DEFAULT NULL, + `group_of` int(4) DEFAULT NULL, + `booking_id` int(11) DEFAULT NULL, + `limit_uptime` varchar(30) DEFAULT NULL, + `limit_bytes` varchar(30) DEFAULT NULL, + `profile` varchar(30) DEFAULT NULL, + `uid` VARCHAR(30) NOT NULL +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("ALTER TABLE `hotspot_vouchers` + ADD PRIMARY KEY (`id`)"); +$stmt->execute(array()); + +$stmt = $DB_con->prepare("ALTER TABLE `hotspot_vouchers` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT"); +$stmt->execute(array()); +?> \ No newline at end of file diff --git a/db_backup_20_09_2016_14_11_47.sql b/db_backup_20_09_2016_14_11_47.sql new file mode 100644 index 0000000..7f6f664 --- /dev/null +++ b/db_backup_20_09_2016_14_11_47.sql @@ -0,0 +1,918 @@ +-- TABLE: hotspot_customers +CREATE TABLE `hotspot_customers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `customer_id` varchar(30) NOT NULL, + `company` varchar(64) NOT NULL, + `address` varchar(128) NOT NULL, + `telephone` varchar(30) NOT NULL, + `mobile` varchar(30) NOT NULL, + `email` varchar(30) NOT NULL, + `state` varchar(30) NOT NULL, + `country` varchar(30) NOT NULL, + `validity` varchar(10) NOT NULL, + `created_on` datetime DEFAULT NULL, + `valid_till` datetime DEFAULT NULL, + `pub_key` varchar(30) NOT NULL, + `priv_key` varchar(30) NOT NULL, + `hits` int(11) DEFAULT '0', + `error_hit` int(11) DEFAULT '0', + `comment` varchar(50) NOT NULL, + `ip` varchar(15) NOT NULL, + `mac_id` varchar(30) NOT NULL, + `status` varchar(15) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +INSERT INTO `hotspot_customers` (`id`, `customer_id`, `company`, `address`, `telephone`, `mobile`, `email`, `state`, `country`, `validity`, `created_on`, `valid_till`, `pub_key`, `priv_key`, `hits`, `error_hit`, `comment`, `ip`, `mac_id`, `status`) VALUES ('1', 'jaison123', 'Inspire Digital Solutions', 'Karippayil Building, NH 183, Kumily - 685 509', 'telephone', 'mobile', 'mail@zetone.com', 'Tamilnadu', 'Pakistan', '1 Month', '2016-09-16 00:00:00', '2016-10-20 00:00:00', 'J3NZY-L9NAW-52MY2-I5P9H-L2U3L', 'WKTQN-P359T-NP7EO-DXXY2-S3ZMD', '7', '4', '00-16-EA-7C-10-38', '', '00-16-EA-7C-10-38', 'Active'); +INSERT INTO `hotspot_customers` (`id`, `customer_id`, `company`, `address`, `telephone`, `mobile`, `email`, `state`, `country`, `validity`, `created_on`, `valid_till`, `pub_key`, `priv_key`, `hits`, `error_hit`, `comment`, `ip`, `mac_id`, `status`) VALUES ('2', 'Jinu Devasia', 'Zetozone Technologies', 'Karippayil Building, NH 183, Kumily - 685 509', '9961144235', '9656224691', 'jinu@live.in', 'Kerala', 'India', 'Lifetime', '2016-09-20 00:00:00', '2019-06-16 00:00:00', 'JF94O-YBA7B-ZSHHF-KFABI-JUWP2', 'UUY5G-QZB7L-59HDW-SSE9L-TFIJF', '0', '0', '', '', '18:10:18', 'Deleted'); + +-- TABLE: hotspot_users +CREATE TABLE `hotspot_users` ( + `user_id` int(11) NOT NULL AUTO_INCREMENT, + `email` varchar(200) NOT NULL, + `date_added` date NOT NULL, + `firstname` varchar(30) NOT NULL, + `lastname` varchar(30) NOT NULL, + `password` varchar(60) NOT NULL, + `created_at` datetime NOT NULL, + `username` varchar(30) NOT NULL, + `user_level` int(11) NOT NULL DEFAULT '3', + `user_group` int(1) NOT NULL, + `image_path` varchar(50) NOT NULL, + `thumb_path` varchar(50) NOT NULL, + `status` varchar(20) NOT NULL, + PRIMARY KEY (`user_id`), + KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; +INSERT INTO `hotspot_users` (`user_id`, `email`, `date_added`, `firstname`, `lastname`, `password`, `created_at`, `username`, `user_level`, `user_group`, `image_path`, `thumb_path`, `status`) VALUES ('1', '', '2016-09-20', 'Administrator', '', 'd033e22ae348aeb5660fc2140aec35850c4da997', '2016-09-20 11:49:31', 'admin', '1', '1', '', '', 'Active'); +INSERT INTO `hotspot_users` (`user_id`, `email`, `date_added`, `firstname`, `lastname`, `password`, `created_at`, `username`, `user_level`, `user_group`, `image_path`, `thumb_path`, `status`) VALUES ('3', '', '2016-09-20', 'Head User', 'Master', '5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', '0000-00-00 00:00:00', 'admin2', '3', '0', '', '', 'Active'); + +-- TABLE: wp_wp_commentmeta +CREATE TABLE `wp_wp_commentmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`meta_id`), + KEY `comment_id` (`comment_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- TABLE: wp_wp_comments +CREATE TABLE `wp_wp_comments` ( + `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT '0', + `comment_author` tinytext NOT NULL, + `comment_author_email` varchar(100) NOT NULL DEFAULT '', + `comment_author_url` varchar(200) NOT NULL DEFAULT '', + `comment_author_IP` varchar(100) NOT NULL DEFAULT '', + `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `comment_content` text NOT NULL, + `comment_karma` int(11) NOT NULL DEFAULT '0', + `comment_approved` varchar(20) NOT NULL DEFAULT '1', + `comment_agent` varchar(255) NOT NULL DEFAULT '', + `comment_type` varchar(20) NOT NULL DEFAULT '', + `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`comment_ID`), + KEY `comment_post_ID` (`comment_post_ID`), + KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), + KEY `comment_date_gmt` (`comment_date_gmt`), + KEY `comment_parent` (`comment_parent`), + KEY `comment_author_email` (`comment_author_email`(10)) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- TABLE: wp_wp_links +CREATE TABLE `wp_wp_links` ( + `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `link_url` varchar(255) NOT NULL DEFAULT '', + `link_name` varchar(255) NOT NULL DEFAULT '', + `link_image` varchar(255) NOT NULL DEFAULT '', + `link_target` varchar(25) NOT NULL DEFAULT '', + `link_description` varchar(255) NOT NULL DEFAULT '', + `link_visible` varchar(20) NOT NULL DEFAULT 'Y', + `link_owner` bigint(20) unsigned NOT NULL DEFAULT '1', + `link_rating` int(11) NOT NULL DEFAULT '0', + `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `link_rel` varchar(255) NOT NULL DEFAULT '', + `link_notes` mediumtext NOT NULL, + `link_rss` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`link_id`), + KEY `link_visible` (`link_visible`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- TABLE: wp_wp_options +CREATE TABLE `wp_wp_options` ( + `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `option_name` varchar(191) NOT NULL DEFAULT '', + `option_value` longtext NOT NULL, + `autoload` varchar(20) NOT NULL DEFAULT 'yes', + PRIMARY KEY (`option_id`), + UNIQUE KEY `option_name` (`option_name`) +) ENGINE=InnoDB AUTO_INCREMENT=370 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('1', 'siteurl', 'http://hotspot.helloperiyar.com', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('2', 'home', 'http://hotspot.helloperiyar.com', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('3', 'blogname', 'Easy HotSpot', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('4', 'blogdescription', 'A Simple WiFi Hotspot User Management Utility', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('5', 'users_can_register', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('6', 'admin_email', 'sibyperiyar@gmail.com', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('7', 'start_of_week', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('8', 'use_balanceTags', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('9', 'use_smilies', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('10', 'require_name_email', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('11', 'comments_notify', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('12', 'posts_per_rss', '10', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('13', 'rss_use_excerpt', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('14', 'mailserver_url', 'mail.example.com', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('15', 'mailserver_login', 'login@example.com', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('16', 'mailserver_pass', 'password', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('17', 'mailserver_port', '110', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('18', 'default_category', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('19', 'default_comment_status', 'closed', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('20', 'default_ping_status', 'closed', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('21', 'default_pingback_flag', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('22', 'posts_per_page', '30', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('23', 'date_format', 'F j, Y', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('24', 'time_format', 'g:i a', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('25', 'links_updated_date_format', 'F j, Y g:i a', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('26', 'comment_moderation', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('27', 'moderation_notify', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('28', 'permalink_structure', '/%postname%/', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('30', 'hack_file', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('31', 'blog_charset', 'UTF-8', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('32', 'moderation_keys', '', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('33', 'active_plugins', 'a:0:{}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('34', 'category_base', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('35', 'ping_sites', 'http://rpc.pingomatic.com/', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('36', 'comment_max_links', '2', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('37', 'gmt_offset', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('38', 'default_email_category', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('39', 'recently_edited', 'a:5:{i:0;s:99:\"D:\\PLESKVHOST\\vhosts\\helloperiyar.com\\hotspot.helloperiyar.com/wp-content/themes/photolog/style.css\";i:1;s:116:\"D:\\PLESKVHOST\\vhosts\\helloperiyar.com\\hotspot.helloperiyar.com/wp-content/themes/photolog/template-parts/content.php\";i:3;s:99:\"D:\\PLESKVHOST\\vhosts\\helloperiyar.com\\hotspot.helloperiyar.com/wp-content/themes/photolog/index.php\";i:4;s:103:\"D:\\PLESKVHOST\\vhosts\\helloperiyar.com\\hotspot.helloperiyar.com/wp-content/themes/photolog/functions.php\";i:5;s:100:\"D:\\PLESKVHOST\\vhosts\\helloperiyar.com\\hotspot.helloperiyar.com/wp-content/themes/photolog/footer.php\";}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('40', 'template', 'photolog', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('41', 'stylesheet', 'photolog', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('42', 'comment_whitelist', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('43', 'blacklist_keys', '', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('44', 'comment_registration', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('45', 'html_type', 'text/html', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('46', 'use_trackback', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('47', 'default_role', 'subscriber', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('48', 'db_version', '37965', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('49', 'uploads_use_yearmonth_folders', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('50', 'upload_path', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('51', 'blog_public', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('52', 'default_link_category', '2', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('53', 'show_on_front', 'posts', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('54', 'tag_base', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('55', 'show_avatars', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('56', 'avatar_rating', 'G', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('57', 'upload_url_path', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('58', 'thumbnail_size_w', '150', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('59', 'thumbnail_size_h', '150', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('60', 'thumbnail_crop', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('61', 'medium_size_w', '300', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('62', 'medium_size_h', '300', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('63', 'avatar_default', 'mystery', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('64', 'large_size_w', '1024', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('65', 'large_size_h', '1024', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('66', 'image_default_link_type', 'none', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('67', 'image_default_size', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('68', 'image_default_align', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('69', 'close_comments_for_old_posts', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('70', 'close_comments_days_old', '14', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('71', 'thread_comments', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('72', 'thread_comments_depth', '5', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('73', 'page_comments', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('74', 'comments_per_page', '50', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('75', 'default_comments_page', 'newest', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('76', 'comment_order', 'asc', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('77', 'sticky_posts', 'a:0:{}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('78', 'widget_categories', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('79', 'widget_text', 'a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('80', 'widget_rss', 'a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('81', 'uninstall_plugins', 'a:0:{}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('82', 'timezone_string', 'Asia/Colombo', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('83', 'page_for_posts', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('84', 'page_on_front', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('85', 'default_post_format', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('86', 'link_manager_enabled', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('87', 'finished_splitting_shared_terms', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('88', 'site_icon', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('89', 'medium_large_size_w', '768', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('90', 'medium_large_size_h', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('91', 'initial_db_version', '36686', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('92', 'wp_wp_user_roles', 'a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:61:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:34:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('93', 'widget_search', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('94', 'widget_recent-posts', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('95', 'widget_recent-comments', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('96', 'widget_archives', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('97', 'widget_meta', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('98', 'sidebars_widgets', 'a:5:{s:19:\"wp_inactive_widgets\";a:0:{}s:8:\"footer-1\";a:1:{i:0;s:10:\"nav_menu-3\";}s:8:\"footer-2\";a:1:{i:0;s:10:\"nav_menu-4\";}s:8:\"footer-3\";a:1:{i:0;s:10:\"nav_menu-5\";}s:13:\"array_version\";i:3;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('99', 'widget_pages', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('100', 'widget_calendar', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('101', 'widget_tag_cloud', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('102', 'widget_nav_menu', 'a:4:{i:3;a:1:{s:8:\"nav_menu\";i:4;}i:4;a:1:{s:8:\"nav_menu\";i:5;}i:5;a:1:{s:8:\"nav_menu\";i:6;}s:12:\"_multiwidget\";i:1;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('103', 'cron', 'a:4:{i:1474386506;a:3:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1474435920;a:1:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1474436731;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}s:7:\"version\";i:2;}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('106', 'WPLANG', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('108', 'rewrite_rules', 'a:85:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:12:\"robots\\.txt$\";s:18:\"index.php?robots=1\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('109', 'db_upgraded', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('116', '_site_transient_timeout_browser_aa7adcc5662813180f8b2225f232c91f', '1474695120', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('117', '_site_transient_browser_aa7adcc5662813180f8b2225f232c91f', 'a:9:{s:8:\"platform\";s:7:\"Windows\";s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:13:\"52.0.2743.116\";s:10:\"update_url\";s:28:\"http://www.google.com/chrome\";s:7:\"img_src\";s:49:\"http://s.wordpress.org/images/browsers/chrome.png\";s:11:\"img_src_ssl\";s:48:\"https://wordpress.org/images/browsers/chrome.png\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('119', '_transient_timeout_feed_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1474133550', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('120', '_transient_timeout_feed_mod_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1474133550', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('121', '_transient_feed_mod_ac0b00fe65abe10e0c5b588f3ed8c7ca', '1474090350', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('122', '_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9', '1474133551', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('123', '_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9', '1474133551', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('124', '_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9', '1474090351', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('125', '_transient_timeout_feed_b9388c83948825c1edaef0d856b7b109', '1474133551', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('126', '_transient_feed_b9388c83948825c1edaef0d856b7b109', 'a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n \n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:117:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"WordPress Plugins View: Popular\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:45:\"https://wordpress.org/plugins/browse/popular/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"WordPress Plugins View: Popular\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"en-US\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 17 Sep 2016 05:11:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"http://bbpress.org/?v=1.1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:30:{i:0;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:21:\"Really Simple CAPTCHA\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"https://wordpress.org/plugins/really-simple-captcha/#post-9542\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 09 Mar 2009 02:17:35 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"9542@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:138:\"Really Simple CAPTCHA is a CAPTCHA module intended to be called from other plugins. It is originally created for my Contact Form 7 plugin.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Takayuki Miyoshi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"TinyMCE Advanced\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"https://wordpress.org/plugins/tinymce-advanced/#post-2082\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 27 Jun 2007 15:00:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"2082@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"Extends and enhances TinyMCE, the WordPress Visual Editor.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Andrew Ozz\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Hello Dolly\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"https://wordpress.org/plugins/hello-dolly/#post-5790\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 29 May 2008 22:11:34 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"5790@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:150:\"This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"Jetpack by WordPress.com\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"https://wordpress.org/plugins/jetpack/#post-23862\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 20 Jan 2011 02:21:38 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"23862@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:107:\"Increase your traffic, view your stats, speed up your site, and protect yourself from hackers with Jetpack.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Automattic\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Contact Form 7\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"https://wordpress.org/plugins/contact-form-7/#post-2141\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 02 Aug 2007 12:45:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"2141@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:54:\"Just another contact form plugin. Simple but flexible.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Takayuki Miyoshi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"Google XML Sitemaps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"https://wordpress.org/plugins/google-sitemap-generator/#post-132\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 09 Mar 2007 22:31:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"132@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:105:\"This plugin will generate a special XML sitemap which will help search engines to better index your blog.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Arne Brachhold\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:21:\"Regenerate Thumbnails\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"https://wordpress.org/plugins/regenerate-thumbnails/#post-6743\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 23 Aug 2008 14:38:58 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"6743@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"Allows you to regenerate your thumbnails after changing the thumbnail sizes.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"Alex Mills (Viper007Bond)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:22:\"Advanced Custom Fields\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"https://wordpress.org/plugins/advanced-custom-fields/#post-25254\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 17 Mar 2011 04:07:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"25254@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"Customise WordPress with powerful, professional and intuitive fields\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"elliotcondon\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"WordPress Importer\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"https://wordpress.org/plugins/wordpress-importer/#post-18101\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 20 May 2010 17:42:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"18101@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:101:\"Import posts, pages, comments, custom fields, categories, tags and more from a WordPress export file.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Brian Colinger\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"NextGEN Gallery\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/plugins/nextgen-gallery/#post-1169\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 23 Apr 2007 20:08:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"1169@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:121:\"The most popular WordPress gallery plugin and one of the most popular plugins of all time with over 15 million downloads.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"Alex Rabe\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"WooCommerce\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/plugins/woocommerce/#post-29860\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 Sep 2011 08:13:36 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"29860@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"WooCommerce is a powerful, extendable eCommerce plugin that helps you sell anything. Beautifully.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"WooThemes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"All in One SEO Pack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"https://wordpress.org/plugins/all-in-one-seo-pack/#post-753\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 30 Mar 2007 20:08:18 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"753@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:150:\"The most downloaded plugin for WordPress (almost 30 million downloads). Use All in One SEO Pack to automatically optimize your site for Search Engines\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"uberdose\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Duplicate Post\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"https://wordpress.org/plugins/duplicate-post/#post-2646\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 05 Dec 2007 17:40:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"2646@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:22:\"Clone posts and pages.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Lopo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Wordfence Security\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"https://wordpress.org/plugins/wordfence/#post-29832\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 04 Sep 2011 03:13:51 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"29832@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:150:\"Secure your website with the Wordfence security plugin for WordPress. Wordfence provides free enterprise-class WordPress security, protecting your we\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"Wordfence\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"W3 Total Cache\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/plugins/w3-total-cache/#post-12073\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 29 Jul 2009 18:46:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"12073@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:132:\"Easy Web Performance Optimization (WPO) using caching: browser, page, object, database, minify and content delivery network support.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Frederick Townes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"WP-PageNavi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"https://wordpress.org/plugins/wp-pagenavi/#post-363\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 09 Mar 2007 23:17:57 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"363@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Adds a more advanced paging navigation interface.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Lester Chan\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Akismet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"https://wordpress.org/plugins/akismet/#post-15\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 09 Mar 2007 22:11:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"15@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:98:\"Akismet checks your comments against the Akismet Web service to see if they look like spam or not.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WP Super Cache\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"https://wordpress.org/plugins/wp-super-cache/#post-2572\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 Nov 2007 11:40:04 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"2572@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"A very fast caching engine for WordPress that produces static html files.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Donncha O Caoimh\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"Google Analytics by MonsterInsights\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/plugins/google-analytics-for-wordpress/#post-2316\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 14 Sep 2007 12:15:27 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"2316@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:113:\"Connect Google Analytics with WordPress by adding your Google Analytics tracking code. Get the stats that matter.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Syed Balkhi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"Yoast SEO\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:54:\"https://wordpress.org/plugins/wordpress-seo/#post-8321\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 01 Jan 2009 20:34:44 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"8321@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:114:\"Improve your WordPress SEO: Write better content and have a fully optimized WordPress site using Yoast SEO plugin.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Joost de Valk\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"Page Builder by SiteOrigin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"https://wordpress.org/plugins/siteorigin-panels/#post-51888\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 11 Apr 2013 10:36:42 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"51888@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"Build responsive page layouts using the widgets you know and love using this simple drag and drop page builder.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Greg Priday\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Disable Comments\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"https://wordpress.org/plugins/disable-comments/#post-26907\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 27 May 2011 04:42:58 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"26907@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:134:\"Allows administrators to globally disable comments on their site. Comments can be disabled according to post type. Multisite friendly.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Samir Shah\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"UpdraftPlus WordPress Backup Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/plugins/updraftplus/#post-38058\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 21 May 2012 15:14:11 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"38058@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:148:\"Backup and restoration made easy. Complete backups; manual or scheduled (backup to S3, Dropbox, Google Drive, Rackspace, FTP, SFTP, email + others).\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"David Anderson\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"Clef Two-Factor Authentication\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wordpress.org/plugins/wpclef/#post-47509\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Dec 2012 01:25:57 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"47509@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:139:\"Modern two-factor that people love to use: strong authentication without passwords or tokens; single sign on/off; magical login experience.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"Dave Ross\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"WP Multibyte Patch\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"https://wordpress.org/plugins/wp-multibyte-patch/#post-28395\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 14 Jul 2011 12:22:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"28395@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"Multibyte functionality enhancement for the WordPress Japanese package.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"plugin-master\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"Google Analytics Dashboard for WP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"https://wordpress.org/plugins/google-analytics-dashboard-for-wp/#post-50539\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 10 Mar 2013 17:07:11 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"50539@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:127:\"Displays Google Analytics reports in your WordPress Dashboard. Inserts the latest Google Analytics tracking code in your pages.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Alin Marcu\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:27:\"Black Studio TinyMCE Widget\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/plugins/black-studio-tinymce-widget/#post-31973\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 10 Nov 2011 15:06:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"31973@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"The visual editor widget for Wordpress.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Marco Chiesi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Duplicator\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"https://wordpress.org/plugins/duplicator/#post-26607\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 16 May 2011 12:15:41 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"26607@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"Duplicate, clone, backup, move and transfer an entire site from one location to another.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Cory Lamle\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"iThemes Security (formerly Better WP Security)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"https://wordpress.org/plugins/better-wp-security/#post-21738\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 22 Oct 2010 22:06:05 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"21738@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:146:\"Take the guesswork out of WordPress security. iThemes Security offers 30+ ways to lock down WordPress in an easy-to-use WordPress security plugin.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"iThemes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:30:\"\n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Meta Slider\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"https://wordpress.org/plugins/ml-slider/#post-49521\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 14 Feb 2013 16:56:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"49521@https://wordpress.org/plugins/\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:131:\"Easy to use WordPress Slider plugin. Create responsive slideshows with Nivo Slider, Flex Slider, Coin Slider and Responsive Slides.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Matcha Labs\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:46:\"https://wordpress.org/plugins/rss/view/popular\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:42:\"Requests_Utility_CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:12:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Sat, 17 Sep 2016 05:32:14 GMT\";s:12:\"content-type\";s:23:\"text/xml; charset=UTF-8\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:25:\"strict-transport-security\";s:11:\"max-age=360\";s:7:\"expires\";s:29:\"Sat, 17 Sep 2016 05:46:19 GMT\";s:13:\"cache-control\";s:0:\"\";s:6:\"pragma\";s:0:\"\";s:13:\"last-modified\";s:31:\"Sat, 17 Sep 2016 05:11:19 +0000\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:4:\"x-nc\";s:11:\"HIT lax 250\";s:16:\"content-encoding\";s:4:\"gzip\";}}s:5:\"build\";s:14:\"20160911085705\";}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('127', '_transient_timeout_feed_mod_b9388c83948825c1edaef0d856b7b109', '1474133551', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('128', '_transient_feed_mod_b9388c83948825c1edaef0d856b7b109', '1474090351', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('129', '_transient_timeout_plugin_slugs', '1474176752', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('130', '_transient_plugin_slugs', 'a:2:{i:0;s:19:\"akismet/akismet.php\";i:1;s:9:\"hello.php\";}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('131', '_transient_timeout_dash_88ae138922fe95674369b1cb3d215a2b', '1474133552', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('132', '_transient_dash_88ae138922fe95674369b1cb3d215a2b', '
  • WordPress 4.6.1 Security and Maintenance Release September 7, 2016
    WordPress 4.6.1 is now available. This is a security release for all previous versions and we strongly encourage you to update your sites immediately. WordPress versions 4.6 and earlier are affected by two security issues: a cross-site scripting vulnerability via image filename, reported by SumOfPwn researcher Cengiz Han Sahin; and a path traversal vulnerability in […]
  • Popular Plugin: UpdraftPlus WordPress Backup Plugin (Install)
', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('133', 'can_compress_scripts', '1', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('134', '_site_transient_timeout_wporg_theme_feature_list', '1474101170', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('135', '_site_transient_wporg_theme_feature_list', 'a:3:{s:6:\"Layout\";a:7:{i:0;s:11:\"grid-layout\";i:1;s:10:\"one-column\";i:2;s:11:\"two-columns\";i:3;s:13:\"three-columns\";i:4;s:12:\"four-columns\";i:5;s:12:\"left-sidebar\";i:6;s:13:\"right-sidebar\";}s:8:\"Features\";a:20:{i:0;s:19:\"accessibility-ready\";i:1;s:10:\"buddypress\";i:2;s:17:\"custom-background\";i:3;s:13:\"custom-colors\";i:4;s:13:\"custom-header\";i:5;s:11:\"custom-menu\";i:6;s:12:\"editor-style\";i:7;s:21:\"featured-image-header\";i:8;s:15:\"featured-images\";i:9;s:15:\"flexible-header\";i:10;s:14:\"footer-widgets\";i:11;s:20:\"front-page-post-form\";i:12;s:19:\"full-width-template\";i:13;s:12:\"microformats\";i:14;s:12:\"post-formats\";i:15;s:20:\"rtl-language-support\";i:16;s:11:\"sticky-post\";i:17;s:13:\"theme-options\";i:18;s:17:\"threaded-comments\";i:19;s:17:\"translation-ready\";}s:7:\"Subject\";a:9:{i:0;s:4:\"blog\";i:1;s:10:\"e-commerce\";i:2;s:9:\"education\";i:3;s:13:\"entertainment\";i:4;s:14:\"food-and-drink\";i:5;s:7:\"holiday\";i:6;s:4:\"news\";i:7;s:11:\"photography\";i:8;s:9:\"portfolio\";}}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('141', 'theme_mods_twentysixteen', 'a:1:{s:16:\"sidebars_widgets\";a:2:{s:4:\"time\";i:1474090414;s:4:\"data\";a:2:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:6:{i:0;s:8:\"search-2\";i:1;s:14:\"recent-posts-2\";i:2;s:17:\"recent-comments-2\";i:3;s:10:\"archives-2\";i:4;s:12:\"categories-2\";i:5;s:6:\"meta-2\";}}}}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('142', 'current_theme', 'Photolog', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('143', 'theme_mods_photolog', 'a:4:{i:0;b:0;s:12:\"header_image\";s:77:\"http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/cropped-header.jpg\";s:17:\"header_image_data\";O:8:\"stdClass\":5:{s:13:\"attachment_id\";i:182;s:3:\"url\";s:77:\"http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/cropped-header.jpg\";s:13:\"thumbnail_url\";s:77:\"http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/cropped-header.jpg\";s:6:\"height\";i:800;s:5:\"width\";i:1400;}s:18:\"nav_menu_locations\";a:2:{s:6:\"social\";i:3;s:7:\"primary\";i:0;}}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('144', 'theme_switched', '', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('190', '_site_transient_timeout_available_translations', '1474109025', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('191', '_site_transient_available_translations', 'a:85:{s:3:\"ary\";a:8:{s:8:\"language\";s:3:\"ary\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-03 19:46:28\";s:12:\"english_name\";s:15:\"Moroccan Arabic\";s:11:\"native_name\";s:31:\"??????? ????????\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.6.1/ary.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:3;s:3:\"ary\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"????????\";}}s:2:\"ar\";a:8:{s:8:\"language\";s:2:\"ar\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-16 18:36:09\";s:12:\"english_name\";s:6:\"Arabic\";s:11:\"native_name\";s:14:\"???????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/ar.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:2;s:3:\"ara\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"????????\";}}s:2:\"az\";a:8:{s:8:\"language\";s:2:\"az\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-06-18 20:18:13\";s:12:\"english_name\";s:11:\"Azerbaijani\";s:11:\"native_name\";s:16:\"Az?rbaycan dili\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.5.4/az.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:2;s:3:\"aze\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Davam\";}}s:3:\"azb\";a:8:{s:8:\"language\";s:3:\"azb\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2015-12-11 22:42:10\";s:12:\"english_name\";s:17:\"South Azerbaijani\";s:11:\"native_name\";s:29:\"????? ?????????\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.4.2/azb.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:3;s:3:\"azb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"bg_BG\";a:8:{s:8:\"language\";s:5:\"bg_BG\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-13 13:34:55\";s:12:\"english_name\";s:9:\"Bulgarian\";s:11:\"native_name\";s:18:\"?????????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/bg_BG.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bg\";i:2;s:3:\"bul\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"??????\";}}s:5:\"bn_BD\";a:8:{s:8:\"language\";s:5:\"bn_BD\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-15 17:09:07\";s:12:\"english_name\";s:7:\"Bengali\";s:11:\"native_name\";s:15:\"?????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/bn_BD.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"bn\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:23:\"????? ??.\";}}s:2:\"bo\";a:8:{s:8:\"language\";s:2:\"bo\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-05 09:44:12\";s:12:\"english_name\";s:7:\"Tibetan\";s:11:\"native_name\";s:21:\"???????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/bo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bo\";i:2;s:3:\"tib\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:24:\"????????\";}}s:5:\"bs_BA\";a:8:{s:8:\"language\";s:5:\"bs_BA\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-04-19 23:16:37\";s:12:\"english_name\";s:7:\"Bosnian\";s:11:\"native_name\";s:8:\"Bosanski\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.5.4/bs_BA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bs\";i:2;s:3:\"bos\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:2:\"ca\";a:8:{s:8:\"language\";s:2:\"ca\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-07 21:38:31\";s:12:\"english_name\";s:7:\"Catalan\";s:11:\"native_name\";s:7:\"Catal\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/ca.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ca\";i:2;s:3:\"cat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:3:\"ceb\";a:8:{s:8:\"language\";s:3:\"ceb\";s:7:\"version\";s:5:\"4.4.3\";s:7:\"updated\";s:19:\"2016-02-16 15:34:57\";s:12:\"english_name\";s:7:\"Cebuano\";s:11:\"native_name\";s:7:\"Cebuano\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.4.3/ceb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"ceb\";i:3;s:3:\"ceb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Padayun\";}}s:5:\"cs_CZ\";a:8:{s:8:\"language\";s:5:\"cs_CZ\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2016-02-11 18:32:36\";s:12:\"english_name\";s:5:\"Czech\";s:11:\"native_name\";s:12:\"?etina?\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.4.2/cs_CZ.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cs\";i:2;s:3:\"ces\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:11:\"Pokra?ovat\";}}s:2:\"cy\";a:8:{s:8:\"language\";s:2:\"cy\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-12 10:17:24\";s:12:\"english_name\";s:5:\"Welsh\";s:11:\"native_name\";s:7:\"Cymraeg\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/cy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cy\";i:2;s:3:\"cym\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Parhau\";}}s:5:\"da_DK\";a:8:{s:8:\"language\";s:5:\"da_DK\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-12 09:12:43\";s:12:\"english_name\";s:6:\"Danish\";s:11:\"native_name\";s:5:\"Dansk\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/da_DK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"da\";i:2;s:3:\"dan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Fortsæt\";}}s:5:\"de_CH\";a:8:{s:8:\"language\";s:5:\"de_CH\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-15 12:56:13\";s:12:\"english_name\";s:20:\"German (Switzerland)\";s:11:\"native_name\";s:17:\"Deutsch (Schweiz)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/de_CH.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:14:\"de_CH_informal\";a:8:{s:8:\"language\";s:14:\"de_CH_informal\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-15 12:59:43\";s:12:\"english_name\";s:23:\"(Switzerland, Informal)\";s:11:\"native_name\";s:21:\"Deutsch (Schweiz, Du)\";s:7:\"package\";s:73:\"https://downloads.wordpress.org/translation/core/4.6.1/de_CH_informal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:12:\"de_DE_formal\";a:8:{s:8:\"language\";s:12:\"de_DE_formal\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-12 19:52:32\";s:12:\"english_name\";s:15:\"German (Formal)\";s:11:\"native_name\";s:13:\"Deutsch (Sie)\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/translation/core/4.6.1/de_DE_formal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:5:\"de_DE\";a:8:{s:8:\"language\";s:5:\"de_DE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-16 08:29:01\";s:12:\"english_name\";s:6:\"German\";s:11:\"native_name\";s:7:\"Deutsch\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/de_DE.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:2:\"el\";a:8:{s:8:\"language\";s:2:\"el\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 18:12:11\";s:12:\"english_name\";s:5:\"Greek\";s:11:\"native_name\";s:16:\"????????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/el.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"el\";i:2;s:3:\"ell\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"????????\";}}s:5:\"en_CA\";a:8:{s:8:\"language\";s:5:\"en_CA\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-11 23:19:29\";s:12:\"english_name\";s:16:\"English (Canada)\";s:11:\"native_name\";s:16:\"English (Canada)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/en_CA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_NZ\";a:8:{s:8:\"language\";s:5:\"en_NZ\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-20 07:14:07\";s:12:\"english_name\";s:21:\"English (New Zealand)\";s:11:\"native_name\";s:21:\"English (New Zealand)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/en_NZ.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_AU\";a:8:{s:8:\"language\";s:5:\"en_AU\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-12 02:18:44\";s:12:\"english_name\";s:19:\"English (Australia)\";s:11:\"native_name\";s:19:\"English (Australia)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/en_AU.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_ZA\";a:8:{s:8:\"language\";s:5:\"en_ZA\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-16 11:54:12\";s:12:\"english_name\";s:22:\"English (South Africa)\";s:11:\"native_name\";s:22:\"English (South Africa)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/en_ZA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_GB\";a:8:{s:8:\"language\";s:5:\"en_GB\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-11 22:36:25\";s:12:\"english_name\";s:12:\"English (UK)\";s:11:\"native_name\";s:12:\"English (UK)\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/en_GB.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"eo\";a:8:{s:8:\"language\";s:2:\"eo\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-16 18:57:14\";s:12:\"english_name\";s:9:\"Esperanto\";s:11:\"native_name\";s:9:\"Esperanto\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/eo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eo\";i:2;s:3:\"epo\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Da?rigi\";}}s:5:\"es_AR\";a:8:{s:8:\"language\";s:5:\"es_AR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-19 13:48:04\";s:12:\"english_name\";s:19:\"Spanish (Argentina)\";s:11:\"native_name\";s:21:\"Espaol de Argentina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_AR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_GT\";a:8:{s:8:\"language\";s:5:\"es_GT\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-17 17:56:31\";s:12:\"english_name\";s:19:\"Spanish (Guatemala)\";s:11:\"native_name\";s:21:\"Espaol de Guatemala\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_GT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CL\";a:8:{s:8:\"language\";s:5:\"es_CL\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-17 22:11:44\";s:12:\"english_name\";s:15:\"Spanish (Chile)\";s:11:\"native_name\";s:17:\"Espaol de Chile\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_CL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_MX\";a:8:{s:8:\"language\";s:5:\"es_MX\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-29 15:07:52\";s:12:\"english_name\";s:16:\"Spanish (Mexico)\";s:11:\"native_name\";s:19:\"Espaol de Mxico\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_MX.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CO\";a:8:{s:8:\"language\";s:5:\"es_CO\";s:7:\"version\";s:6:\"4.3-RC\";s:7:\"updated\";s:19:\"2015-08-04 06:10:33\";s:12:\"english_name\";s:18:\"Spanish (Colombia)\";s:11:\"native_name\";s:20:\"Espaol de Colombia\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.3-RC/es_CO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_VE\";a:8:{s:8:\"language\";s:5:\"es_VE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-17 12:34:44\";s:12:\"english_name\";s:19:\"Spanish (Venezuela)\";s:11:\"native_name\";s:21:\"Espaol de Venezuela\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_VE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_ES\";a:8:{s:8:\"language\";s:5:\"es_ES\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 11:04:37\";s:12:\"english_name\";s:15:\"Spanish (Spain)\";s:11:\"native_name\";s:8:\"Espaol\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_ES.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"es\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_PE\";a:8:{s:8:\"language\";s:5:\"es_PE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-09 09:36:22\";s:12:\"english_name\";s:14:\"Spanish (Peru)\";s:11:\"native_name\";s:17:\"Espaol de Per\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/es_PE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"es\";i:2;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"et\";a:8:{s:8:\"language\";s:2:\"et\";s:7:\"version\";s:7:\"4.6-rc2\";s:7:\"updated\";s:19:\"2016-08-09 06:49:25\";s:12:\"english_name\";s:8:\"Estonian\";s:11:\"native_name\";s:5:\"Eesti\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.6-rc2/et.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"et\";i:2;s:3:\"est\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Jtka\";}}s:2:\"eu\";a:8:{s:8:\"language\";s:2:\"eu\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-08 19:27:09\";s:12:\"english_name\";s:6:\"Basque\";s:11:\"native_name\";s:7:\"Euskara\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/eu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eu\";i:2;s:3:\"eus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Jarraitu\";}}s:5:\"fa_IR\";a:8:{s:8:\"language\";s:5:\"fa_IR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-16 09:07:28\";s:12:\"english_name\";s:7:\"Persian\";s:11:\"native_name\";s:10:\"?????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/fa_IR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fa\";i:2;s:3:\"fas\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"?????\";}}s:2:\"fi\";a:8:{s:8:\"language\";s:2:\"fi\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-15 18:30:48\";s:12:\"english_name\";s:7:\"Finnish\";s:11:\"native_name\";s:5:\"Suomi\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/fi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fi\";i:2;s:3:\"fin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Jatka\";}}s:5:\"fr_CA\";a:8:{s:8:\"language\";s:5:\"fr_CA\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-15 19:02:20\";s:12:\"english_name\";s:15:\"French (Canada)\";s:11:\"native_name\";s:19:\"Franais du Canada\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/fr_CA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_FR\";a:8:{s:8:\"language\";s:5:\"fr_FR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-16 16:12:56\";s:12:\"english_name\";s:15:\"French (France)\";s:11:\"native_name\";s:9:\"Franais\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/fr_FR.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"fr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_BE\";a:8:{s:8:\"language\";s:5:\"fr_BE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-13 16:21:14\";s:12:\"english_name\";s:16:\"French (Belgium)\";s:11:\"native_name\";s:21:\"Franais de Belgique\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/fr_BE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:2:\"gd\";a:8:{s:8:\"language\";s:2:\"gd\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-23 17:41:37\";s:12:\"english_name\";s:15:\"Scottish Gaelic\";s:11:\"native_name\";s:9:\"Gidhlig\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/gd.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"gd\";i:2;s:3:\"gla\";i:3;s:3:\"gla\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"Lean air adhart\";}}s:5:\"gl_ES\";a:8:{s:8:\"language\";s:5:\"gl_ES\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-21 15:44:17\";s:12:\"english_name\";s:8:\"Galician\";s:11:\"native_name\";s:6:\"Galego\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/gl_ES.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gl\";i:2;s:3:\"glg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"gu\";a:8:{s:8:\"language\";s:2:\"gu\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-04 13:42:43\";s:12:\"english_name\";s:8:\"Gujarati\";s:11:\"native_name\";s:21:\"???????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/gu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gu\";i:2;s:3:\"guj\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:31:\"???? ??????\";}}s:3:\"haz\";a:8:{s:8:\"language\";s:3:\"haz\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2015-12-05 00:59:09\";s:12:\"english_name\";s:8:\"Hazaragi\";s:11:\"native_name\";s:15:\"????? ??\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.4.2/haz.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"haz\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"?????\";}}s:5:\"he_IL\";a:8:{s:8:\"language\";s:5:\"he_IL\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-03 21:57:20\";s:12:\"english_name\";s:6:\"Hebrew\";s:11:\"native_name\";s:16:\"????????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/he_IL.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"he\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"????\";}}s:5:\"hi_IN\";a:8:{s:8:\"language\";s:5:\"hi_IN\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-03 13:43:01\";s:12:\"english_name\";s:5:\"Hindi\";s:11:\"native_name\";s:18:\"??????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/hi_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hi\";i:2;s:3:\"hin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"????\";}}s:2:\"hr\";a:8:{s:8:\"language\";s:2:\"hr\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-07 15:12:28\";s:12:\"english_name\";s:8:\"Croatian\";s:11:\"native_name\";s:8:\"Hrvatski\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/hr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hr\";i:2;s:3:\"hrv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:5:\"hu_HU\";a:8:{s:8:\"language\";s:5:\"hu_HU\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-07 19:31:42\";s:12:\"english_name\";s:9:\"Hungarian\";s:11:\"native_name\";s:6:\"Magyar\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/hu_HU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hu\";i:2;s:3:\"hun\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Folytats\";}}s:2:\"hy\";a:8:{s:8:\"language\";s:2:\"hy\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2016-02-04 07:13:54\";s:12:\"english_name\";s:8:\"Armenian\";s:11:\"native_name\";s:14:\"???????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.4.2/hy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hy\";i:2;s:3:\"hye\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"??????????\";}}s:5:\"id_ID\";a:8:{s:8:\"language\";s:5:\"id_ID\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-20 00:18:09\";s:12:\"english_name\";s:10:\"Indonesian\";s:11:\"native_name\";s:16:\"Bahasa Indonesia\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/id_ID.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"id\";i:2;s:3:\"ind\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Lanjutkan\";}}s:5:\"is_IS\";a:8:{s:8:\"language\";s:5:\"is_IS\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 14:06:03\";s:12:\"english_name\";s:9:\"Icelandic\";s:11:\"native_name\";s:9:\"slenska\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/is_IS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"is\";i:2;s:3:\"isl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"fram\";}}s:5:\"it_IT\";a:8:{s:8:\"language\";s:5:\"it_IT\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-09 15:46:50\";s:12:\"english_name\";s:7:\"Italian\";s:11:\"native_name\";s:8:\"Italiano\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/it_IT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"it\";i:2;s:3:\"ita\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:2:\"ja\";a:8:{s:8:\"language\";s:2:\"ja\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-17 17:33:07\";s:12:\"english_name\";s:8:\"Japanese\";s:11:\"native_name\";s:9:\"???\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/ja.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"ja\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"???\";}}s:5:\"ka_GE\";a:8:{s:8:\"language\";s:5:\"ka_GE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-29 11:51:34\";s:12:\"english_name\";s:8:\"Georgian\";s:11:\"native_name\";s:21:\"???????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/ka_GE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ka\";i:2;s:3:\"kat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"??????????\";}}s:5:\"ko_KR\";a:8:{s:8:\"language\";s:5:\"ko_KR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-26 00:37:05\";s:12:\"english_name\";s:6:\"Korean\";s:11:\"native_name\";s:9:\"???\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/ko_KR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ko\";i:2;s:3:\"kor\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"??\";}}s:5:\"lt_LT\";a:8:{s:8:\"language\";s:5:\"lt_LT\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-11 21:29:34\";s:12:\"english_name\";s:10:\"Lithuanian\";s:11:\"native_name\";s:15:\"Lietuvi? kalba\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/lt_LT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lt\";i:2;s:3:\"lit\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"T?sti\";}}s:2:\"lv\";a:8:{s:8:\"language\";s:2:\"lv\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-16 10:22:29\";s:12:\"english_name\";s:7:\"Latvian\";s:11:\"native_name\";s:16:\"Latvieu valoda\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/lv.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lv\";i:2;s:3:\"lav\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Turpin?t\";}}s:5:\"mk_MK\";a:8:{s:8:\"language\";s:5:\"mk_MK\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-05-12 13:55:28\";s:12:\"english_name\";s:10:\"Macedonian\";s:11:\"native_name\";s:31:\"?????????? ?????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.5.4/mk_MK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mk\";i:2;s:3:\"mkd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"????????\";}}s:2:\"mr\";a:8:{s:8:\"language\";s:2:\"mr\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 07:43:21\";s:12:\"english_name\";s:7:\"Marathi\";s:11:\"native_name\";s:15:\"?????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/mr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mr\";i:2;s:3:\"mar\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"???? ????\";}}s:5:\"ms_MY\";a:8:{s:8:\"language\";s:5:\"ms_MY\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-14 14:18:43\";s:12:\"english_name\";s:5:\"Malay\";s:11:\"native_name\";s:13:\"Bahasa Melayu\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/ms_MY.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ms\";i:2;s:3:\"msa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Teruskan\";}}s:5:\"my_MM\";a:8:{s:8:\"language\";s:5:\"my_MM\";s:7:\"version\";s:6:\"4.1.13\";s:7:\"updated\";s:19:\"2015-03-26 15:57:42\";s:12:\"english_name\";s:17:\"Myanmar (Burmese)\";s:11:\"native_name\";s:15:\"?????\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.1.13/my_MM.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"my\";i:2;s:3:\"mya\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:54:\"??????????????????\";}}s:5:\"nb_NO\";a:8:{s:8:\"language\";s:5:\"nb_NO\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-16 13:09:49\";s:12:\"english_name\";s:19:\"Norwegian (Bokml)\";s:11:\"native_name\";s:13:\"Norsk bokml\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/nb_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nb\";i:2;s:3:\"nob\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Fortsett\";}}s:5:\"nl_NL\";a:8:{s:8:\"language\";s:5:\"nl_NL\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-09 10:10:04\";s:12:\"english_name\";s:5:\"Dutch\";s:11:\"native_name\";s:10:\"Nederlands\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/nl_NL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:12:\"nl_NL_formal\";a:8:{s:8:\"language\";s:12:\"nl_NL_formal\";s:7:\"version\";s:5:\"4.4.3\";s:7:\"updated\";s:19:\"2016-01-20 13:35:50\";s:12:\"english_name\";s:14:\"Dutch (Formal)\";s:11:\"native_name\";s:20:\"Nederlands (Formeel)\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/translation/core/4.4.3/nl_NL_formal.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:5:\"nn_NO\";a:8:{s:8:\"language\";s:5:\"nn_NO\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-27 16:24:28\";s:12:\"english_name\";s:19:\"Norwegian (Nynorsk)\";s:11:\"native_name\";s:13:\"Norsk nynorsk\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/nn_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nn\";i:2;s:3:\"nno\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Hald fram\";}}s:3:\"oci\";a:8:{s:8:\"language\";s:3:\"oci\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-25 09:29:49\";s:12:\"english_name\";s:7:\"Occitan\";s:11:\"native_name\";s:7:\"Occitan\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.6.1/oci.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"oc\";i:2;s:3:\"oci\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Contunhar\";}}s:5:\"pl_PL\";a:8:{s:8:\"language\";s:5:\"pl_PL\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-07 16:28:27\";s:12:\"english_name\";s:6:\"Polish\";s:11:\"native_name\";s:6:\"Polski\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/pl_PL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pl\";i:2;s:3:\"pol\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Kontynuuj\";}}s:2:\"ps\";a:8:{s:8:\"language\";s:2:\"ps\";s:7:\"version\";s:6:\"4.1.13\";s:7:\"updated\";s:19:\"2015-03-29 22:19:48\";s:12:\"english_name\";s:6:\"Pashto\";s:11:\"native_name\";s:8:\"????\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.1.13/ps.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ps\";i:2;s:3:\"pus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:19:\"???? ?????\";}}s:5:\"pt_PT\";a:8:{s:8:\"language\";s:5:\"pt_PT\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 09:00:10\";s:12:\"english_name\";s:21:\"Portuguese (Portugal)\";s:11:\"native_name\";s:10:\"Portugus\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/pt_PT.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_BR\";a:8:{s:8:\"language\";s:5:\"pt_BR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-14 15:53:43\";s:12:\"english_name\";s:19:\"Portuguese (Brazil)\";s:11:\"native_name\";s:20:\"Portugus do Brasil\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/pt_BR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pt\";i:2;s:3:\"por\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"ro_RO\";a:8:{s:8:\"language\";s:5:\"ro_RO\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-14 19:25:04\";s:12:\"english_name\";s:8:\"Romanian\";s:11:\"native_name\";s:8:\"Romn?\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/ro_RO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ro\";i:2;s:3:\"ron\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continu?\";}}s:5:\"ru_RU\";a:8:{s:8:\"language\";s:5:\"ru_RU\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-30 19:40:04\";s:12:\"english_name\";s:7:\"Russian\";s:11:\"native_name\";s:14:\"???????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/ru_RU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ru\";i:2;s:3:\"rus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"??????????\";}}s:5:\"sk_SK\";a:8:{s:8:\"language\";s:5:\"sk_SK\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-17 10:49:08\";s:12:\"english_name\";s:6:\"Slovak\";s:11:\"native_name\";s:11:\"Sloven?ina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/sk_SK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sk\";i:2;s:3:\"slk\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Pokra?ova?\";}}s:5:\"sl_SI\";a:8:{s:8:\"language\";s:5:\"sl_SI\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-18 16:23:26\";s:12:\"english_name\";s:9:\"Slovenian\";s:11:\"native_name\";s:13:\"Sloven?ina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/sl_SI.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sl\";i:2;s:3:\"slv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Nadaljuj\";}}s:2:\"sq\";a:8:{s:8:\"language\";s:2:\"sq\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-14 07:00:01\";s:12:\"english_name\";s:8:\"Albanian\";s:11:\"native_name\";s:5:\"Shqip\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/sq.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sq\";i:2;s:3:\"sqi\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Vazhdo\";}}s:5:\"sr_RS\";a:8:{s:8:\"language\";s:5:\"sr_RS\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-12 16:41:17\";s:12:\"english_name\";s:7:\"Serbian\";s:11:\"native_name\";s:23:\"?????? ?????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/sr_RS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sr\";i:2;s:3:\"srp\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:14:\"???????\";}}s:5:\"sv_SE\";a:8:{s:8:\"language\";s:5:\"sv_SE\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-29 20:20:44\";s:12:\"english_name\";s:7:\"Swedish\";s:11:\"native_name\";s:7:\"Svenska\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/sv_SE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sv\";i:2;s:3:\"swe\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Fortstt\";}}s:3:\"szl\";a:8:{s:8:\"language\";s:3:\"szl\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-09 07:28:21\";s:12:\"english_name\";s:8:\"Silesian\";s:11:\"native_name\";s:17:\"?l?nsk? g?dka\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.6.1/szl.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"szl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:13:\"K?ntynuowa?\";}}s:2:\"th\";a:8:{s:8:\"language\";s:2:\"th\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-06-30 10:22:26\";s:12:\"english_name\";s:4:\"Thai\";s:11:\"native_name\";s:9:\"???\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.5.4/th.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"th\";i:2;s:3:\"tha\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"?????\";}}s:2:\"tl\";a:8:{s:8:\"language\";s:2:\"tl\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2015-11-27 15:51:36\";s:12:\"english_name\";s:7:\"Tagalog\";s:11:\"native_name\";s:7:\"Tagalog\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.4.2/tl.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tl\";i:2;s:3:\"tgl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Magpatuloy\";}}s:5:\"tr_TR\";a:8:{s:8:\"language\";s:5:\"tr_TR\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-16 10:50:15\";s:12:\"english_name\";s:7:\"Turkish\";s:11:\"native_name\";s:8:\"Trke\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/tr_TR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tr\";i:2;s:3:\"tur\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Devam\";}}s:5:\"ug_CN\";a:8:{s:8:\"language\";s:5:\"ug_CN\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-06-22 12:27:05\";s:12:\"english_name\";s:6:\"Uighur\";s:11:\"native_name\";s:9:\"Uy?urq?\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.5.4/ug_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ug\";i:2;s:3:\"uig\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:26:\"?????????????\";}}s:2:\"uk\";a:8:{s:8:\"language\";s:2:\"uk\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-09-12 21:46:06\";s:12:\"english_name\";s:9:\"Ukrainian\";s:11:\"native_name\";s:20:\"??????????\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.6.1/uk.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"uk\";i:2;s:3:\"ukr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"??????????\";}}s:2:\"vi\";a:8:{s:8:\"language\";s:2:\"vi\";s:7:\"version\";s:5:\"4.4.2\";s:7:\"updated\";s:19:\"2015-12-09 01:01:25\";s:12:\"english_name\";s:10:\"Vietnamese\";s:11:\"native_name\";s:14:\"Ti?ng Vi?t\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.4.2/vi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"vi\";i:2;s:3:\"vie\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Ti?p t?c\";}}s:5:\"zh_TW\";a:8:{s:8:\"language\";s:5:\"zh_TW\";s:7:\"version\";s:5:\"4.6.1\";s:7:\"updated\";s:19:\"2016-08-18 13:53:15\";s:12:\"english_name\";s:16:\"Chinese (Taiwan)\";s:11:\"native_name\";s:12:\"????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.6.1/zh_TW.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"??\";}}s:5:\"zh_CN\";a:8:{s:8:\"language\";s:5:\"zh_CN\";s:7:\"version\";s:5:\"4.5.4\";s:7:\"updated\";s:19:\"2016-04-17 03:29:01\";s:12:\"english_name\";s:15:\"Chinese (China)\";s:11:\"native_name\";s:12:\"????\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.5.4/zh_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"??\";}}}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('212', 'category_children', 'a:0:{}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('336', 'nav_menu_options', 'a:2:{i:0;b:0;s:8:\"auto_add\";a:0:{}}', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('342', '_transient_photolog_categories', '1', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('344', '_transient_is_multi_author', '0', 'yes'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('362', '_site_transient_update_core', 'O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:59:\"https://downloads.wordpress.org/release/wordpress-4.6.1.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:59:\"https://downloads.wordpress.org/release/wordpress-4.6.1.zip\";s:10:\"no_content\";s:70:\"https://downloads.wordpress.org/release/wordpress-4.6.1-no-content.zip\";s:11:\"new_bundled\";s:71:\"https://downloads.wordpress.org/release/wordpress-4.6.1-new-bundled.zip\";s:7:\"partial\";b:0;s:8:\"rollback\";b:0;}s:7:\"current\";s:5:\"4.6.1\";s:7:\"version\";s:5:\"4.6.1\";s:11:\"php_version\";s:5:\"5.2.4\";s:13:\"mysql_version\";s:3:\"5.0\";s:11:\"new_bundled\";s:3:\"4.4\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1474347349;s:15:\"version_checked\";s:5:\"4.6.1\";s:12:\"translations\";a:0:{}}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('363', '_site_transient_update_themes', 'O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1474347360;s:7:\"checked\";a:4:{s:8:\"photolog\";s:7:\"1.0.2.2\";s:13:\"twentyfifteen\";s:3:\"1.6\";s:14:\"twentyfourteen\";s:3:\"1.8\";s:13:\"twentysixteen\";s:3:\"1.3\";}s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('364', '_site_transient_update_plugins', 'O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1474347358;s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:2:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":6:{s:2:\"id\";s:2:\"15\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:3:\"3.2\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/plugin/akismet.3.2.zip\";}s:9:\"hello.php\";O:8:\"stdClass\":6:{s:2:\"id\";s:4:\"3564\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/plugin/hello-dolly.1.6.zip\";}}}', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('367', '_site_transient_timeout_theme_roots', '1474349152', 'no'); +INSERT INTO `wp_wp_options` (`option_id`, `option_name`, `option_value`, `autoload`) VALUES ('368', '_site_transient_theme_roots', 'a:4:{s:8:\"photolog\";s:7:\"/themes\";s:13:\"twentyfifteen\";s:7:\"/themes\";s:14:\"twentyfourteen\";s:7:\"/themes\";s:13:\"twentysixteen\";s:7:\"/themes\";}', 'no'); + +-- TABLE: wp_wp_postmeta +CREATE TABLE `wp_wp_postmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`meta_id`), + KEY `post_id` (`post_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=969 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('1', '2', '_wp_page_template', 'default'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('223', '87', '_wp_attached_file', '2016/09/shot1.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('224', '87', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1280;s:6:\"height\";i:1280;s:4:\"file\";s:17:\"2016/09/shot1.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot1-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot1-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot1-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"shot1-1024x1024.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('225', '88', '_wp_attached_file', '2016/09/shot2.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('226', '88', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1280;s:6:\"height\";i:1280;s:4:\"file\";s:17:\"2016/09/shot2.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot2-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot2-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot2-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"shot2-1024x1024.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('227', '89', '_wp_attached_file', '2016/09/shot3.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('228', '89', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1280;s:6:\"height\";i:1280;s:4:\"file\";s:17:\"2016/09/shot3.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot3-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot3-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot3-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"shot3-1024x1024.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('229', '90', '_wp_attached_file', '2016/09/shot4.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('230', '90', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1280;s:6:\"height\";i:1280;s:4:\"file\";s:17:\"2016/09/shot4.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot4-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot4-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot4-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"shot4-1024x1024.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('231', '91', '_wp_attached_file', '2016/09/shot5.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('232', '91', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:17:\"2016/09/shot5.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot5-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot5-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot5-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('233', '92', '_wp_attached_file', '2016/09/shot6.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('234', '92', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:17:\"2016/09/shot6.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot6-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot6-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot6-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('235', '93', '_wp_attached_file', '2016/09/shot7.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('236', '93', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:17:\"2016/09/shot7.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot7-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot7-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot7-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('237', '94', '_wp_attached_file', '2016/09/shot8.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('238', '94', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:17:\"2016/09/shot8.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot8-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot8-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot8-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('239', '95', '_wp_attached_file', '2016/09/shot9.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('240', '95', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:17:\"2016/09/shot9.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:17:\"shot9-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"shot9-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:17:\"shot9-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('241', '96', '_wp_attached_file', '2016/09/shot10.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('242', '96', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot10.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot10-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot10-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot10-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('243', '97', '_wp_attached_file', '2016/09/shot10a.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('244', '97', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot10a.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot10a-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot10a-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot10a-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('245', '98', '_wp_attached_file', '2016/09/shot11.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('246', '98', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot11.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot11-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot11-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot11-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('247', '99', '_wp_attached_file', '2016/09/shot12.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('248', '99', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot12.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot12-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot12-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot12-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('249', '100', '_wp_attached_file', '2016/09/shot14.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('250', '100', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot14.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot14-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot14-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot14-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('251', '101', '_wp_attached_file', '2016/09/shot14a.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('252', '101', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14a.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14a-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14a-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14a-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('253', '102', '_wp_attached_file', '2016/09/shot14b.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('254', '102', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14b.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14b-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14b-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14b-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('255', '103', '_wp_attached_file', '2016/09/shot14c.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('256', '103', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14c.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14c-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14c-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14c-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('257', '104', '_wp_attached_file', '2016/09/shot14d.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('258', '104', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14d.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14d-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14d-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14d-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('259', '105', '_wp_attached_file', '2016/09/shot14e.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('260', '105', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14e.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14e-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14e-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14e-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('261', '106', '_wp_attached_file', '2016/09/shot14ea.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('262', '106', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:20:\"2016/09/shot14ea.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:20:\"shot14ea-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:20:\"shot14ea-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:20:\"shot14ea-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('263', '107', '_wp_attached_file', '2016/09/shot14f.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('264', '107', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:19:\"2016/09/shot14f.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:19:\"shot14f-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:19:\"shot14f-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:19:\"shot14f-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('265', '108', '_wp_attached_file', '2016/09/shot14fa.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('266', '108', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:20:\"2016/09/shot14fa.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:20:\"shot14fa-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:20:\"shot14fa-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:20:\"shot14fa-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('267', '109', '_wp_attached_file', '2016/09/shot15.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('268', '109', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot15.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot15-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot15-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot15-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('269', '110', '_wp_attached_file', '2016/09/shot16.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('270', '110', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot16.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot16-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot16-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot16-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('271', '111', '_wp_attached_file', '2016/09/shot17.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('272', '111', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot17.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot17-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot17-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot17-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('273', '112', '_wp_attached_file', '2016/09/shot18.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('274', '112', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot18.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot18-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot18-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot18-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('275', '113', '_wp_attached_file', '2016/09/shot19.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('276', '113', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot19.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot19-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot19-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot19-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('277', '114', '_wp_attached_file', '2016/09/shot20.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('278', '114', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot20.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot20-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot20-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot20-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('279', '115', '_wp_attached_file', '2016/09/shot21.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('280', '115', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1024;s:6:\"height\";i:1024;s:4:\"file\";s:18:\"2016/09/shot21.jpg\";s:5:\"sizes\";a:3:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"shot21-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"shot21-300x300.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"shot21-768x768.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:768;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('295', '118', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('296', '118', '_edit_lock', '1474119207:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('297', '118', '_thumbnail_id', '88'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('304', '124', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('305', '124', '_edit_lock', '1474120399:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('306', '124', '_thumbnail_id', '89'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('317', '126', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('318', '126', '_edit_lock', '1474120421:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('319', '126', '_thumbnail_id', '90'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('327', '124', '_wp_old_slug', 'single-user-creation__trashed'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('334', '129', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('335', '129', '_edit_lock', '1474119263:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('336', '129', '_thumbnail_id', '92'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('339', '131', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('340', '131', '_edit_lock', '1474119462:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('341', '131', '_thumbnail_id', '93'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('346', '134', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('347', '134', '_edit_lock', '1474120530:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('348', '134', '_thumbnail_id', '94'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('351', '136', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('352', '136', '_edit_lock', '1474120576:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('353', '136', '_thumbnail_id', '95'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('356', '138', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('357', '138', '_edit_lock', '1474120557:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('358', '138', '_thumbnail_id', '96'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('361', '140', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('362', '140', '_edit_lock', '1474120678:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('363', '140', '_thumbnail_id', '98'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('370', '145', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('371', '145', '_edit_lock', '1474122452:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('372', '145', '_thumbnail_id', '112'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('377', '147', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('378', '147', '_edit_lock', '1474120702:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('379', '147', '_thumbnail_id', '99'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('382', '149', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('383', '149', '_edit_lock', '1474120722:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('384', '149', '_thumbnail_id', '100'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('387', '151', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('388', '151', '_edit_lock', '1474122017:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('389', '151', '_thumbnail_id', '101'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('392', '153', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('393', '153', '_edit_lock', '1474122029:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('394', '153', '_thumbnail_id', '102'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('397', '155', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('398', '155', '_edit_lock', '1474122041:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('399', '155', '_thumbnail_id', '103'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('404', '158', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('405', '158', '_edit_lock', '1474122138:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('406', '158', '_thumbnail_id', '104'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('409', '160', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('410', '160', '_edit_lock', '1474122773:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('411', '160', '_thumbnail_id', '105'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('414', '162', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('415', '162', '_edit_lock', '1474122170:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('416', '162', '_thumbnail_id', '107'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('419', '164', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('420', '164', '_edit_lock', '1474122331:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('421', '164', '_thumbnail_id', '109'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('424', '166', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('425', '166', '_edit_lock', '1474122431:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('426', '166', '_thumbnail_id', '111'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('433', '171', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('434', '171', '_edit_lock', '1474122291:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('435', '171', '_thumbnail_id', '113'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('438', '173', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('439', '173', '_edit_lock', '1474122522:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('440', '173', '_thumbnail_id', '114'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('443', '175', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('444', '175', '_edit_lock', '1474122551:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('445', '175', '_thumbnail_id', '88'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('448', '177', '_edit_last', '2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('449', '177', '_edit_lock', '1474122539:2'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('450', '177', '_thumbnail_id', '115'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('475', '180', '_wp_attached_file', '2016/09/header.png'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('476', '180', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1264;s:6:\"height\";i:219;s:4:\"file\";s:18:\"2016/09/header.png\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"header-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";}s:6:\"medium\";a:4:{s:4:\"file\";s:17:\"header-300x52.png\";s:5:\"width\";i:300;s:6:\"height\";i:52;s:9:\"mime-type\";s:9:\"image/png\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"header-768x133.png\";s:5:\"width\";i:768;s:6:\"height\";i:133;s:9:\"mime-type\";s:9:\"image/png\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"header-1024x177.png\";s:5:\"width\";i:1024;s:6:\"height\";i:177;s:9:\"mime-type\";s:9:\"image/png\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('477', '180', '_wp_attachment_custom_header_last_used_photolog', '1474119891'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('478', '180', '_wp_attachment_is_custom_header', 'photolog'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('479', '181', '_wp_attached_file', '2016/09/header.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('480', '181', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1400;s:6:\"height\";i:800;s:4:\"file\";s:18:\"2016/09/header.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:18:\"header-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:18:\"header-300x171.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:171;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:18:\"header-768x439.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:439;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:19:\"header-1024x585.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:585;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('481', '182', '_wp_attached_file', '2016/09/cropped-header.jpg'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('482', '182', '_wp_attachment_context', 'custom-header'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('483', '182', '_wp_attachment_metadata', 'a:5:{s:5:\"width\";i:1400;s:6:\"height\";i:800;s:4:\"file\";s:26:\"2016/09/cropped-header.jpg\";s:5:\"sizes\";a:4:{s:9:\"thumbnail\";a:4:{s:4:\"file\";s:26:\"cropped-header-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:6:\"medium\";a:4:{s:4:\"file\";s:26:\"cropped-header-300x171.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:171;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:12:\"medium_large\";a:4:{s:4:\"file\";s:26:\"cropped-header-768x439.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:439;s:9:\"mime-type\";s:10:\"image/jpeg\";}s:5:\"large\";a:4:{s:4:\"file\";s:27:\"cropped-header-1024x585.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:585;s:9:\"mime-type\";s:10:\"image/jpeg\";}}s:10:\"image_meta\";a:12:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}}}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('484', '182', '_wp_attachment_custom_header_last_used_photolog', '1474120209'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('485', '182', '_wp_attachment_is_custom_header', 'photolog'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('536', '184', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('537', '184', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('538', '184', '_menu_item_object_id', '129'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('539', '184', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('540', '184', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('541', '184', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('542', '184', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('543', '184', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('752', '208', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('753', '208', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('754', '208', '_menu_item_object_id', '129'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('755', '208', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('756', '208', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('757', '208', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('758', '208', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('759', '208', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('761', '209', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('762', '209', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('763', '209', '_menu_item_object_id', '131'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('764', '209', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('765', '209', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('766', '209', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('767', '209', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('768', '209', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('770', '210', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('771', '210', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('772', '210', '_menu_item_object_id', '118'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('773', '210', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('774', '210', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('775', '210', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('776', '210', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('777', '210', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('779', '211', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('780', '211', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('781', '211', '_menu_item_object_id', '149'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('782', '211', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('783', '211', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('784', '211', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('785', '211', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('786', '211', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('788', '212', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('789', '212', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('790', '212', '_menu_item_object_id', '136'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('791', '212', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('792', '212', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('793', '212', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('794', '212', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('795', '212', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('797', '213', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('798', '213', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('799', '213', '_menu_item_object_id', '134'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('800', '213', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('801', '213', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('802', '213', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('803', '213', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('804', '213', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('806', '214', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('807', '214', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('808', '214', '_menu_item_object_id', '177'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('809', '214', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('810', '214', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('811', '214', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('812', '214', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('813', '214', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('815', '215', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('816', '215', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('817', '215', '_menu_item_object_id', '171'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('818', '215', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('819', '215', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('820', '215', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('821', '215', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('822', '215', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('824', '216', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('825', '216', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('826', '216', '_menu_item_object_id', '173'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('827', '216', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('828', '216', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('829', '216', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('830', '216', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('831', '216', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('833', '217', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('834', '217', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('835', '217', '_menu_item_object_id', '166'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('836', '217', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('837', '217', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('838', '217', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('839', '217', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('840', '217', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('842', '218', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('843', '218', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('844', '218', '_menu_item_object_id', '164'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('845', '218', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('846', '218', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('847', '218', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('848', '218', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('849', '218', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('851', '219', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('852', '219', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('853', '219', '_menu_item_object_id', '138'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('854', '219', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('855', '219', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('856', '219', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('857', '219', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('858', '219', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('860', '220', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('861', '220', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('862', '220', '_menu_item_object_id', '145'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('863', '220', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('864', '220', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('865', '220', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('866', '220', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('867', '220', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('869', '221', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('870', '221', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('871', '221', '_menu_item_object_id', '140'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('872', '221', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('873', '221', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('874', '221', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('875', '221', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('876', '221', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('878', '222', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('879', '222', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('880', '222', '_menu_item_object_id', '147'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('881', '222', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('882', '222', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('883', '222', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('884', '222', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('885', '222', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('887', '223', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('888', '223', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('889', '223', '_menu_item_object_id', '124'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('890', '223', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('891', '223', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('892', '223', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('893', '223', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('894', '223', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('896', '224', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('897', '224', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('898', '224', '_menu_item_object_id', '126'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('899', '224', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('900', '224', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('901', '224', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('902', '224', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('903', '224', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('905', '225', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('906', '225', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('907', '225', '_menu_item_object_id', '158'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('908', '225', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('909', '225', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('910', '225', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('911', '225', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('912', '225', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('914', '226', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('915', '226', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('916', '226', '_menu_item_object_id', '151'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('917', '226', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('918', '226', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('919', '226', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('920', '226', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('921', '226', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('923', '227', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('924', '227', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('925', '227', '_menu_item_object_id', '160'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('926', '227', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('927', '227', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('928', '227', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('929', '227', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('930', '227', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('932', '228', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('933', '228', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('934', '228', '_menu_item_object_id', '162'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('935', '228', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('936', '228', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('937', '228', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('938', '228', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('939', '228', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('941', '229', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('942', '229', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('943', '229', '_menu_item_object_id', '155'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('944', '229', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('945', '229', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('946', '229', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('947', '229', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('948', '229', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('950', '230', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('951', '230', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('952', '230', '_menu_item_object_id', '153'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('953', '230', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('954', '230', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('955', '230', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('956', '230', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('957', '230', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('959', '231', '_menu_item_type', 'post_type'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('960', '231', '_menu_item_menu_item_parent', '0'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('961', '231', '_menu_item_object_id', '175'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('962', '231', '_menu_item_object', 'post'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('963', '231', '_menu_item_target', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('964', '231', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}'); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('965', '231', '_menu_item_xfn', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('966', '231', '_menu_item_url', ''); +INSERT INTO `wp_wp_postmeta` (`meta_id`, `post_id`, `meta_key`, `meta_value`) VALUES ('968', '2', '_edit_lock', '1474261371:2'); + +-- TABLE: wp_wp_posts +CREATE TABLE `wp_wp_posts` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', + `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content` longtext NOT NULL, + `post_title` text NOT NULL, + `post_excerpt` text NOT NULL, + `post_status` varchar(20) NOT NULL DEFAULT 'publish', + `comment_status` varchar(20) NOT NULL DEFAULT 'open', + `ping_status` varchar(20) NOT NULL DEFAULT 'open', + `post_password` varchar(20) NOT NULL DEFAULT '', + `post_name` varchar(200) NOT NULL DEFAULT '', + `to_ping` text NOT NULL, + `pinged` text NOT NULL, + `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `post_content_filtered` longtext NOT NULL, + `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `guid` varchar(255) NOT NULL DEFAULT '', + `menu_order` int(11) NOT NULL DEFAULT '0', + `post_type` varchar(20) NOT NULL DEFAULT 'post', + `post_mime_type` varchar(100) NOT NULL DEFAULT '', + `comment_count` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`), + KEY `post_name` (`post_name`(191)), + KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), + KEY `post_parent` (`post_parent`), + KEY `post_author` (`post_author`) +) ENGINE=InnoDB AUTO_INCREMENT=233 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('2', '2', '2016-05-10 03:48:21', '2016-05-10 03:48:21', 'This is an example page. It\'s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:\n\n
Hi there! I\'m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\' caught in the rain.)
\n\n...or something like this:\n\n
The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.
\n\nAs a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!', 'Sample Page', '', 'publish', 'closed', 'open', '', 'sample-page', '', '', '2016-05-10 03:48:21', '2016-05-10 03:48:21', '', '0', 'http://wp452m.a10-52-158-154.qa.plesk.ru/wordpress/?page_id=2', '0', 'page', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('3', '2', '2016-09-17 05:32:00', '0000-00-00 00:00:00', '', 'Auto Draft', '', 'auto-draft', 'open', 'open', '', '', '', '', '2016-09-17 05:32:00', '0000-00-00 00:00:00', '', '0', 'http://hotspot.helloperiyar.com/?p=3', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('87', '2', '2016-09-17 13:54:20', '2016-09-17 08:24:20', '', 'shot1', '', 'inherit', 'closed', 'closed', '', 'shot1', '', '', '2016-09-17 18:31:42', '2016-09-17 13:01:42', '', '177', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot1.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('88', '2', '2016-09-17 13:54:29', '2016-09-17 08:24:29', '', 'shot2', '', 'inherit', 'closed', 'closed', '', 'shot2', '', '', '2016-09-17 13:54:29', '2016-09-17 08:24:29', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot2.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('89', '2', '2016-09-17 13:54:41', '2016-09-17 08:24:41', '', 'shot3', '', 'inherit', 'closed', 'closed', '', 'shot3', '', '', '2016-09-17 13:54:41', '2016-09-17 08:24:41', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot3.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('90', '2', '2016-09-17 13:54:51', '2016-09-17 08:24:51', '', 'shot4', '', 'inherit', 'closed', 'closed', '', 'shot4', '', '', '2016-09-17 13:54:51', '2016-09-17 08:24:51', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot4.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('91', '2', '2016-09-17 13:54:59', '2016-09-17 08:24:59', '', 'shot5', '', 'inherit', 'closed', 'closed', '', 'shot5', '', '', '2016-09-17 13:54:59', '2016-09-17 08:24:59', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot5.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('92', '2', '2016-09-17 13:55:07', '2016-09-17 08:25:07', '', 'shot6', '', 'inherit', 'closed', 'closed', '', 'shot6', '', '', '2016-09-17 13:55:07', '2016-09-17 08:25:07', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot6.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('93', '2', '2016-09-17 13:55:16', '2016-09-17 08:25:16', '', 'shot7', '', 'inherit', 'closed', 'closed', '', 'shot7', '', '', '2016-09-17 13:55:16', '2016-09-17 08:25:16', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot7.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('94', '2', '2016-09-17 13:55:23', '2016-09-17 08:25:23', '', 'shot8', '', 'inherit', 'closed', 'closed', '', 'shot8', '', '', '2016-09-17 13:55:23', '2016-09-17 08:25:23', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot8.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('95', '2', '2016-09-17 13:55:31', '2016-09-17 08:25:31', '', 'shot9', '', 'inherit', 'closed', 'closed', '', 'shot9', '', '', '2016-09-17 13:55:31', '2016-09-17 08:25:31', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot9.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('96', '2', '2016-09-17 13:55:42', '2016-09-17 08:25:42', '', 'shot10', '', 'inherit', 'closed', 'closed', '', 'shot10', '', '', '2016-09-17 13:55:42', '2016-09-17 08:25:42', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot10.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('97', '2', '2016-09-17 13:55:50', '2016-09-17 08:25:50', '', 'shot10a', '', 'inherit', 'closed', 'closed', '', 'shot10a', '', '', '2016-09-17 13:55:50', '2016-09-17 08:25:50', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot10a.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('98', '2', '2016-09-17 13:56:00', '2016-09-17 08:26:00', '', 'shot11', '', 'inherit', 'closed', 'closed', '', 'shot11', '', '', '2016-09-17 13:56:00', '2016-09-17 08:26:00', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot11.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('99', '2', '2016-09-17 13:56:12', '2016-09-17 08:26:12', '', 'shot12', '', 'inherit', 'closed', 'closed', '', 'shot12', '', '', '2016-09-17 13:56:12', '2016-09-17 08:26:12', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot12.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('100', '2', '2016-09-17 13:56:21', '2016-09-17 08:26:21', '', 'shot14', '', 'inherit', 'closed', 'closed', '', 'shot14', '', '', '2016-09-17 13:56:21', '2016-09-17 08:26:21', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('101', '2', '2016-09-17 13:56:32', '2016-09-17 08:26:32', '', 'shot14a', '', 'inherit', 'closed', 'closed', '', 'shot14a', '', '', '2016-09-17 13:56:32', '2016-09-17 08:26:32', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14a.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('102', '2', '2016-09-17 13:56:41', '2016-09-17 08:26:41', '', 'shot14b', '', 'inherit', 'closed', 'closed', '', 'shot14b', '', '', '2016-09-17 13:56:41', '2016-09-17 08:26:41', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14b.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('103', '2', '2016-09-17 13:56:51', '2016-09-17 08:26:51', '', 'shot14c', '', 'inherit', 'closed', 'closed', '', 'shot14c', '', '', '2016-09-17 13:56:51', '2016-09-17 08:26:51', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14c.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('104', '2', '2016-09-17 13:57:03', '2016-09-17 08:27:03', '', 'shot14d', '', 'inherit', 'closed', 'closed', '', 'shot14d', '', '', '2016-09-17 13:57:03', '2016-09-17 08:27:03', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14d.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('105', '2', '2016-09-17 13:57:12', '2016-09-17 08:27:12', '', 'shot14e', '', 'inherit', 'closed', 'closed', '', 'shot14e', '', '', '2016-09-17 13:57:12', '2016-09-17 08:27:12', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14e.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('106', '2', '2016-09-17 13:57:19', '2016-09-17 08:27:19', '', 'shot14ea', '', 'inherit', 'closed', 'closed', '', 'shot14ea', '', '', '2016-09-17 20:04:32', '2016-09-17 14:34:32', '', '160', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14ea.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('107', '2', '2016-09-17 13:57:29', '2016-09-17 08:27:29', '', 'shot14f', '', 'inherit', 'closed', 'closed', '', 'shot14f', '', '', '2016-09-17 13:57:29', '2016-09-17 08:27:29', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14f.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('108', '2', '2016-09-17 13:57:44', '2016-09-17 08:27:44', '', 'shot14fa', '', 'inherit', 'closed', 'closed', '', 'shot14fa', '', '', '2016-09-17 17:23:49', '2016-09-17 11:53:49', '', '160', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot14fa.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('109', '2', '2016-09-17 13:57:53', '2016-09-17 08:27:53', '', 'shot15', '', 'inherit', 'closed', 'closed', '', 'shot15', '', '', '2016-09-17 13:57:53', '2016-09-17 08:27:53', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot15.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('110', '2', '2016-09-17 13:58:02', '2016-09-17 08:28:02', '', 'shot16', '', 'inherit', 'closed', 'closed', '', 'shot16', '', '', '2016-09-17 17:53:46', '2016-09-17 12:23:46', '', '164', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot16.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('111', '2', '2016-09-17 13:58:10', '2016-09-17 08:28:10', '', 'shot17', '', 'inherit', 'closed', 'closed', '', 'shot17', '', '', '2016-09-17 13:58:10', '2016-09-17 08:28:10', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot17.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('112', '2', '2016-09-17 13:58:18', '2016-09-17 08:28:18', '', 'shot18', '', 'inherit', 'closed', 'closed', '', 'shot18', '', '', '2016-09-17 13:58:18', '2016-09-17 08:28:18', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot18.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('113', '2', '2016-09-17 13:58:24', '2016-09-17 08:28:24', '', 'shot19', '', 'inherit', 'closed', 'closed', '', 'shot19', '', '', '2016-09-17 13:58:24', '2016-09-17 08:28:24', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot19.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('114', '2', '2016-09-17 13:58:32', '2016-09-17 08:28:32', '', 'shot20', '', 'inherit', 'closed', 'closed', '', 'shot20', '', '', '2016-09-17 13:58:32', '2016-09-17 08:28:32', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot20.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('115', '2', '2016-09-17 13:58:41', '2016-09-17 08:28:41', '', 'shot21', '', 'inherit', 'closed', 'closed', '', 'shot21', '', '', '2016-09-17 13:58:41', '2016-09-17 08:28:41', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/shot21.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('118', '2', '2016-09-17 19:01:25', '2016-09-17 13:31:25', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of simultaneous users in each site.\r\n\r\n
\r\n\r\nWhy this Utility?\r\n\r\nEventhough the interface provided by mikrotik is very powerful, is not suitable for an ordinary user manager performing only the very basic activities like managing the guest users and profiles with very little effort and in an easily manageable way. Here comes the Easy HotSpot as an assistant to serve.\r\n\r\n
\r\n\r\nMajor Features:\r\n\r\nAdding Single Guest User Accounts\r\n\r\nAdding Multiple Guest User Accounts as a single lot\r\n\r\nListing Active Users\r\n\r\nListing inactive Users\r\n\r\nRemove Selected/All User Accounts\r\n\r\nRemove all validity expired User Accounts\r\n\r\nServer Log of Recent Activities\r\n\r\nRemoval of uninitiated guest accounts. Accounts created earlier but no one has started using it yet.\r\n\r\nVoucher Management and Printing. Different Voucher Printing options are available suiting needs of all.\r\n\r\nManagement of System user Accounts who are in charge of managing the guest user accounts with this utility. 3 levels of System users are there from the Super power Admin to Unit heads and normal users. There is no limit on the number of system users of any level.\r\n\r\nHotspot User Profiles Management: Creation of User profiles to changing options like Session Timeout, MAC Cookie Timeout, Keepalive Timeout, Download and Upload Speed Limits, Number of simultaneous user logins allowed per user account etc.\r\n\r\n
\r\n\r\n ', 'Easy HotSpot User Manager', '', 'publish', 'closed', 'closed', '', 'easy-hotspot-user-manager', '', '', '2016-09-17 19:03:27', '2016-09-17 13:33:27', '', '0', 'http://hotspot.helloperiyar.com/?p=118', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('119', '2', '2016-09-17 14:46:09', '2016-09-17 09:16:09', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of users in each site.\r\n\r\n ', 'Easy HotSpot User Manager', '', 'inherit', 'closed', 'closed', '', '118-revision-v1', '', '', '2016-09-17 14:46:09', '2016-09-17 09:16:09', '', '118', 'http://hotspot.helloperiyar.com/118-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('120', '2', '2016-09-17 14:56:57', '2016-09-17 09:26:57', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of simultaneous users in each site.\r\n\r\nWhy this Utility?\r\n\r\nEventhough the interface provided by mikrotik is very powerful, is not suitable for an ordinary user manager performing only the very basic activities like managing the guest users and profiles with very little effort and in an easily manageable way. Here comes the Easy HotSpot for your help.', 'Easy HotSpot User Manager', '', 'inherit', 'closed', 'closed', '', '118-revision-v1', '', '', '2016-09-17 14:56:57', '2016-09-17 09:26:57', '', '118', 'http://hotspot.helloperiyar.com/118-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('121', '2', '2016-09-17 15:13:48', '2016-09-17 09:43:48', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of simultaneous users in each site.\r\n\r\nWhy this Utility?\r\n\r\nEventhough the interface provided by mikrotik is very powerful, is not suitable for an ordinary user manager performing only the very basic activities like managing the guest users and profiles with very little effort and in an easily manageable way. Here comes the Easy HotSpot as an assistant to serve.\r\n\r\nMajor Features:\r\n\r\nAdding Single Guest User Accounts\r\n\r\nAdding Multiple Guest User Accounts as a single lot\r\n\r\nListing Active Users\r\n\r\nListing inactive Users\r\n\r\nRemove Selected/All User Accounts\r\n\r\nRemove all validity expired User Accounts\r\n\r\nServer Log of Recent Activities\r\n\r\nRemoval of uninitiated guest accounts. Accounts created earlier but no one has started using it yet.\r\n\r\nVoucher Management and Printing. Different Voucher Printing options are available suiting needs of all.\r\n\r\nManagement of System user Accounts who are in charge of managing the guest user accounts with this utility. 3 levels of System users are there from the Super power Admin to Unit heads and normal users. There is no limit on the number of system users of any level.\r\n\r\nHotspot User Profiles Management: Creation of User profiles to changing options like Session Timeout, MAC Cookie Timeout, Keepalive Timeout, Download and Upload Speed Limits, Number of simultaneous user allowed per user account etc.\r\n\r\n ', 'Easy HotSpot User Manager', '', 'inherit', 'closed', 'closed', '', '118-revision-v1', '', '', '2016-09-17 15:13:48', '2016-09-17 09:43:48', '', '118', 'http://hotspot.helloperiyar.com/118-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('122', '2', '2016-09-17 15:20:56', '2016-09-17 09:50:56', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of simultaneous users in each site.\r\n\r\nWhy this Utility?\r\n\r\nEventhough the interface provided by mikrotik is very powerful, is not suitable for an ordinary user manager performing only the very basic activities like managing the guest users and profiles with very little effort and in an easily manageable way. Here comes the Easy HotSpot as an assistant to serve.\r\n\r\nMajor Features:\r\n\r\nAdding Single Guest User Accounts\r\n\r\nAdding Multiple Guest User Accounts as a single lot\r\n\r\nListing Active Users\r\n\r\nListing inactive Users\r\n\r\nRemove Selected/All User Accounts\r\n\r\nRemove all validity expired User Accounts\r\n\r\nServer Log of Recent Activities\r\n\r\nRemoval of uninitiated guest accounts. Accounts created earlier but no one has started using it yet.\r\n\r\nVoucher Management and Printing. Different Voucher Printing options are available suiting needs of all.\r\n\r\nManagement of System user Accounts who are in charge of managing the guest user accounts with this utility. 3 levels of System users are there from the Super power Admin to Unit heads and normal users. There is no limit on the number of system users of any level.\r\n\r\nHotspot User Profiles Management: Creation of User profiles to changing options like Session Timeout, MAC Cookie Timeout, Keepalive Timeout, Download and Upload Speed Limits, Number of simultaneous user logins allowed per user account etc.\r\n\r\n ', 'Easy HotSpot User Manager', '', 'inherit', 'closed', 'closed', '', '118-revision-v1', '', '', '2016-09-17 15:20:56', '2016-09-17 09:50:56', '', '118', 'http://hotspot.helloperiyar.com/118-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('123', '2', '2016-09-17 15:22:42', '2016-09-17 09:52:42', 'Easy HotSpot is a very simple and easy to use WiFi Hotspot user management utility by Team Zetozone.\r\n\r\nIt can be used with a Mikrotik Hardware Router or a PC installed with Mikrotik RouterOS for managing WiFi hotspots. It is suitable for hotspots of any size and capacity like small internet caffes to Hotels and Resorts and Educational institutions like Universities, or Giant corporate houses employing 1000\'s of simultaneous users in each site.\r\n\r\n
\r\n\r\nWhy this Utility?\r\n\r\nEventhough the interface provided by mikrotik is very powerful, is not suitable for an ordinary user manager performing only the very basic activities like managing the guest users and profiles with very little effort and in an easily manageable way. Here comes the Easy HotSpot as an assistant to serve.\r\n\r\n
\r\n\r\nMajor Features:\r\n\r\nAdding Single Guest User Accounts\r\n\r\nAdding Multiple Guest User Accounts as a single lot\r\n\r\nListing Active Users\r\n\r\nListing inactive Users\r\n\r\nRemove Selected/All User Accounts\r\n\r\nRemove all validity expired User Accounts\r\n\r\nServer Log of Recent Activities\r\n\r\nRemoval of uninitiated guest accounts. Accounts created earlier but no one has started using it yet.\r\n\r\nVoucher Management and Printing. Different Voucher Printing options are available suiting needs of all.\r\n\r\nManagement of System user Accounts who are in charge of managing the guest user accounts with this utility. 3 levels of System users are there from the Super power Admin to Unit heads and normal users. There is no limit on the number of system users of any level.\r\n\r\nHotspot User Profiles Management: Creation of User profiles to changing options like Session Timeout, MAC Cookie Timeout, Keepalive Timeout, Download and Upload Speed Limits, Number of simultaneous user logins allowed per user account etc.\r\n\r\n
\r\n\r\n ', 'Easy HotSpot User Manager', '', 'inherit', 'closed', 'closed', '', '118-revision-v1', '', '', '2016-09-17 15:22:42', '2016-09-17 09:52:42', '', '118', 'http://hotspot.helloperiyar.com/118-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('124', '2', '2016-09-17 19:00:53', '2016-09-17 13:30:53', 'Creation of a single guest user account done here\r\n\r\nGive Username, Password, Time limit in days, Maximum data usage allowed, Bandwidth profile (Download/Upload rate limit Profile)\r\n\r\nClick Issue to create User Account or Back Button to cancel the operation.\r\n\r\n ', 'Single User Creation', '', 'publish', 'closed', 'closed', '', 'single-user-creation', '', '', '2016-09-17 19:23:18', '2016-09-17 13:53:18', '', '0', 'http://hotspot.helloperiyar.com/?p=124', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('125', '2', '2016-09-17 15:40:53', '2016-09-17 10:10:53', 'Creation of a single guest user account done here\r\n\r\nGive Username, Password, Time limit in days, Maximum data usage allowed, Bandwidth profile (Download/Upload rate limit Profile)\r\n\r\nClick Issue to create User Account or Back Button to cancel the operation.\r\n\r\nIf clicked Issue button, creates the guest user account with the given specification and pops-up a preview window before printing.\r\n\r\nNow its possible to print the Guest User voucher', 'Single User Creation', '', 'inherit', 'closed', 'closed', '', '124-revision-v1', '', '', '2016-09-17 15:40:53', '2016-09-17 10:10:53', '', '124', 'http://hotspot.helloperiyar.com/124-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('126', '2', '2016-09-17 18:59:18', '2016-09-17 13:29:18', 'Printingof single guest user account voucher\r\n\r\nIf clicked Issue button in the Add Single User menu option, creates the guest user account with the given specification and pops-up a preview window for printing.\r\n\r\nNow its possible to print the Guest User voucher by clicking the Print button', 'Single User Creation - Voucher printing', '', 'publish', 'closed', 'closed', '', 'single-user-creation-voucher-printing', '', '', '2016-09-17 19:23:40', '2016-09-17 13:53:40', '', '0', 'http://hotspot.helloperiyar.com/?p=126', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('127', '2', '2016-09-17 15:48:18', '2016-09-17 10:18:18', 'Printingof single guest user account voucher\r\n\r\nIf clicked Issue button in the Add Single User menu option, creates the guest user account with the given specification and pops-up a preview window for printing.\r\n\r\nNow its possible to print the Guest User voucher by clicking the Print button', 'Single User Creation - Voucher printing', '', 'inherit', 'closed', 'closed', '', '126-revision-v1', '', '', '2016-09-17 15:48:18', '2016-09-17 10:18:18', '', '126', 'http://hotspot.helloperiyar.com/126-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('128', '2', '2016-09-17 15:56:44', '2016-09-17 10:26:44', 'Creation of a single guest user account done here\r\n\r\nGive Username, Password, Time limit in days, Maximum data usage allowed, Bandwidth profile (Download/Upload rate limit Profile)\r\n\r\nClick Issue to create User Account or Back Button to cancel the operation.\r\n\r\n ', 'Single User Creation', '', 'inherit', 'closed', 'closed', '', '124-revision-v1', '', '', '2016-09-17 15:56:44', '2016-09-17 10:26:44', '', '124', 'http://hotspot.helloperiyar.com/124-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('129', '2', '2016-09-17 18:58:16', '2016-09-17 13:28:16', 'Creation of Multiple guest user accounts done here\r\n\r\nGive the required number of Guest user accounts to create, Username prefix if any, Password length (4 to 10 characters), Time limit in days, Maximum data usage allowed, Bandwidth profile (Download/Upload rate limit Profile) and select the option whether we need same username and password or different username and password.\r\n\r\nClick Issue to create the required number of Guest User Accounts or Back Button to cancel the operation.', 'Creation of Multiple guest user accounts', '', 'publish', 'closed', 'closed', '', 'creation-of-multiple-guest-user-accounts', '', '', '2016-09-17 19:04:23', '2016-09-17 13:34:23', '', '0', 'http://hotspot.helloperiyar.com/?p=129', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('130', '2', '2016-09-17 16:03:16', '2016-09-17 10:33:16', 'Creation of Multiple guest user accounts done here\r\n\r\nGive the required number of Guest user accounts to create, Username prefix if any, Password length (4 to 10 characters), Time limit in days, Maximum data usage allowed, Bandwidth profile (Download/Upload rate limit Profile) and select the option whether we need same username and password or different username and password.\r\n\r\nClick Issue to create the required number of Guest User Accounts or Back Button to cancel the operation.', 'Creation of Multiple guest user accounts', '', 'inherit', 'closed', 'closed', '', '129-revision-v1', '', '', '2016-09-17 16:03:16', '2016-09-17 10:33:16', '', '129', 'http://hotspot.helloperiyar.com/129-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('131', '2', '2016-09-17 18:56:40', '2016-09-17 13:26:40', 'Creation of Multiple guest user accountsSuccess\r\n\r\nAfter clicking the Issue Button in the Add Multiple User creation option, a popup window pops-up on successful creation showing that xx number of guest user accounts created successfully.\r\n\r\nFor printing the multiple guest accounts vouchers, use the Voucher printing menu option in the main menu.\r\n\r\nLast single user accounts created also can be printed using the Voucher printing menu option, but before any other guest user accounts are generated.', 'Creation of Multiple guest user accounts Success', '', 'publish', 'closed', 'closed', '', 'creation-of-multiple-guest-user-accounts-success', '', '', '2016-09-17 19:07:42', '2016-09-17 13:37:42', '', '0', 'http://hotspot.helloperiyar.com/?p=131', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('132', '2', '2016-09-17 16:11:40', '2016-09-17 10:41:40', 'Creation of Multiple guest user accounts done here\r\n\r\nAfter clicking the Issue Button in the Add Multiple User creation option, a popup window pops-up on successful creation showing that xx number of guest user accounts created successfully.\r\n\r\nFor printing the multiple guest accounts vouchers, use the Voucher printing menu option in the main menu.\r\n\r\nLast single user accounts created also can be printed using the Voucher printing menu option, but before any other guest user accounts are generated.', 'Creation of Multiple guest user accounts Success', '', 'inherit', 'closed', 'closed', '', '131-revision-v1', '', '', '2016-09-17 16:11:40', '2016-09-17 10:41:40', '', '131', 'http://hotspot.helloperiyar.com/131-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('133', '2', '2016-09-17 16:12:40', '2016-09-17 10:42:40', 'Creation of Multiple guest user accountsSuccess\r\n\r\nAfter clicking the Issue Button in the Add Multiple User creation option, a popup window pops-up on successful creation showing that xx number of guest user accounts created successfully.\r\n\r\nFor printing the multiple guest accounts vouchers, use the Voucher printing menu option in the main menu.\r\n\r\nLast single user accounts created also can be printed using the Voucher printing menu option, but before any other guest user accounts are generated.', 'Creation of Multiple guest user accounts Success', '', 'inherit', 'closed', 'closed', '', '131-revision-v1', '', '', '2016-09-17 16:12:40', '2016-09-17 10:42:40', '', '131', 'http://hotspot.helloperiyar.com/131-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('134', '2', '2016-09-17 18:55:36', '2016-09-17 13:25:36', 'Listing of Inactive Guest User Accounts\r\n\r\nListing of Inactive Guest User Accounts, accounts those are not active at the moment are listed here using the List Inactive users menu option.', 'Listing of Inactive Guest User Accounts', '', 'publish', 'closed', 'closed', '', 'listing-of-inactive-guest-user-accounts', '', '', '2016-09-17 19:25:29', '2016-09-17 13:55:29', '', '0', 'http://hotspot.helloperiyar.com/?p=134', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('135', '2', '2016-09-17 16:15:36', '2016-09-17 10:45:36', 'Listing of Inactive Guest User Accounts\r\n\r\nListing of Inactive Guest User Accounts, accounts those are not active at the moment are listed here using the List Inactive users menu option.', 'Listing of Inactive Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '134-revision-v1', '', '', '2016-09-17 16:15:36', '2016-09-17 10:45:36', '', '134', 'http://hotspot.helloperiyar.com/134-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('136', '2', '2016-09-17 18:54:02', '2016-09-17 13:24:02', 'Listing of active Guest User Accounts\r\n\r\nListing of active Guest User Accounts, accounts those are active at the moment are listed here using the List active users menu option.', 'Listing of active Guest User Accounts', '', 'publish', 'closed', 'closed', '', 'listing-of-active-guest-user-accounts', '', '', '2016-09-17 19:26:15', '2016-09-17 13:56:15', '', '0', 'http://hotspot.helloperiyar.com/?p=136', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('137', '2', '2016-09-17 16:17:02', '2016-09-17 10:47:02', 'Listing of active Guest User Accounts\r\n\r\nListing of active Guest User Accounts, accounts those are active at the moment are listed here using the List active users menu option.', 'Listing of active Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '136-revision-v1', '', '', '2016-09-17 16:17:02', '2016-09-17 10:47:02', '', '136', 'http://hotspot.helloperiyar.com/136-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('138', '2', '2016-09-17 18:45:21', '2016-09-17 13:15:21', 'Removal of Selected Guest User Accounts done here.\r\n\r\nSelect Remove Selected Users menu option for removing guest user accounts selectively.\r\n\r\nBy choosing this option we are presented with a list of Inactive user accounts(at the moment), which can be removed.\r\n\r\nWe may either use the Remove button against each row to remove them individually or tick the selection boxes in each row and finally clicking the Remove Selected Button at the bottom of the window to remove the selected accounts all along at once.\r\n\r\nPress back button to cancel/go back to main menu.', 'Removal of Selected Guest User Accounts', '', 'publish', 'closed', 'closed', '', 'removal-of-selected-guest-user-accounts', '', '', '2016-09-17 19:25:57', '2016-09-17 13:55:57', '', '0', 'http://hotspot.helloperiyar.com/?p=138', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('139', '2', '2016-09-17 16:28:21', '2016-09-17 10:58:21', 'Removal of Selected Guest User Accounts done here.\r\n\r\nSelect Remove Selected Users menu option for removing guest user accounts selectively.\r\n\r\nBy choosing this option we are presented with a list of Inactive user accounts(at the moment), which can be removed.\r\n\r\nWe may either use the Remove button against each row to remove them individually or tick the selection boxes in each row and finally clicking the Remove Selected Button at the bottom of the window to remove the selected accounts all along at once.\r\n\r\nPress back button to cancel/go back to main menu.', 'Removal of Selected Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '138-revision-v1', '', '', '2016-09-17 16:28:21', '2016-09-17 10:58:21', '', '138', 'http://hotspot.helloperiyar.com/138-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('140', '2', '2016-09-17 18:44:02', '2016-09-17 13:14:02', 'Removal of Validity expired Guest User Accounts done here\r\n\r\nClick Remove all Expired menu option to reach this list.\r\n\r\nAll user accounts having expired their validity either by using the full quota of data allowed or time limit allowed exceeded are listed in this option can be removed at once by clicking Remove All button.\r\n\r\nThis is a kind of cleanup option, which removes all validity expired guest user accounts irrespective of the age of accounts.\r\n\r\nPress back button to go back to main menu.', 'Removal of Validity Expired Guest User Accounts', '', 'publish', 'closed', 'closed', '', 'removal-of-validity-expired-guest-user-accounts', '', '', '2016-09-17 19:27:57', '2016-09-17 13:57:57', '', '0', 'http://hotspot.helloperiyar.com/?p=140', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('141', '2', '2016-09-17 16:35:02', '2016-09-17 11:05:02', 'Removal of Validity expired Guest User Accounts done here\r\n\r\nClick Remove all Expired menu option to reach this list.\r\n\r\nAll user accounts having expired their validity either by using the full quota of data allowed or time limit allowed exceeded are listed in this option can be removed at once by clicking Remove All button.\r\n\r\nPress back button to go back to main menu.', 'Removal of Validity expired Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '140-revision-v1', '', '', '2016-09-17 16:35:02', '2016-09-17 11:05:02', '', '140', 'http://hotspot.helloperiyar.com/140-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('142', '2', '2016-09-17 16:36:16', '2016-09-17 11:06:16', 'Removal of Validity expired Guest User Accounts done here\n\nClick Remove all Expired menu option to reach this list.\n\nAll user accounts having expired their validity either by using the full quota of data allowed or time limit allowed exceeded are listed in this option can be removed at once by clicking Remove All button.\n\nThis is a kind of cleanup option, which removes all validity\n\nPress back button to go back to main menu.', 'Removal of Validity expired Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '140-autosave-v1', '', '', '2016-09-17 16:36:16', '2016-09-17 11:06:16', '', '140', 'http://hotspot.helloperiyar.com/140-autosave-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('143', '2', '2016-09-17 16:36:49', '2016-09-17 11:06:49', 'Removal of Validity expired Guest User Accounts done here\r\n\r\nClick Remove all Expired menu option to reach this list.\r\n\r\nAll user accounts having expired their validity either by using the full quota of data allowed or time limit allowed exceeded are listed in this option can be removed at once by clicking Remove All button.\r\n\r\nThis is a kind of cleanup option, which removes all validity expired guest user accounts irrespective of the age of accounts.\r\n\r\nPress back button to go back to main menu.', 'Removal of Validity expired Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '140-revision-v1', '', '', '2016-09-17 16:36:49', '2016-09-17 11:06:49', '', '140', 'http://hotspot.helloperiyar.com/140-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('144', '2', '2016-09-17 16:37:13', '2016-09-17 11:07:13', 'Removal of Validity expired Guest User Accounts done here\r\n\r\nClick Remove all Expired menu option to reach this list.\r\n\r\nAll user accounts having expired their validity either by using the full quota of data allowed or time limit allowed exceeded are listed in this option can be removed at once by clicking Remove All button.\r\n\r\nThis is a kind of cleanup option, which removes all validity expired guest user accounts irrespective of the age of accounts.\r\n\r\nPress back button to go back to main menu.', 'Removal of Validity Expired Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '140-revision-v1', '', '', '2016-09-17 16:37:13', '2016-09-17 11:07:13', '', '140', 'http://hotspot.helloperiyar.com/140-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('145', '2', '2016-09-17 18:14:40', '2016-09-17 12:44:40', 'Removal of Uninitiated Guest User Accounts done here\r\n\r\nClick Remove all Uninitiated menu option to reach this list.\r\n\r\nAll user accounts having not yet initiated any activities from creation are listed in this option can be removed at once by clicking Remove button.\r\n\r\nThis is a kind of cleanup option, which removes all uninitiated guest user accounts irrespective of the age of accounts.\r\n\r\nPress back button to go back to main menu.', 'Removal of Uninitiated Guest User Accounts', '', 'publish', 'closed', 'closed', '', 'removal-of-uninitiated-guest-user-accounts', '', '', '2016-09-17 19:57:32', '2016-09-17 14:27:32', '', '0', 'http://hotspot.helloperiyar.com/?p=145', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('146', '2', '2016-09-17 16:41:40', '2016-09-17 11:11:40', 'Removal of Uninitiated Guest User Accounts done here\r\n\r\nClick Remove all Uninitiated menu option to reach this list.\r\n\r\nAll user accounts having not yet initiated any activities from creation are listed in this option can be removed at once by clicking Remove button.\r\n\r\nThis is a kind of cleanup option, which removes all uninitiated guest user accounts irrespective of the age of accounts.\r\n\r\nPress back button to go back to main menu.', 'Removal of Uninitiated Guest User Accounts', '', 'inherit', 'closed', 'closed', '', '145-revision-v1', '', '', '2016-09-17 16:41:40', '2016-09-17 11:11:40', '', '145', 'http://hotspot.helloperiyar.com/145-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('147', '2', '2016-09-17 18:43:38', '2016-09-17 13:13:38', 'Server Log of recent Activities Listed here\r\n\r\nLast 1000 activities in the server listed here for verification/cross checking purpose.\r\n\r\nPress Server Log in the menu option to reach here.', 'Server Log of recent Activities', '', 'publish', 'closed', 'closed', '', 'server-log-of-recent-activities', '', '', '2016-09-17 19:28:22', '2016-09-17 13:58:22', '', '0', 'http://hotspot.helloperiyar.com/?p=147', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('148', '2', '2016-09-17 16:48:38', '2016-09-17 11:18:38', 'Server Log of recent Activities Listed here\r\n\r\nLast 1000 activities in the server listed here for verification/cross checking purpose.\r\n\r\nPress Server Log in the menu option to reach here.', 'Server Log of recent Activities', '', 'inherit', 'closed', 'closed', '', '147-revision-v1', '', '', '2016-09-17 16:48:38', '2016-09-17 11:18:38', '', '147', 'http://hotspot.helloperiyar.com/147-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('149', '2', '2016-09-17 18:40:23', '2016-09-17 13:10:23', 'Guest User Voucher Printing options are available from the Voucher Printing menu option.\r\n\r\nThe LAST voucher/vouchers generated through the Add Single User/Add Multiple Users option can be printed using this option.\r\n\r\nThere are about 6 different voucher format choices available in the menu, which has to be clicked to get the printout of the voucher/List of Guest accounts in the selected format.\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  10. \r\n
  11. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  12. \r\n
\r\nClick Main menu option to go back to Main menu and Reset Option to Refresh the Voucher Printing Page.', 'Guest User Voucher Printing', '', 'publish', 'closed', 'closed', '', 'guest-user-voucher-printing', '', '', '2016-09-17 19:28:41', '2016-09-17 13:58:41', '', '0', 'http://hotspot.helloperiyar.com/?p=149', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('150', '2', '2016-09-17 17:06:23', '2016-09-17 11:36:23', 'Guest User Voucher Printing options are available from the Voucher Printing menu option.\r\n\r\nThe LAST voucher/vouchers generated through the Add Single User/Add Multiple Users option can be printed using this option.\r\n\r\nThere are about 6 different voucher format choices available in the menu, which has to be clicked to get the printout of the voucher/List of Guest accounts in the selected format.\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  10. \r\n
  11. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  12. \r\n
\r\nClick Main menu option to go back to Main menu and Reset Option to Refresh the Voucher Printing Page.', 'Guest User Voucher Printing', '', 'inherit', 'closed', 'closed', '', '149-revision-v1', '', '', '2016-09-17 17:06:23', '2016-09-17 11:36:23', '', '149', 'http://hotspot.helloperiyar.com/149-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('151', '2', '2016-09-17 18:38:48', '2016-09-17 13:08:48', 'Voucher printing - Single account per row list\r\n\r\nOther Options are:\r\n
    \r\n
  1. Two accounts per row list (Plain list for printing as a list)
  2. \r\n
  3. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Single account per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-account-per-row-list', '', '', '2016-09-17 19:50:16', '2016-09-17 14:20:16', '', '0', 'http://hotspot.helloperiyar.com/?p=151', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('152', '2', '2016-09-17 17:09:48', '2016-09-17 11:39:48', 'Voucher printing - Single account per row list\r\n\r\nOther Options are:\r\n
    \r\n
  1. Two accounts per row list (Plain list for printing as a list)
  2. \r\n
  3. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Single account per row list', '', 'inherit', 'closed', 'closed', '', '151-revision-v1', '', '', '2016-09-17 17:09:48', '2016-09-17 11:39:48', '', '151', 'http://hotspot.helloperiyar.com/151-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('153', '2', '2016-09-17 18:36:15', '2016-09-17 13:06:15', 'Voucher printing - Two accounts per row list\r\n\r\nOther Options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Two accounts per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-two-accounts-per-row-list', '', '', '2016-09-17 19:50:27', '2016-09-17 14:20:27', '', '0', 'http://hotspot.helloperiyar.com/?p=153', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('154', '2', '2016-09-17 17:12:15', '2016-09-17 11:42:15', 'Voucher printing - Two accounts per row list\r\n\r\nOther Options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Two accounts per row list', '', 'inherit', 'closed', 'closed', '', '153-revision-v1', '', '', '2016-09-17 17:12:15', '2016-09-17 11:42:15', '', '153', 'http://hotspot.helloperiyar.com/153-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('155', '2', '2016-09-17 18:34:18', '2016-09-17 13:04:18', 'Voucher printing - Three accounts per row list\r\n\r\nThis is for printing as a compressed list to save space, but remember this should be used for SAME PASSWORD/USERNAME accounts only\r\n\r\nOther Options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Three accounts per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-three-accounts-per-row-list', '', '', '2016-09-17 19:50:41', '2016-09-17 14:20:41', '', '0', 'http://hotspot.helloperiyar.com/?p=155', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('156', '2', '2016-09-17 17:16:18', '2016-09-17 11:46:18', 'Voucher printing - Three accounts per row list\r\n\r\nThis is for printing as a compressed list to save space, but remember this should be used for SAME PASSWORD/USERNAME accounts only\r\n\r\nOther Options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list(Plain list for printing as a list)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Three accounts per row list', '', 'inherit', 'closed', 'closed', '', '155-revision-v1', '', '', '2016-09-17 17:16:18', '2016-09-17 11:46:18', '', '155', 'http://hotspot.helloperiyar.com/155-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('157', '2', '2016-09-17 17:18:34', '2016-09-17 11:48:34', 'Voucher printing - Three accounts per row list\r\n\r\nThis is for printing as a compressed list to save space, but remember this should be used for SAME PASSWORD/USERNAME accounts only\r\n\r\nOther Options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Single account in 2 rows(Plain list for printing as a list)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Three accounts per row list', '', 'inherit', 'closed', 'closed', '', '155-revision-v1', '', '', '2016-09-17 17:18:34', '2016-09-17 11:48:34', '', '155', 'http://hotspot.helloperiyar.com/155-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('158', '2', '2016-09-17 18:32:57', '2016-09-17 13:02:57', 'Voucher Printing - Single account in 2 rows\r\n\r\nOther options are\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher Printing - Single account in 2 rows', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-account-in-2-rows', '', '', '2016-09-17 19:52:17', '2016-09-17 14:22:17', '', '0', 'http://hotspot.helloperiyar.com/?p=158', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('159', '2', '2016-09-17 17:20:57', '2016-09-17 11:50:57', 'Voucher Printing - Single account in 2 rows\r\n\r\nOther options are\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher Printing - Single account in 2 rows', '', 'inherit', 'closed', 'closed', '', '158-revision-v1', '', '', '2016-09-17 17:20:57', '2016-09-17 11:50:57', '', '158', 'http://hotspot.helloperiyar.com/158-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('160', '2', '2016-09-17 18:30:25', '2016-09-17 13:00:25', '\"shot14ea\"Voucher Printing - Single Voucher as a formatted slip/ID card like format\r\n\r\nAdjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher Printing - Single Voucher as a formatted slip/ID card like format', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-voucher-as-a-formatted-slipid-card-like-format', '', '', '2016-09-17 20:04:43', '2016-09-17 14:34:43', '', '0', 'http://hotspot.helloperiyar.com/?p=160', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('161', '2', '2016-09-17 17:24:25', '2016-09-17 11:54:25', 'V\"shot14fa\"oucher Printing - Single Voucher as a formatted slip/ID card like format\r\n\r\nAdjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher Printing - Single Voucher as a formatted slip/ID card like format', '', 'inherit', 'closed', 'closed', '', '160-revision-v1', '', '', '2016-09-17 17:24:25', '2016-09-17 11:54:25', '', '160', 'http://hotspot.helloperiyar.com/160-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('162', '2', '2016-09-17 18:27:07', '2016-09-17 12:57:07', '\"shot14fa\"Voucher printing - Three accounts per row and as formatted slip/ID card like format\r\n\r\nAdjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option\r\n\r\nOther Printing options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Three accounts per row and as formatted slip/ID card like format', '', 'publish', 'closed', 'closed', '', 'voucher-printing-three-accounts-per-row-and-as-formatted-slipid-card-like-format', '', '', '2016-09-17 19:52:49', '2016-09-17 14:22:49', '', '0', 'http://hotspot.helloperiyar.com/?p=162', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('163', '2', '2016-09-17 17:27:07', '2016-09-17 11:57:07', '\"shot14fa\"Voucher printing - Three accounts per row and as formatted slip/ID card like format\r\n\r\nAdjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option\r\n\r\nOther Printing options are:\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Single Voucher as a formatted slip/ID card like format(Adjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option)
  10. \r\n
', 'Voucher printing - Three accounts per row and as formatted slip/ID card like format', '', 'inherit', 'closed', 'closed', '', '162-revision-v1', '', '', '2016-09-17 17:27:07', '2016-09-17 11:57:07', '', '162', 'http://hotspot.helloperiyar.com/162-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('164', '2', '2016-09-17 18:18:41', '2016-09-17 12:48:41', 'Managing System Users\r\n\r\nWhen clicked the System users menu option, will present a list of all System users available in the system whether active or not. Active/Inactive users are listed in different colors to easily recognize the System user account status.\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nW\"shot16\"hen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System Users', '', 'publish', 'closed', 'closed', '', 'managing-system-users', '', '', '2016-09-17 19:55:29', '2016-09-17 14:25:29', '', '0', 'http://hotspot.helloperiyar.com/?p=164', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('165', '2', '2016-09-17 17:47:41', '2016-09-17 12:17:41', 'When clicked the System users menu option, will present a list of all System users available in the system whether active or not. Active/Inactive users are listed in different colors to easily recognize the System user account status.\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nWhen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System Users', '', 'inherit', 'closed', 'closed', '', '164-revision-v1', '', '', '2016-09-17 17:47:41', '2016-09-17 12:17:41', '', '164', 'http://hotspot.helloperiyar.com/164-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('166', '2', '2016-09-17 18:16:42', '2016-09-17 12:46:42', 'System user accountManagement By Admin\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nWhen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System User Accounts by Admins', '', 'publish', 'closed', 'closed', '', 'managing-system-user-accounts-by-admins', '', '', '2016-09-17 19:57:11', '2016-09-17 14:27:11', '', '0', 'http://hotspot.helloperiyar.com/?p=166', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('167', '2', '2016-09-17 17:50:42', '2016-09-17 12:20:42', 'System user account status.\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nWhen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System User Accounts by Admins', '', 'inherit', 'closed', 'closed', '', '166-revision-v1', '', '', '2016-09-17 17:50:42', '2016-09-17 12:20:42', '', '166', 'http://hotspot.helloperiyar.com/166-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('168', '2', '2016-09-17 17:51:32', '2016-09-17 12:21:32', 'System user accountManagement By Admin\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nWhen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System User Accounts by Admins', '', 'inherit', 'closed', 'closed', '', '166-revision-v1', '', '', '2016-09-17 17:51:32', '2016-09-17 12:21:32', '', '166', 'http://hotspot.helloperiyar.com/166-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('169', '2', '2016-09-17 17:53:41', '2016-09-17 12:23:41', 'Managing System Users\n\nWhen clicked the System users menu option, will present a list of all System users available in the system whether active or not. Active/Inactive users are listed in different colors to easily recognize the System user account status.\n\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\n\nSystem user management is activated by clicking the System Users menu option.\n\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\n\nWhen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\n\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\n\nThere is no limit on the number of users in each level.\n\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System Users', '', 'inherit', 'closed', 'closed', '', '164-autosave-v1', '', '', '2016-09-17 17:53:41', '2016-09-17 12:23:41', '', '164', 'http://hotspot.helloperiyar.com/164-autosave-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('170', '2', '2016-09-17 17:54:22', '2016-09-17 12:24:22', 'Managing System Users\r\n\r\nWhen clicked the System users menu option, will present a list of all System users available in the system whether active or not. Active/Inactive users are listed in different colors to easily recognize the System user account status.\r\n\r\nSystem users are the in-house persons authorized to manage the activities of the WiFi Hotspot setup. They only operate this utility and is required to login with their username and password to gain access to this utility. So it is required to create those system user accounts by the Super user of this setup, the Admin user. Only Admin user(s) are permitted to manage system user accounts.\r\n\r\nSystem user management is activated by clicking the System Users menu option.\r\n\r\nSystem users can be created, edited and deleted by the admin. He/she can reset their passwords also.\r\n\r\nW\"shot16\"hen created all system user accounts will be having a default password of \'password\', which can be changed by themselves after logging in and through the System Users menu option.\r\n\r\nThere are 3 levels of System users, viz Admin User, Unit heads and System Users.\r\n\r\nThere is no limit on the number of users in each level.\r\n\r\nAdmin level users only can manage other system user\'s accounts. He/She can deactivate/Activate any System user on will.', 'Managing System Users', '', 'inherit', 'closed', 'closed', '', '164-revision-v1', '', '', '2016-09-17 17:54:22', '2016-09-17 12:24:22', '', '164', 'http://hotspot.helloperiyar.com/164-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('171', '2', '2016-09-17 18:00:14', '2016-09-17 12:30:14', 'Managing Hotspot User profiles\r\n\r\nWhen clicked the User Profilesmenu option, will present a list of all user profilesavailable in the hotspot along witha few of its specifications.\r\n\r\nHotspot User Profiles are created and stored in the Hotspot server and is used for managing the guest users\' activities in the hotspot. Only Admin user(s) and to a certain extend unithead users are also permitted to manage system hotspot user profiles.\r\n\r\nHotspot User Profiles management is activated by clicking the Hotspot User profiles menu option.\r\n\r\nHotspot User Profiles can be created, edited and deleted by the admin level accounts and to a certain level unit head level system users also.\r\n\r\nWhen creating Hotspot User Profiles if not supplied all options thosewill be defaulted to some safe values, which can be changed later by admin level users.\r\n\r\nThe options available are the Session Timeout values, MAC Cookie timeout, Keepalive Timeout and Download/Upload Rate limits and the number of concurrent users allowed for this profile.\r\n\r\nThere is no limit on the number of profiles created in the server.\r\n\r\nAdmin level users only can manage Hotspot user profiles. He/She can edit/remove any User profile on will.\r\n\r\nTo create a new profile, click the MORE OPTIONS Button of any profile row and click the Add New button after changing the Name of the Profile. Change the required options as per the choice and save the profile. The created profiles will be available to the guest user accounts when creating them to select with to control Speed Limit etc.', 'Managing Hotspot User profiles', '', 'publish', 'closed', 'closed', '', 'managing-hotspot-user-profiles', '', '', '2016-09-17 19:54:50', '2016-09-17 14:24:50', '', '0', 'http://hotspot.helloperiyar.com/?p=171', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('172', '2', '2016-09-17 18:16:14', '2016-09-17 12:46:14', 'Managing Hotspot User profiles\r\n\r\nWhen clicked the User Profilesmenu option, will present a list of all user profilesavailable in the hotspot along witha few of its specifications.\r\n\r\nHotspot User Profiles are created and stored in the Hotspot server and is used for managing the guest users\' activities in the hotspot. Only Admin user(s) and to a certain extend unithead users are also permitted to manage system hotspot user profiles.\r\n\r\nHotspot User Profiles management is activated by clicking the Hotspot User profiles menu option.\r\n\r\nHotspot User Profiles can be created, edited and deleted by the admin level accounts and to a certain level unit head level system users also.\r\n\r\nWhen creating Hotspot User Profiles if not supplied all options thosewill be defaulted to some safe values, which can be changed later by admin level users.\r\n\r\nThe options available are the Session Timeout values, MAC Cookie timeout, Keepalive Timeout and Download/Upload Rate limits and the number of concurrent users allowed for this profile.\r\n\r\nThere is no limit on the number of profiles created in the server.\r\n\r\nAdmin level users only can manage Hotspot user profiles. He/She can edit/remove any User profile on will.\r\n\r\nTo create a new profile, click the MORE OPTIONS Button of any profile row and click the Add New button after changing the Name of the Profile. Change the required options as per the choice and save the profile. The created profiles will be available to the guest user accounts when creating them to select with to control Speed Limit etc.', 'Managing Hotspot User profiles', '', 'inherit', 'closed', 'closed', '', '171-revision-v1', '', '', '2016-09-17 18:16:14', '2016-09-17 12:46:14', '', '171', 'http://hotspot.helloperiyar.com/171-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('173', '2', '2016-09-17 17:58:45', '2016-09-17 12:28:45', 'Managing Hotspot User profiles - By Administrative level System Users\r\n\r\nWhen clicked the User Profilesmenu option, will present a list of all user profilesavailable in the hotspot along witha few of its specifications.\r\n\r\nHotspot User Profiles are created and stored in the Hotspot server and is used for managing the guest users\' activities in the hotspot. Only Admin user(s) and to a certain extend unithead users are also permitted to manage system hotspot user profiles.\r\n\r\nHotspot User Profiles management is activated by clicking the Hotspot User profiles menu option.\r\n\r\nHotspot User Profiles can be created, edited and deleted by the admin level accounts and to a certain level unit head level system users also.\r\n\r\nWhen creating Hotspot User Profiles if not supplied all options thosewill be defaulted to some safe values, which can be changed later by admin level users.\r\n\r\nThe options available are the Session Timeout values, MAC Cookie timeout, Keepalive Timeout and Download/Upload Rate limits and the number of concurrent users allowed for this profile.\r\n\r\nThere is no limit on the number of profiles created in the server.\r\n\r\nAdmin level users only can manage Hotspot user profiles. He/She can edit/remove any User profile on will.\r\n\r\nTo create a new profile, click the MORE OPTIONS Button of any profile row and click the Add New button after changing the Name of the Profile. Change the required options as per the choice and save the profile. The created profiles will be available to the guest user accounts when creating them to select with to control Speed Limit etc.', 'Managing Hotspot User profiles - By Administrative level System Users', '', 'publish', 'closed', 'closed', '', 'managing-hotspot-user-profiles-by-administrative-level-system-users', '', '', '2016-09-17 19:58:41', '2016-09-17 14:28:41', '', '0', 'http://hotspot.helloperiyar.com/?p=173', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('174', '2', '2016-09-17 18:17:45', '2016-09-17 12:47:45', 'Managing Hotspot User profiles - By Administrative level System Users\r\n\r\nWhen clicked the User Profilesmenu option, will present a list of all user profilesavailable in the hotspot along witha few of its specifications.\r\n\r\nHotspot User Profiles are created and stored in the Hotspot server and is used for managing the guest users\' activities in the hotspot. Only Admin user(s) and to a certain extend unithead users are also permitted to manage system hotspot user profiles.\r\n\r\nHotspot User Profiles management is activated by clicking the Hotspot User profiles menu option.\r\n\r\nHotspot User Profiles can be created, edited and deleted by the admin level accounts and to a certain level unit head level system users also.\r\n\r\nWhen creating Hotspot User Profiles if not supplied all options thosewill be defaulted to some safe values, which can be changed later by admin level users.\r\n\r\nThe options available are the Session Timeout values, MAC Cookie timeout, Keepalive Timeout and Download/Upload Rate limits and the number of concurrent users allowed for this profile.\r\n\r\nThere is no limit on the number of profiles created in the server.\r\n\r\nAdmin level users only can manage Hotspot user profiles. He/She can edit/remove any User profile on will.\r\n\r\nTo create a new profile, click the MORE OPTIONS Button of any profile row and click the Add New button after changing the Name of the Profile. Change the required options as per the choice and save the profile. The created profiles will be available to the guest user accounts when creating them to select with to control Speed Limit etc.', 'Managing Hotspot User profiles - By Administrative level System Users', '', 'inherit', 'closed', 'closed', '', '173-revision-v1', '', '', '2016-09-17 18:17:45', '2016-09-17 12:47:45', '', '173', 'http://hotspot.helloperiyar.com/173-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('175', '2', '2016-09-17 17:54:58', '2016-09-17 12:24:58', 'Why there is a REFRESH Menu button?\r\n\r\nThe Easy HotSpot utility is designed to perform like an SPA Application to speed up and secure the activities. It acts immediately to every System user actions but not immediately updates the screen in order to have maximum speed and performance. In most cases this is not required also.\r\n\r\nIn cases where we want to show the updated lists/status of items/activities, please use REFRESH button shown in the main menu.', 'Why there is a REFRESH Menu option?', '', 'publish', 'closed', 'closed', '', 'why-there-is-a-refresh-menu-option', '', '', '2016-09-17 19:59:11', '2016-09-17 14:29:11', '', '0', 'http://hotspot.helloperiyar.com/?p=175', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('176', '2', '2016-09-17 18:28:58', '2016-09-17 12:58:58', 'Why there is a REFRESH Menu button?\r\n\r\nThe Easy HotSpot utility is designed to perform like an SPA Application to speed up and secure the activities. It acts immediately to every System user actions but not immediately updates the screen in order to have maximum speed and performance. In most cases this is not required also.\r\n\r\nIn cases where we want to show the updated lists/status of items/activities, please use REFRESH button shown in the main menu.', 'Why there is a REFRESH Menu option?', '', 'inherit', 'closed', 'closed', '', '175-revision-v1', '', '', '2016-09-17 18:28:58', '2016-09-17 12:58:58', '', '175', 'http://hotspot.helloperiyar.com/175-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('177', '2', '2016-09-17 17:50:35', '2016-09-17 12:20:35', '\"shot1\"\r\n\r\n \r\n

Login

\r\n

and

\r\n

Logout

\r\n

Options

\r\n

for

\r\n

System Users

', 'Login and Logout', '', 'publish', 'closed', 'closed', '', 'login-and-logout', '', '', '2016-09-17 19:58:56', '2016-09-17 14:28:56', '', '0', 'http://hotspot.helloperiyar.com/?p=177', '0', 'post', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('178', '2', '2016-09-17 18:34:35', '2016-09-17 13:04:35', '\"shot1\"\r\n\r\n \r\n

Login

\r\n

and

\r\n

Logout

\r\n

Options

', 'Login and Logout', '', 'inherit', 'closed', 'closed', '', '177-revision-v1', '', '', '2016-09-17 18:34:35', '2016-09-17 13:04:35', '', '177', 'http://hotspot.helloperiyar.com/177-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('179', '2', '2016-09-17 18:35:25', '2016-09-17 13:05:25', '\"shot1\"\r\n\r\n \r\n

Login

\r\n

and

\r\n

Logout

\r\n

Options

\r\n

for

\r\n

System Users

', 'Login and Logout', '', 'inherit', 'closed', 'closed', '', '177-revision-v1', '', '', '2016-09-17 18:35:25', '2016-09-17 13:05:25', '', '177', 'http://hotspot.helloperiyar.com/177-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('180', '2', '2016-09-17 19:14:12', '2016-09-17 13:44:12', '', 'header', '', 'inherit', 'closed', 'closed', '', 'header', '', '', '2016-09-17 19:14:12', '2016-09-17 13:44:12', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/header.png', '0', 'attachment', 'image/png', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('181', '2', '2016-09-17 19:19:19', '2016-09-17 13:49:19', '', 'header', '', 'inherit', 'closed', 'closed', '', 'header-2', '', '', '2016-09-17 19:19:19', '2016-09-17 13:49:19', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/header.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('182', '2', '2016-09-17 19:19:47', '2016-09-17 13:49:47', '', 'cropped-header.jpg', '', 'inherit', 'closed', 'closed', '', 'cropped-header-jpg', '', '', '2016-09-17 19:19:47', '2016-09-17 13:49:47', '', '0', 'http://hotspot.helloperiyar.com/wp-content/uploads/2016/09/cropped-header.jpg', '0', 'attachment', 'image/jpeg', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('183', '2', '2016-09-17 20:04:43', '2016-09-17 14:34:43', '\"shot14ea\"Voucher Printing - Single Voucher as a formatted slip/ID card like format\r\n\r\nAdjust the paper size while printing to get a neat output, normally Envelope type paper sizes are selected with this option\r\n
    \r\n
  1. Single account per row list (Plain list for printing as a list)
  2. \r\n
  3. Two accounts per row list (Plain list for printing as a list)
  4. \r\n
  5. Three accounts per row list(Plain list for printing as a list, but remember this should be used for SAME PASSWORD/USERNAME accounts only)
  6. \r\n
  7. Single account in 2 rows(Plain list for printing as a list)
  8. \r\n
  9. Three accounts per row andas formatted slip/ID card like format(Adjust the paper size while printing to adjust the size of the output slip, normally A4/like paper sizes are selected with this option)
  10. \r\n
', 'Voucher Printing - Single Voucher as a formatted slip/ID card like format', '', 'inherit', 'closed', 'closed', '', '160-revision-v1', '', '', '2016-09-17 20:04:43', '2016-09-17 14:34:43', '', '160', 'http://hotspot.helloperiyar.com/160-revision-v1/', '0', 'revision', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('184', '2', '2016-09-17 20:06:35', '2016-09-17 14:36:35', ' ', '', '', 'publish', 'closed', 'closed', '', '184', '', '', '2016-09-17 20:23:01', '2016-09-17 14:53:01', '', '0', 'http://hotspot.helloperiyar.com/?p=184', '1', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('208', '2', '2016-09-17 20:15:05', '2016-09-17 14:45:05', ' ', '', '', 'publish', 'closed', 'closed', '', '208', '', '', '2016-09-17 20:15:05', '2016-09-17 14:45:05', '', '0', 'http://hotspot.helloperiyar.com/?p=208', '1', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('209', '2', '2016-09-17 20:15:05', '2016-09-17 14:45:05', ' ', '', '', 'publish', 'closed', 'closed', '', '209', '', '', '2016-09-17 20:15:05', '2016-09-17 14:45:05', '', '0', 'http://hotspot.helloperiyar.com/?p=209', '2', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('210', '2', '2016-09-17 20:15:05', '2016-09-17 14:45:05', ' ', '', '', 'publish', 'closed', 'closed', '', '210', '', '', '2016-09-17 20:15:05', '2016-09-17 14:45:05', '', '0', 'http://hotspot.helloperiyar.com/?p=210', '3', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('211', '2', '2016-09-17 20:15:05', '2016-09-17 14:45:05', ' ', '', '', 'publish', 'closed', 'closed', '', '211', '', '', '2016-09-17 20:15:05', '2016-09-17 14:45:05', '', '0', 'http://hotspot.helloperiyar.com/?p=211', '4', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('212', '2', '2016-09-17 20:15:06', '2016-09-17 14:45:06', ' ', '', '', 'publish', 'closed', 'closed', '', '212', '', '', '2016-09-17 20:15:06', '2016-09-17 14:45:06', '', '0', 'http://hotspot.helloperiyar.com/?p=212', '5', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('213', '2', '2016-09-17 20:15:06', '2016-09-17 14:45:06', ' ', '', '', 'publish', 'closed', 'closed', '', '213', '', '', '2016-09-17 20:15:06', '2016-09-17 14:45:06', '', '0', 'http://hotspot.helloperiyar.com/?p=213', '6', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('214', '2', '2016-09-17 20:15:06', '2016-09-17 14:45:06', ' ', '', '', 'publish', 'closed', 'closed', '', '214', '', '', '2016-09-17 20:15:06', '2016-09-17 14:45:06', '', '0', 'http://hotspot.helloperiyar.com/?p=214', '7', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('215', '2', '2016-09-17 20:15:07', '2016-09-17 14:45:07', ' ', '', '', 'publish', 'closed', 'closed', '', '215', '', '', '2016-09-17 20:15:07', '2016-09-17 14:45:07', '', '0', 'http://hotspot.helloperiyar.com/?p=215', '8', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('216', '2', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', 'Managing Hotspot User profiles By Administrative level System Users', '', 'publish', 'closed', 'closed', '', 'managing-hotspot-user-profiles-by-administrative-level-system-users-2', '', '', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', '0', 'http://hotspot.helloperiyar.com/?p=216', '1', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('217', '2', '2016-09-17 20:17:23', '2016-09-17 14:47:23', ' ', '', '', 'publish', 'closed', 'closed', '', '217', '', '', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', '0', 'http://hotspot.helloperiyar.com/?p=217', '2', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('218', '2', '2016-09-17 20:17:23', '2016-09-17 14:47:23', ' ', '', '', 'publish', 'closed', 'closed', '', '218', '', '', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', '0', 'http://hotspot.helloperiyar.com/?p=218', '3', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('219', '2', '2016-09-17 20:17:23', '2016-09-17 14:47:23', ' ', '', '', 'publish', 'closed', 'closed', '', '219', '', '', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', '0', 'http://hotspot.helloperiyar.com/?p=219', '4', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('220', '2', '2016-09-17 20:17:23', '2016-09-17 14:47:23', ' ', '', '', 'publish', 'closed', 'closed', '', '220', '', '', '2016-09-17 20:17:23', '2016-09-17 14:47:23', '', '0', 'http://hotspot.helloperiyar.com/?p=220', '5', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('221', '2', '2016-09-17 20:17:24', '2016-09-17 14:47:24', ' ', '', '', 'publish', 'closed', 'closed', '', '221', '', '', '2016-09-17 20:17:24', '2016-09-17 14:47:24', '', '0', 'http://hotspot.helloperiyar.com/?p=221', '6', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('222', '2', '2016-09-17 20:17:24', '2016-09-17 14:47:24', ' ', '', '', 'publish', 'closed', 'closed', '', '222', '', '', '2016-09-17 20:17:24', '2016-09-17 14:47:24', '', '0', 'http://hotspot.helloperiyar.com/?p=222', '7', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('223', '2', '2016-09-17 20:17:24', '2016-09-17 14:47:24', ' ', '', '', 'publish', 'closed', 'closed', '', '223', '', '', '2016-09-17 20:17:24', '2016-09-17 14:47:24', '', '0', 'http://hotspot.helloperiyar.com/?p=223', '8', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('224', '2', '2016-09-17 20:19:01', '2016-09-17 14:49:01', '', 'Single User Creation Voucher printing', '', 'publish', 'closed', 'closed', '', 'single-user-creation-voucher-printing-2', '', '', '2016-09-17 20:19:01', '2016-09-17 14:49:01', '', '0', 'http://hotspot.helloperiyar.com/?p=224', '1', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('225', '2', '2016-09-17 20:19:01', '2016-09-17 14:49:01', '', 'Voucher Printing Single account in 2 rows', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-account-in-2-rows-2', '', '', '2016-09-17 20:19:01', '2016-09-17 14:49:01', '', '0', 'http://hotspot.helloperiyar.com/?p=225', '2', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('226', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', 'Voucher printing Single account per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-account-per-row-list-2', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=226', '3', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('227', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', 'Voucher Printing Single Voucher as a formatted slip/ID card like format', '', 'publish', 'closed', 'closed', '', 'voucher-printing-single-voucher-as-a-formatted-slipid-card-like-format-2', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=227', '4', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('228', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', 'Voucher printing Three accounts per row and as formatted slip/ID card like format', '', 'publish', 'closed', 'closed', '', 'voucher-printing-three-accounts-per-row-and-as-formatted-slipid-card-like-format-2', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=228', '5', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('229', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', 'Voucher printing Three accounts per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-three-accounts-per-row-list-2', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=229', '6', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('230', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', 'Voucher printing Two accounts per row list', '', 'publish', 'closed', 'closed', '', 'voucher-printing-two-accounts-per-row-list-2', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=230', '7', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('231', '2', '2016-09-17 20:19:03', '2016-09-17 14:49:03', ' ', '', '', 'publish', 'closed', 'closed', '', '231', '', '', '2016-09-17 20:19:03', '2016-09-17 14:49:03', '', '0', 'http://hotspot.helloperiyar.com/?p=231', '8', 'nav_menu_item', '', '0'); +INSERT INTO `wp_wp_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES ('232', '2', '2016-09-17 20:26:34', '2016-09-17 14:56:34', 'Team Zetozone:\n
Hi there! We are Zetozone
\n...and we are Zetozone:\n
The Zetozone Technologies (India) Pvt. Ltd XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.
\nAs a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!', 'Team Zetozone', '', 'inherit', 'closed', 'closed', '', '2-autosave-v1', '', '', '2016-09-17 20:26:34', '2016-09-17 14:56:34', '', '2', 'http://hotspot.helloperiyar.com/2-autosave-v1/', '0', 'revision', '', '0'); + +-- TABLE: wp_wp_term_relationships +CREATE TABLE `wp_wp_term_relationships` ( + `object_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `term_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`object_id`,`term_taxonomy_id`), + KEY `term_taxonomy_id` (`term_taxonomy_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('118', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('124', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('126', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('129', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('131', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('134', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('136', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('138', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('140', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('145', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('147', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('149', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('151', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('153', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('155', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('158', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('160', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('162', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('164', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('166', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('171', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('173', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('175', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('177', '1', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('184', '3', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('208', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('209', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('210', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('211', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('212', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('213', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('214', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('215', '4', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('216', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('217', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('218', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('219', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('220', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('221', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('222', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('223', '5', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('224', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('225', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('226', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('227', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('228', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('229', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('230', '6', '0'); +INSERT INTO `wp_wp_term_relationships` (`object_id`, `term_taxonomy_id`, `term_order`) VALUES ('231', '6', '0'); + +-- TABLE: wp_wp_term_taxonomy +CREATE TABLE `wp_wp_term_taxonomy` ( + `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `taxonomy` varchar(32) NOT NULL DEFAULT '', + `description` longtext NOT NULL, + `parent` bigint(20) unsigned NOT NULL DEFAULT '0', + `count` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`term_taxonomy_id`), + UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), + KEY `taxonomy` (`taxonomy`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('1', '1', 'category', '', '0', '24'); +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('2', '2', 'post_format', '', '0', '0'); +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('3', '3', 'nav_menu', '', '0', '1'); +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('4', '4', 'nav_menu', '', '0', '8'); +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('5', '5', 'nav_menu', '', '0', '8'); +INSERT INTO `wp_wp_term_taxonomy` (`term_taxonomy_id`, `term_id`, `taxonomy`, `description`, `parent`, `count`) VALUES ('6', '6', 'nav_menu', '', '0', '8'); + +-- TABLE: wp_wp_termmeta +CREATE TABLE `wp_wp_termmeta` ( + `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `term_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`meta_id`), + KEY `term_id` (`term_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- TABLE: wp_wp_terms +CREATE TABLE `wp_wp_terms` ( + `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(200) NOT NULL DEFAULT '', + `slug` varchar(200) NOT NULL DEFAULT '', + `term_group` bigint(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`term_id`), + KEY `slug` (`slug`(191)), + KEY `name` (`name`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('1', 'Uncategorized', 'uncategorized', '0'); +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('2', 'post-format-image', 'post-format-image', '0'); +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('3', 'Primary', 'primary', '0'); +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('4', 'Footer1', 'footer1', '0'); +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('5', 'Footer2', 'footer2', '0'); +INSERT INTO `wp_wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('6', 'Footer3', 'footer3', '0'); + +-- TABLE: wp_wp_usermeta +CREATE TABLE `wp_wp_usermeta` ( + `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', + `meta_key` varchar(255) DEFAULT NULL, + `meta_value` longtext, + PRIMARY KEY (`umeta_id`), + KEY `user_id` (`user_id`), + KEY `meta_key` (`meta_key`(191)) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('14', '2', 'nickname', 'admin'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('15', '2', 'first_name', ''); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('16', '2', 'last_name', ''); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('17', '2', 'description', ''); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('18', '2', 'rich_editing', 'true'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('19', '2', 'comment_shortcuts', 'false'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('20', '2', 'admin_color', 'fresh'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('21', '2', 'use_ssl', '0'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('22', '2', 'show_admin_bar_front', 'true'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('23', '2', 'wp_wp_capabilities', 'a:1:{s:13:\"administrator\";b:1;}'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('24', '2', 'wp_wp_user_level', '10'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('25', '2', 'dismissed_wp_pointers', ''); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('26', '2', 'show_welcome_panel', '1'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('27', '2', 'default_password_nag', ''); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('29', '2', 'wp_wp_dashboard_quick_press_last_post_id', '3'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('30', '2', 'wp_wp_user-settings', 'libraryContent=browse'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('31', '2', 'wp_wp_user-settings-time', '1474120214'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('33', '2', 'session_tokens', 'a:1:{s:64:\"81b564bd5aa7986a6f64eea9067b970c4b27f16de295ba04a529b14a3cab6864\";a:4:{s:10:\"expiration\";i:1475327523;s:2:\"ip\";s:14:\"45.125.116.102\";s:2:\"ua\";s:110:\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\";s:5:\"login\";i:1474117923;}}'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('34', '2', 'managenav-menuscolumnshidden', 'a:5:{i:0;s:11:\"link-target\";i:1;s:11:\"css-classes\";i:2;s:3:\"xfn\";i:3;s:11:\"description\";i:4;s:15:\"title-attribute\";}'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('35', '2', 'metaboxhidden_nav-menus', 'a:2:{i:0;s:12:\"add-post_tag\";i:1;s:15:\"add-post_format\";}'); +INSERT INTO `wp_wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES ('36', '2', 'nav_menu_recently_edited', '3'); + +-- TABLE: wp_wp_users +CREATE TABLE `wp_wp_users` ( + `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `user_login` varchar(60) NOT NULL DEFAULT '', + `user_pass` varchar(255) NOT NULL DEFAULT '', + `user_nicename` varchar(50) NOT NULL DEFAULT '', + `user_email` varchar(100) NOT NULL DEFAULT '', + `user_url` varchar(100) NOT NULL DEFAULT '', + `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `user_activation_key` varchar(255) NOT NULL DEFAULT '', + `user_status` int(11) NOT NULL DEFAULT '0', + `display_name` varchar(250) NOT NULL DEFAULT '', + PRIMARY KEY (`ID`), + KEY `user_login_key` (`user_login`), + KEY `user_nicename` (`user_nicename`), + KEY `user_email` (`user_email`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +INSERT INTO `wp_wp_users` (`ID`, `user_login`, `user_pass`, `user_nicename`, `user_email`, `user_url`, `user_registered`, `user_activation_key`, `user_status`, `display_name`) VALUES ('2', 'WcmtLpS8mz', '$P$B/reNUT8sZsM1q3JI4/pCLHmCCB6Pz.', 'admin', 'sibyperiyar@gmail.com', '', '2016-09-17 05:25:24', '', '0', 'admin'); + diff --git a/dbconfig.php b/dbconfig.php new file mode 100644 index 0000000..d65b9cc --- /dev/null +++ b/dbconfig.php @@ -0,0 +1,24 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $dbname = "`".str_replace("`","``",$DB_name)."`"; + $DB_con->query("CREATE DATABASE IF NOT EXISTS $dbname"); + $DB_con->query("use $dbname"); + } + catch(PDOException $e) { + echo "Error Creating/Locating Database $dbname: " . $e->getMessage(); + } + + /* Old Version, NOT creating DB if NOT Exist + $DB_con = new PDO("mysql:host={$DB_host};dbname={$DB_name}",$DB_user,$DB_pass); + $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + */ +?> \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..131deef0fa17a21091d99355b17c2962c764da7e GIT binary patch literal 1150 zcmbVMTSydP6#f?jA4IeseAuTRd#TX0O$#DIDu@E@AvFu{m$HP|Ac*i*cv&+q1zINI zWnFiLyyD^o6f|WGB`rkPg(VkhRdQWhWOrx2&iv!z^iV&B|}Ll9ZI1+8PCkAXqhg;*6upT7ntG^S;=s|j`13Y%LZAM?0L~&T#g|Qnrd0+ zH`glQ*}=ABfg=RL51)Sze!=&TnAv9tHUYM5K9~x?a>ej z;rQH(w%ZK)bcQd3#rqrwx&smfQK|;2$MX4e#Lygy2aScNjNITQ-l0yk6N` z5dn^>(QM8k^`mvBjMq=TO@cm6=9ulsS8(u4`AoeGJj?r;5}c-9MpiIP+4^{Xs4Na@bUz4#A&bFuFBER4RS8vGA8>fQ zZd8tBB2OQ~^DCpZ&}YaR=8f8Y4BeG9a*vFdmZ^tjfs*k6R{mRpoh=Jv7qCZ?JaG0|`ZqZJzT zJyxSLONF*n6*_1R-S^N6s(e&*H{s;bd{{`YbGU)&S literal 0 HcmV?d00001 diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44 GIT binary patch literal 85908 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 uQr82 literal 0 HcmV?d00001 diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..84677bc0c5f37f1fac9d87548c4554b5c91717cf GIT binary patch literal 56006 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�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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96a3639cdde5e8ab459c6380e3b9524ee81641dc GIT binary patch literal 112160 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 zÄ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 V*eEM;|ho{trTA6=?tf literal 0 HcmV?d00001 diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..628b6a52a87e62c6f22426e17c01f6a303aa194e GIT binary patch literal 65452 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 q%u^)w#YX9ZIvhtu?9Cy6YRi6f6G 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 literal 0 HcmV?d00001 diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed GIT binary patch literal 20335 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

!oRptb@n+ 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 literal 0 HcmV?d00001 diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..25691af --- /dev/null +++ b/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..67fa00bf83801d2fa568546b982c80d27f6ef74e GIT binary patch literal 41280 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

PBK;&Wcg|NX{>QR@W3{K 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 literal 0 HcmV?d00001 diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..8c54182aa5d4d1ab3c9171976b615c1dcb1dc187 GIT binary patch literal 23320 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 mX4Rts + + + + + + + + Easy HotSpot - A Simple Hotspot user management utility by Team Zetozone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hotsoft.php b/hotsoft.php new file mode 100644 index 0000000..fa517b3 --- /dev/null +++ b/hotsoft.php @@ -0,0 +1,133 @@ +setMenu('/ip hotspot user'); + $iv = count($util); + + if ((intval($limit_bytes) != 0) and (!empty($limit_uptime))) { + $limit_bytes_total = (intval($limit_bytes) * 1024 * 1024 * 1024 ); + $util->add( + array( + 'name' => "$username", + 'password' => "$password", + 'limit-uptime' => "$limit_uptime", + 'limit-bytes-total' => "$limit_bytes_total", + 'profile' => "$profile" + ) + ); + } + elseif (intval($limit_bytes) != 0) { + $limit_bytes_total = (intval($limit_bytes) * 1024 * 1024 * 1024 ); + $util->add( + array( + 'name' => "$username", + 'password' => "$password", + 'limit-bytes-total' => "$limit_bytes_total", + 'profile' => "$profile" + ) + ); + } + else + { + $util->add( + array( + 'name' => "$username", + 'password' => "$password", + 'limit-uptime' => "$limit_uptime", + 'profile' => "$profile" + ) + ); + $limit_bytes = 0; // For Adding it to Local database + } + + if ($iv != count($util)) { + include('dbconfig.php'); + $stmt = $DB_con->prepare("SELECT booking_id from hotspot_vouchers ORDER BY booking_id DESC LIMIT 1"); + $stmt->execute(array()); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $booking_id = $row['booking_id']; + $booking_id++; + $uid = $booking_id.'-1-'.date('dmY'); + $creator = 999; + $created_by = 'Hotsoft'; + $stmt = $DB_con->prepare("UPDATE hotspot_vouchers set status=:status WHERE 1"); + $stmt->execute(array(':status' => 'Over')); + $stmt = $DB_con->prepare("insert into hotspot_vouchers (created_on, created_by, creator, user_name, password, printed_times, + printed_last, status, group_of, booking_id, limit_uptime, limit_bytes, profile, uid) + values(NOW(), :created_by, :creator, :user_name, :password, :printed_times, :printed_last, :status, :group_of, + :booking_id, :limit_uptime, :limit_bytes, :profile, :uid)"); + $stmt->execute(array(':created_by' => $created_by, ':creator' => $creator, ':user_name' => $username, ':password' => $password, + ':printed_times' => 0, ':printed_last' => '', ':status' => 'Active', ':group_of' => 1, + ':booking_id' => $booking_id, ':limit_uptime' => $limit_uptime, ':limit_bytes' => $limit_bytes, + ':profile' => $profile, ':uid' => $uid)); + echo 0; //Success + } + else + { + echo 3; // Duplicate/Existing username + } + } +else + { + echo 2; //Blank Username + } + //End Adding a Guest User +} +elseif (strtolower($action) == 'checkout')) { + //Removal + $username=trim($_GET['username']); + if (!empty($username)) { + $printRequest = new RouterOS\Request('/ip/hotspot/user/print'); + $printRequest->setArgument('.proplist', '.id,name'); + $printRequest->setQuery(RouterOS\Query::where('name', $username)); + $id = $client->sendSync($printRequest)->getProperty('.id'); + + $removeRequest = new RouterOS\Request('/ip/hotspot/user/remove'); + $removeRequest->setArgument('numbers', $id); + $client->sendSync($removeRequest); + echo 0; //Success + } + else + { + echo 2; //Blank Username + } +} +else +{ + echo 1; //Wrong Action Verb +} +?> \ No newline at end of file diff --git a/images/bg.jpg b/images/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1afe89326f6fd3c22e10f5467469040772897878 GIT binary patch literal 1461 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 literal 0 HcmV?d00001 diff --git a/images/information.png b/images/information.png new file mode 100644 index 0000000000000000000000000000000000000000..d21a97001e252390cfd612edc7324bc5546a6b34 GIT binary patch literal 2392 zcmV-e38(gnP)vyk)$g)BqXb(v;VQF^dNmgWo6~8`Sa&LvUKUv<-!*%Snvp+HHmk{HR{*j z^sCL^(9qDhX3d%>wr}75^CL%&>~Cpl`4jDp{j}F#e|`U(Z@&4)i4!N@;=2PocIJ`p>(;H!4?XnIlIrT}I$hUI$8liWwj!eIy6`*?s;YW? z2U<2Bk9QwEdi4FBJ9i$ubm>wHfb=&dpiZ7VdCKzT%OBskapQ)%y1H5dYIF$DY~I39 zGK(CeAmGy!1pOLx6_Si$7$_?%bBBh8diU<#yXW0^-+kxm)vK2QxEN>p7lDUDp^48w z|NJ@leISK&I*nW|XFm4WV^473#{mRyMZhlvw}Hkh70c!FINv^i zpS=13&h|Q}3P%tK_(5gE17H;jVq@u!ZOLaU-}!wyLgi&>O`7=CU#{X>ZwjeY8k(ln ziM{W->#q6oc8n*$s}>b%=b6{?{LtB-z$CHn?fpp$QDsLl`caXCj6eJN3 zs?U#4t|w7M z_)1|Bo#5P<1Sow1@tFfd<41;q>QW7p!a52B7UVJoNrKhzAiqTbhtCY5e>8`DK98!Z zsu;1F1m;)`L}t&PJ&$+T6vF%9^mTNM02xP@=h&rv!!!dxrT9=zFj%`HQ3l}bY%1U(eIwBG>@bKMXXm$pQQ;?ezQyzus*AVcjvI@3i3lj1O zY$8kWvBvkBlf@4gOhRLInasYwzrW|=#fzr|=2!wQ@8mzl7{wXDHGI0)JUfc-PBvj> z60q`FHYi(OB}xR1l|D37>QG%_6ylSha`63gzd#j{KAhGF^`klaW2bP+dGVH;CsJlp$e;-s$ zLutT3RVVez4rEY@5YTAE_;hh-DEza?c29+&pr3tvqbEHZ(&N&HF~JFwsz{O zRjXFN^wLYO9zJ}y<;6=S~GcnV{p zP4~tUP>XDhA`!m?W-O93itl~JsE^6arQ2iNp<6}IkBfydYw%ycfCK(S*V_I70000< KMNUMnLSTZ8Yl=t! literal 0 HcmV?d00001 diff --git a/images/loading.gif b/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..2edde5e5dfe2b41723fd3aa57a25bbbbfcf3a982 GIT binary patch literal 3405 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 literal 0 HcmV?d00001 diff --git a/images/progress.gif b/images/progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..2edde5e5dfe2b41723fd3aa57a25bbbbfcf3a982 GIT binary patch literal 3405 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 +

+
+
+
+ +
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/info.php b/info.php new file mode 100644 index 0000000..39feaec --- /dev/null +++ b/info.php @@ -0,0 +1,91 @@ +

PHP Info of this Machine



'; +echo phpinfo(); +/* +* Md. Nazmul Basher + + +ob_start(); // Turn on output buffering +system(‘ipconfig /all’); //Execute external program to display output +$mycom=ob_get_contents(); // Capture the output into a variable +ob_clean(); // Clean (erase) the output buffer + +$findme = “Physical”; +$pmac = strpos($mycom, $findme); // Find the position of Physical text +$mac=substr($mycom,($pmac+36),17); // Get Physical Address + + + +echo "MAC ID: "; +echo $pmac; +echo $mac; + +function getMacLinux() { + exec('netstat -ie', $result); + if(is_array($result)) { + $iface = array(); + foreach($result as $key => $line) { + if($key > 0) { + $tmp = str_replace(" ", "", substr($line, 0, 10)); + if($tmp <> "") { + $macpos = strpos($line, "HWaddr"); + if($macpos !== false) { + $iface[] = array('iface' => $tmp, 'mac' => strtolower(substr($line, $macpos+7, 17))); + } + } + } + } + return $iface[0]['mac']; + } else { + return "notfound"; + } +} + +echo 'Linux Mac ID : '.getMaclinux(); + + +$ip=$_SERVER['SERVER_ADDR']; +echo "Server IP: {$ip}
+Server Mac: "; +$conf=exec('netstat -ie'); +$prots=explode("\n\n",$conf); +if($ip=='127.0.0.1')$ip='192.168.'; +foreach($prots as $prot){ + if(strpos($prot,' addr:'.$ip) && preg_match('/(?:\s+)HWaddr(?:\s+)(?P[a-f0-9\:]+)/',$prot,$match)){ + echo $match['mac']; + } +} + + +$ipAddress=$_SERVER['REMOTE_ADDR']; +$macAddr=false; + +#run the external command, break output into lines +$arp=`arp -a $ipAddress`; +$lines=explode("\n", $arp); + +#look for the output line describing our IP address +foreach($lines as $line) +{ + $cols=preg_split('/\s+/', trim($line)); + if ($cols[0]==$ipAddress) + { + $macAddr=$cols[1]; + } +} +echo $lines[1]; +echo $cols[1]; +echo $macAddr; +*/ +//=========================================== +ob_start(); +$cmd = system("getmac"); +ob_end_clean(); +echo 'Your MAC ID : '. substr($cmd,0,17); +/* +echo '


'; +echo '
New Get Mac: '.substr($cmd,0,17).'
'; +echo 'Location: '.strstr($cmd, '{'); +$cmd = system("nbtstat -a ip.of.remote.machine"); +echo '
Another ID New Get Mac: '.$cmd; */ +?> \ No newline at end of file diff --git a/js/bootstrap.min.js b/js/bootstrap.min.js new file mode 100644 index 0000000..d839865 --- /dev/null +++ b/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('