Repository: mckinziebrandon/DeepChatModels Branch: master Commit: 4fef8a6ce00d Files: 144 Total size: 1.7 MB Directory structure: gitextract_wj3qb2ee/ ├── .gitattributes ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── chatbot/ │ ├── __init__.py │ ├── _models.py │ ├── components/ │ │ ├── __init__.py │ │ ├── base/ │ │ │ ├── __init__.py │ │ │ └── _rnn.py │ │ ├── bot_ops.py │ │ ├── decoders.py │ │ ├── embedder.py │ │ ├── encoders.py │ │ └── input_pipeline.py │ ├── dynamic_models.py │ ├── globals.py │ └── legacy/ │ ├── __init__.py │ ├── _decode.py │ ├── _train.py │ └── legacy_models.py ├── configs/ │ ├── example_attention.yml │ ├── example_cornell.yml │ ├── example_reddit.yml │ ├── example_ubuntu.yml │ ├── ubuntu_basic.yml │ └── website_config.yml ├── data/ │ ├── __init__.py │ ├── _dataset.py │ ├── data_helper.py │ ├── dataset_wrappers.py │ ├── reddit_preprocessor.py │ └── regex.py ├── main.py ├── notebooks/ │ ├── Analysis.ipynb │ ├── DataVizUtils.ipynb │ ├── README.md │ ├── RedditPipelineAndVisualization.ipynb │ ├── TensorFlow Notes.ipynb │ ├── __init__.py │ └── ubuntu_reformat.ipynb ├── requirements.txt ├── setup.py ├── tests/ │ ├── __init__.py │ ├── test_config.py │ ├── test_config.yml │ ├── test_data/ │ │ ├── train_from.txt │ │ ├── train_from.txt.ids121 │ │ ├── train_to.txt │ │ ├── train_to.txt.ids121 │ │ ├── trainvoc121_seq15.tfrecords │ │ ├── trainvoc121_seq20.tfrecords │ │ ├── valid_from.txt │ │ ├── valid_from.txt.ids121 │ │ ├── valid_to.txt │ │ ├── valid_to.txt.ids121 │ │ ├── validvoc121_seq15.tfrecords │ │ ├── validvoc121_seq20.tfrecords │ │ └── vocab121.txt │ ├── test_data.py │ ├── test_dynamic_models.py │ ├── test_legacy_models.py │ └── utils.py ├── utils/ │ ├── __init__.py │ ├── bot_freezer.py │ └── io_utils.py └── webpage/ ├── __init__.py ├── app.yaml ├── config.py ├── deepchat/ │ ├── __init__.py │ ├── main/ │ │ ├── __init__.py │ │ ├── errors.py │ │ ├── forms.py │ │ └── views.py │ ├── models.py │ ├── static/ │ │ ├── assets/ │ │ │ ├── plots/ │ │ │ │ ├── accuracy.json │ │ │ │ ├── configs.json │ │ │ │ ├── training.json │ │ │ │ └── validation.json │ │ │ └── test_data/ │ │ │ ├── train_from.txt │ │ │ ├── train_to.txt │ │ │ ├── valid_from.txt │ │ │ ├── valid_to.txt │ │ │ └── vocab121.txt │ │ ├── css/ │ │ │ ├── style_modifications.css │ │ │ └── theme.css │ │ ├── js/ │ │ │ ├── bootstrapify.js │ │ │ ├── chat_processing.js │ │ │ ├── jqBootstrapValidation.js │ │ │ └── user_form.js │ │ └── vendor/ │ │ ├── bootstrap-3.3.7-dist/ │ │ │ ├── css/ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ └── bootstrap.css │ │ │ └── js/ │ │ │ ├── bootstrap.js │ │ │ └── npm.js │ │ ├── font-awesome/ │ │ │ ├── css/ │ │ │ │ └── font-awesome.css │ │ │ ├── fonts/ │ │ │ │ └── FontAwesome.otf │ │ │ ├── less/ │ │ │ │ ├── animated.less │ │ │ │ ├── bordered-pulled.less │ │ │ │ ├── core.less │ │ │ │ ├── fixed-width.less │ │ │ │ ├── font-awesome.less │ │ │ │ ├── icons.less │ │ │ │ ├── larger.less │ │ │ │ ├── list.less │ │ │ │ ├── mixins.less │ │ │ │ ├── path.less │ │ │ │ ├── rotated-flipped.less │ │ │ │ ├── screen-reader.less │ │ │ │ ├── stacked.less │ │ │ │ └── variables.less │ │ │ └── scss/ │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ │ └── jquery/ │ │ └── jquery.easing.1.3.js │ ├── templates/ │ │ ├── 404.html │ │ ├── about.html │ │ ├── admin/ │ │ │ └── index.html │ │ ├── base.html │ │ ├── index.html │ │ ├── macros/ │ │ │ └── forms.html │ │ └── plots.html │ └── web_bot.py ├── manage.py ├── migrations/ │ ├── README │ ├── alembic.ini │ ├── env.py │ ├── script.py.mako │ └── versions/ │ └── 236b966ecd2f_.py ├── requirements.txt ├── runtime.txt └── tests/ ├── __init__.py ├── test_database.py └── test_simple.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ notebooks/* linguist-vendored *.pb filter=lfs diff=lfs merge=lfs -text **/*.pb filter=lfs diff=lfs merge=lfs -text ================================================ FILE: .gitignore ================================================ **/images/hidden/* # Note: Any leading '**' need to be followed by a '/'. # Seems like '**/thing_to_ignore_always[/*]' covers all bases. **/.*.swp **/.log **/tmp* **/.idea/* **/.ipynb_checkpoints/* **/__pycache__/* **/*.pyc **/*.h5/* **/out/** .cache/** **/.cache/** **/pretrained/** **/notebooks/*.txt .DS* **/.DS* # Muh training scripts. overnight.sh experimental.sh tests/macros/** compact.sh # Ignore collection of useful tf files that once # existed in tf repo but have since been removed. # They will be missed. **/reference/* **/saved_train_data/** /webpage/data_dev.db /notebooks/reference/ /notebooks/.ipynb_checkpoints/ # TEMP: **/frozen_models/* **/ubuntu/* **/data_dev.db **/data_test.db /webpage/deepchat/static/assets/frozen_models/ /configs/test_lstm.yml /configs/cornell.yml /ae.py **/individual_tb_plots/* ================================================ FILE: .travis.yml ================================================ language: python dist: trusty sudo: True python: - "3.5" - "pypy3" before_install: - sudo apt-get update - sudo apt-get install python-matplotlib python3-matplotlib python-tk python3-tk libtcmalloc-minimal4 install: # code below is taken from http://conda.pydata.org/docs/travis.html # We do this conditionally because it saves us some downloading if the # version is the same. - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh; else wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; fi - bash miniconda.sh -b -p $HOME/miniconda - export PATH="$HOME/miniconda/bin:$PATH" - hash -r - conda config --set always_yes yes --set changeps1 no - conda update -q conda # Useful for debugging any issues with conda - conda info -a - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION numpy scipy matplotlib pandas pytest h5py - source activate test-environment # - pip3 install six numpy wheel # - pip3 install -U virtualenv - pip install -r requirements.txt # - pip install -U tensorflow - conda install Pillow - pip install tensorflow script: - pytest ================================================ FILE: LICENSE.md ================================================ MIT License Copyright (c) 2017 Brandon McKinzie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Conversation Models in Tensorflow Notes to visitors: * I've just shut down the website indefinitely. I ran out of my credits on Google Cloud four days ago, and have since been billed 30+ dollars which isn't something I can sustain. To run locally, assuming you satisfy all requirements in webpage/requirements.txt, just run `python3 manage.py runserver`. If you're unfamiliar with running flask this way, see the docs for [Flask-Script](https://flask-script.readthedocs.io/en/latest/). Sorry for any inconvenience! * Please post any feedbacks/bugs as an issue and I will respond within 24 hours. * I haven't gotten around to providing scripts for downloading the datasets. Until then, I've uploaded most of the data [here on my MEGA account](https://mega.nz/#F!xrRTwSzY!by9K42n_I_oi5T_DKP-xTA). It is organized the same way I have it locally. * Don't let the simple web bots fool you -- this project supports more advanced techniques than the single-layer encoder-decoder models on the website. To see the parameters that are immediately available/supported for tweaking, checkout chatbot/globals.py, which contains the default configuration dictionary. Any value that you don't specify will assume the default value from that file, which tend toward safe conversative simple values. * Contributions are more than welcome. I do my best to follow PEP8 and I'd prefer contributions do the same. * Please note that the bulk of this project was written with tensorflow version 1.0 (before tf.contrib.seq2seq existed) and 1.1, but updates have been made since version 1.2 that appeared to break the project. I have not been able to do tests regarding how version 1.4 is faring with the project, but I intend to do so soon. ## Table of Contents * [Project Overview](#brief-overview-of-completed-work) * [Datasets](#datasets) * [Models](#models) * [Website](#website) * [Model Components](#model-components) * [Input Pipeline](#the-input-pipeline) * [Reference Material](#reference-material) ## Project Overview As of May 9, 2017, the main packages of the project are as follows: * __chatbot__: The conversation model classes, the structural components of the models (encoders, decoders, cells, etc.), and various operations for easy saving/loading/evaluation. * __data__: The core Dataset class that handles all data formatting, file paths, and utilities for interacting with the data, as well as some preprocessing scripts and helper classes for cleaning data. The data itself (for space reasons) is not included in the repository. See the link to my MEGA account to download the data in the same format as on my local machine. * __notebooks__: Jupyter notebooks showcasing data visualization examples, data preprocessing techniques, and conversation model exploration. * __webpage__: Flask web application hosted on Google App Engine, where you can talk with a handful of chatbots and interact with plots. You can run it locally, after installing its requirements (mostly Flask packages), by running the following command within the webpage directory: `python3 manage.py runserver` From a user/developer standpoint, this project offers a cleaner interface for tinkering with sequence-to-sequence models. The ideal result is a chatbot API with the readability of [Keras](https://keras.io/), but with a degree of flexibility closer to [TensorFlow](https://www.tensorflow.org/). On the 'client' side, playing with model parameters and running them is as easy as making a configuration (yaml) file, opening a python interpreter, and issuing a handful of commands. The following snippet, for example, is all that is needed to start training on the cornell dataset (after downloading it of course) with your configuration: ```python import data import chatbot from utils import io_utils # Load config dictionary with the flexible parse_config() function, # which can handle various inputs for building your config dictionary. config = io_utils.parse_config(config_path='path_to/my_config.yml') dataset = getattr(data, config['dataset'])(config['dataset_params']) bot = getattr(chatbot, config['model'])(dataset, config) bot.train() ``` This is just one way to interface with the project. For example, the user can also pass in parameters via command-line args, which will be merged with any config files they specify as well (precedence given to command-line args if conflict). You can also pass in the location of a previously saved chatbot to resume training it or start a conversation. See `main.py` for more details. ### Datasets * [Ubuntu Dialogue Corpus](https://arxiv.org/pdf/1506.08909.pdf): pre-processing approach can be seen in the ubuntu\_reformat.ipynb in the notebooks folder. The intended use for the dataset is response ranking for multi-turn dialogues, but I've taken the rather simple approach of extracting utterance-pairs and interpreting them as single-sentence to single-response, which correspond with inputs for the encoder and decoder, respectively, in the models. * [Cornell Movie-Dialogs](https://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html): I began with [this preprocessed](https://github.com/suriyadeepan/datasets/tree/master/seq2seq/cornell_movie_corpus) version of the Cornell corpus, and made minor modifications to reduce noise. * [Reddit comments](https://www.reddit.com/r/datasets/comments/3bxlg7/i_have_every_publicly_available_reddit_comment/): Approx. 1.7 billion reddit comments. Currently working on preprocessing and reducing this massive dataset to suitable format for training conversation models. Will post processed dataset download links when complete! ### Models * DynamicBot: uses a more object-oriented approach offered by custom classes in model_components.py. The result is faster online batch-concatenated embedding and a more natural approach to chatting. It makes use of the (fantastic) new python API in the TensorFlow 1.0 release, notably the dynamic_rnn. It also adheres to good variable scoping practice and common tensorflow conventions I've observed in the documentation and source code, which has nice side effects such as clean graph visualizations in TensorBoard. * SimpleBot: Simplified bucketed model based on the more complicated 'ChatBot' model below. Although it is less flexible in customizing bucket partitions and uses a sparse softmax over the full vocabulary instead of sampling, it is far more transparent in its implementation. It makes minimal use of tf.contrib, as opposed to ChatBot, and more or less is implemented from "scratch," in the sense of primarily relying on the basic tensorflow methods. If you're new to TensorFlow, it may be useful to read through its implementation to get a feel for common conventions in tensorflow programming, as it was the result of me reading the source code of all methods in ChatBot and writing my own more compact interpretation. * ChatBot: Extended version of the model described in [this TensorFlow tutorial](https://www.tensorflow.org/tutorials/seq2seq). Architecture characteristics: bucketed inputs, decoder uses an attention mechanism (see page 69 of my [notes](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf), and inputs are embedded with the simple functions provided in the tf.contrib library. Also employs a sampled softmax loss function to allow for larger vocabulary sizes (page 67 of [notes](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf)). Additional comments: due to the nature of bucketed models, it takes much longer to create the model compared to others. The main bottleneck appears to be the size of the largest bucket and how the gradient ops are created based on the bucket sizes. ### Website The webpage directory showcases a simple and space-efficient way for deploying your TensorFlow models in a Flask application. The models are 'frozen' -- all components not needed for chatting (e.g. optimizers) are removed and all remaining variables are converted to constants. When the user clicks on a model name, a REST API for that model is created. When the user enters a sentence into the form, an (AJAX) POST request is issued, where the response is the chatbot's response sentence. For more details on the REST API, see [views.py](https://github.com/mckinziebrandon/DeepChatModels/blob/master/webpage/deepchat/main/views.py). The Flask application follows best practices, such as using blueprints for instantiating applications, different databases depending on the application environment (e.g. development or production), and more. ## Model Components Here I'll go into more detail on how the models are constructed and how they can be visualized. This section is a work in progress and not yet complete. ### The Input Pipeline Instead of using the ```feed_dict``` argument to input data batches to the model, it is *substantially* faster encode the input information and preprocessing techniques in the graph structure itself. This means we don't feed the model anything at training time. Rather the model uses a sequence of queues to access the data from files in google's protobuf format, decode the files into tensor sequences, dynamically batch and pad the sequences, and then feed these batches to the embedding decoder. All within the graph structure. Furthermore, this data processing is coordinated by multiple threads in parallel. We can use tensorboard (and best practices for variable scoping) to visualize this type of pipeline at a high level. input_pipeline input_pipeline_expanded

_(More descriptions coming soon!)_ ## Reference Material A lot of research has gone into these models, and I've been documenting my notes on the most "important" papers here in the last section of [my deep learning notes here](http://mckinziebrandon.me/assets/pdf/CondensedSummaries.pdf). The notes also include how I've tried translating the material from the papers into TensorFlow code. I'll be updating that as the ideas from more papers make their way into this project. * Papers: * [Sequence to Sequence Learning with Neural Networks. Sutskever et al., 2014.](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf) * [On Using Very Large Target Vocabulary for Neural Machine Translation. Jean et al., 2014.](https://arxiv.org/pdf/1412.2007.pdf) * [Neural Machine Translation by Jointly Learning to Align and Translate. Bahdanau et al., 2016](https://arxiv.org/pdf/1409.0473.pdf) * [Effective Approaches to Attention-based Neural Machine Translation. Luong et al., 2015](https://arxiv.org/pdf/1508.04025.pdf) * Online Resources: * [Metaflow blog](https://blog.metaflow.fr/): Incredibly helpful tensorflow (r1.0) tutorials. * [Flask Mega-Tutorial](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world): For the webpage parts of the project. * [Code for "Massive Exploration of Neural Machine Translation Architectures"](https://github.com/google/seq2seq): Main inspiration for switching to yaml configs and pydoc.locate. Paper is great as well. * [Tensorflow r1.0 API](https://www.tensorflow.org/api_docs/): (Of course). The new python API guides are great. ================================================ FILE: chatbot/__init__.py ================================================ from chatbot import globals from chatbot.components.base._rnn import * from chatbot.components.bot_ops import dynamic_sampled_softmax_loss from chatbot.components.decoders import * from chatbot.components.embedder import * from chatbot.components.encoders import * from chatbot.dynamic_models import DynamicBot from chatbot.legacy.legacy_models import ChatBot, SimpleBot __all__ = ['Chatbot, SimpleBot', 'DynamicBot'] ================================================ FILE: chatbot/_models.py ================================================ """Abstract classes.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import copy import yaml import random import subprocess import numpy as np import tensorflow as tf from tensorflow.contrib.tensorboard.plugins import projector from tensorflow.python.client import device_lib from utils import io_utils from chatbot.components import * from chatbot.globals import DEFAULT_FULL_CONFIG, OPTIMIZERS def gpu_found(): """Returns True if tensorflow finds at least 1 GPU.""" devices = device_lib.list_local_devices() return len([x.name for x in devices if x.device_type == 'GPU']) > 0 class Model(object): """Superclass of all subsequent model classes. """ def __init__(self, logger, dataset, params): """ Args: logger: returned by getLogger & called by subclasses. Passed here so we know what object to use for info/warn/error. dataset: object that inherits from data.Dataset. params: (dict) user-specified params that override those in DEFAULT_FULL_CONFIG above. """ self.log = logger self.__dict__['__params'] = Model.fill_params(dataset, params) # Make particularly useful ckpt directories for website configurations. if 'website_config' in self.ckpt_dir: self.ckpt_dir = Model._build_hparam_path( ckpt_dir=self.ckpt_dir, num_layers=self.num_layers, max_seq_len=self.max_seq_len) self.log.info("New ckpt dir:", self.ckpt_dir) # Configure gpu options if we are using one. if gpu_found(): self.log.info("GPU Found. Setting allow_growth to True.") gpu_config = tf.ConfigProto() gpu_config.gpu_options.allow_growth = True self.sess = tf.Session(config=gpu_config) else: self.log.warning("GPU not found. Not recommended for training.") self.sess = tf.Session() with self.graph.name_scope(tf.GraphKeys.SUMMARIES): self.global_step = tf.Variable(initial_value=0, trainable=False) self.learning_rate = tf.constant(self.learning_rate) # Create ckpt_dir if user hasn't already (if exists, has no effect). subprocess.call(['mkdir', '-p', self.ckpt_dir]) self.projector_config = projector.ProjectorConfig() # Good practice to set as None in constructor. self.loss = None self.file_writer = None self.merged = None self.train_op = None self.saver = None def compile(self): """ Configure training process and initialize model. Inspired by Keras. Either restore model parameters or create fresh ones. - Checks if we can both (1) find a checkpoint state, and (2) a valid V1/V2 checkpoint path. - If we can't, then just re-initialize model with fresh params. """ self.log.info("Checking for checkpoints . . .") checkpoint_state = tf.train.get_checkpoint_state(self.ckpt_dir) if not self.reset_model and checkpoint_state \ and tf.train.checkpoint_exists(checkpoint_state.model_checkpoint_path): print("Reading model parameters from", checkpoint_state.model_checkpoint_path) self.file_writer = tf.summary.FileWriter(self.ckpt_dir) self.saver = tf.train.Saver(tf.global_variables()) self.saver.restore(self.sess, checkpoint_state.model_checkpoint_path) else: print("Created model with fresh parameters:\n\t", self.ckpt_dir) # Recursively delete all files in output but keep directories. subprocess.call([ 'find', self.ckpt_dir, '-type', 'f', '-exec', 'rm', '{}', ';' ]) self.file_writer = tf.summary.FileWriter(self.ckpt_dir) # Add operation for calling all variable initializers. init_op = tf.global_variables_initializer() # Construct saver (adds save/restore ops to all). self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=3) # Add the fully-constructed graph to the event file. self.file_writer.add_graph(self.sess.graph) # Initialize all model variables. self.sess.run(init_op) # Store model config in ckpt dir for easy loading later. with open(os.path.join(self.ckpt_dir, 'config.yml'), 'w') as f: yaml.dump(getattr(self, "params"), f, default_flow_style=False) def save(self, summaries=None): """ Args: summaries: merged summary instance returned by session.run. """ if self.saver is None: raise ValueError("Tried saving model before defining a saver.") ckpt_fname = os.path.join(self.ckpt_dir, "{}.ckpt".format(self.data_name)) # Saves the state of all global variables in a ckpt file. self.saver.save(self.sess, ckpt_fname, global_step=self.global_step) if summaries is not None: self.file_writer.add_summary(summaries, self.global_step.eval(self.sess)) else: self.log.info("Save called without summaries.") def close(self, save_current=True): """Call then when training session is terminated. - Saves the current model/checkpoint state. - Freezes the model into a protobuf file in self.ckpt_dir. - Closes context managers for file_writing and session. """ # First save the checkpoint as usual. if save_current: self.save() # Freeze me, for I am infinite. self.freeze() # Be a responsible bot and close my file writer. self.file_writer.close() # Formally exit the session, farewell to all. self.sess.close() @property def graph(self): return self.sess.graph @staticmethod def fill_params(dataset, params): """For now, essentially just returns (already parsed) params, but placed here in case I want to customize later (likely). """ # Replace (string) specification of dataset with the actual instance. params['dataset'] = dataset params['dataset_params']['data_name'] = dataset.name if params['model_params']['ckpt_dir'] == 'out': params['model_params']['ckpt_dir'] += '/'+dataset.name # Define alias in case older models still use it. params['model_params']['is_chatting'] = params['model_params']['decode'] return params def freeze(self): """Useful for e.g. deploying model on website. Args: directory containing model ckpt files we'd like to freeze. """ if not tf.get_collection('freezer'): self.log.warning('No freezer found. Not saving a frozen model.') return # Note: output_node_names is only used to tell tensorflow what is can # throw away in the frozen graph (e.g. training ops). output_node_names = ",".join( [t.name.rstrip(':0') for t in tf.get_collection('freezer')]) self.log.info('Output node names: %r', output_node_names) # Save a graph with only the bare necessities for chat sessions. output_graph_def = tf.graph_util.convert_variables_to_constants( self.sess, self.graph.as_graph_def(), output_node_names.split(',')) output_fname = os.path.join(self.ckpt_dir, "frozen_model.pb") with tf.gfile.GFile(output_fname, 'wb') as f: f.write(output_graph_def.SerializeToString()) print("%d ops in the final graph." % len(output_graph_def.node)) subprocess.call(['cp', self.dataset.paths['vocab'], self.ckpt_dir]) def __getattr__(self, name): if name == 'params': camel_case = self.data_name.title().replace('_', '') replace_dict = {'dataset': "data."+camel_case} return {**self.__dict__['__params'], **replace_dict} elif name in DEFAULT_FULL_CONFIG: # Requesting a top-level key. return self.__dict__['__params'][name] else: for k in DEFAULT_FULL_CONFIG.keys(): if not isinstance(self.__dict__['__params'][k], dict): continue if name in self.__dict__['__params'][k]: return self.__dict__['__params'][k][name] raise AttributeError(name) @staticmethod def _build_hparam_path(ckpt_dir, **kwargs): """Returns relative path build from args for descriptive checkpointing. The new path becomes ckpt_dir appended with directories named by kwargs: - If a given kwargs[key] is a string, that is set as the appended dir name. - Otherwise, it gets formatted, e.g. for key='learning_rate' it may become 'learning_rate_0_001' Returns: ckpt_dir followed by sequentially appended directories, named by kwargs. """ kwargs = copy.deepcopy(kwargs) new_ckpt_dir = ckpt_dir for key in sorted(kwargs): if not isinstance(kwargs[key], str): dir_name = key + "_" + str(kwargs[key]).replace('.', '_') else: dir_name = kwargs[key] new_ckpt_dir = os.path.join(new_ckpt_dir, dir_name) return new_ckpt_dir class BucketModel(Model): """Abstract class. Any classes that extend BucketModel just need to customize their graph structure in __init__ and implement the step(...) function. The real motivation for making this was to be able to use the true Model abstract class for all classes in this directory, bucketed or not, r1.0 or r0.12. """ def __init__(self, logger, buckets, dataset, params): self.buckets = buckets super(BucketModel, self).__init__( logger=logger, dataset=dataset, params=params) def compile(self): """ Configure training process. Name was inspired by Keras. <3 """ if self.losses is None: raise ValueError("Tried compiling model before defining losses.") print("Configuring training operations. This may take some time . . . ") # Note: variables are trainable=True by default. params = tf.trainable_variables() # train_op will store the parameter (S)GD train_op. self.apply_gradients = [] optimizer = OPTIMIZERS[self.optimizer](self.learning_rate) for b in range(len(self.buckets)): gradients = tf.gradients(self.losses[b], params) # Gradient clipping is actually extremely simple, it basically just # checks if L2Norm(gradients) > max_gradient, and if it is, # it returns (gradients / L2Norm(gradients)) * max_grad. clipped_gradients, _ = tf.clip_by_global_norm( gradients, self.max_gradient) self.apply_gradients.append(optimizer.apply_gradients( zip(clipped_gradients, params),global_step=self.global_step)) super(BucketModel, self).compile() def check_input_lengths(self, inputs, expected_lengths): """ Raises: ValueError: if length of encoder_inputs, decoder_inputs, or target_weights disagrees with bucket size for the specified bucket_id. """ for input, length in zip(inputs, expected_lengths): if len(input) != length: raise ValueError("Input length doesn't match bucket size:" " %d != %d." % (len(input), length)) def get_batch(self, data, bucket_id): """Get a random batch of data from the specified bucket, prepare for step. Args: data: tuple of len(self.buckets). data[bucket_id] == [source_ids, target_ids] bucket_id: integer, which bucket to get the batch for. Returns: The triple (encoder_inputs, decoder_inputs, target_weights) for the constructed batch that has the proper format to call step(...) later. """ encoder_size, decoder_size = self.buckets[bucket_id] encoder_inputs, decoder_inputs = [], [] # Get a random batch of encoder and decoder inputs from data, # pad them if needed, reverse encoder inputs and add GO to decoder. for _ in range(self.batch_size): encoder_input, decoder_input = random.choice(data[bucket_id]) # BasicEncoder inputs are padded and then reversed. encoder_pad = [io_utils.PAD_ID] * (encoder_size - len(encoder_input)) encoder_inputs.append(list(reversed(encoder_input + encoder_pad))) # DynamicDecoder inputs get an extra "GO" symbol, and are padded then. decoder_pad= [io_utils.PAD_ID] * (decoder_size - len(decoder_input) - 1) decoder_inputs.append([io_utils.GO_ID] + decoder_input + decoder_pad) # Define some small helper functions before we re-index & weight. def inputs_to_unit(uid, inputs): """ Return re-indexed version of inputs array. Description in params below. :param uid: index identifier for input timestep/unit/node of interest. :param inputs: single batch of data; inputs[i] is i'th sentence. :return: re-indexed version of inputs as numpy array. """ return np.array([inputs[i][uid] for i in range(self.batch_size)], dtype=np.int32) batch_encoder_inputs = [inputs_to_unit(i, encoder_inputs) for i in range(encoder_size)] batch_decoder_inputs = [inputs_to_unit(i, decoder_inputs) for i in range(decoder_size)] batch_weights = list(np.ones(shape=(decoder_size, self.batch_size), dtype=np.float32)) # Set weight for the final decoder unit to 0.0 for all batches. for i in range(self.batch_size): batch_weights[-1][i] = 0.0 # Also set any decoder-input-weights to 0 that have PAD # as target decoder output. for unit_id in range(decoder_size - 1): ids_with_pad_target = [b for b in range(self.batch_size) if decoder_inputs[b][unit_id+1] == io_utils.PAD_ID] batch_weights[unit_id][ids_with_pad_target] = 0.0 return batch_encoder_inputs, batch_decoder_inputs, batch_weights def train(self, dataset): """ Train chatbot. """ from chatbot.legacy._train import train train(self, dataset) def decode(self): """ Create chat session between user & chatbot. """ from chatbot.legacy._decode import decode decode(self) def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False): """Run a step of the model. Args: encoder_inputs: list of numpy int vectors to feed as encoder inputs. decoder_inputs: list of numpy int vectors to feed as decoder inputs. target_weights: list of numpy float vectors to feed as target weights. bucket_id: which bucket of the model to use. """ raise NotImplemented ================================================ FILE: chatbot/components/__init__.py ================================================ from chatbot.components.embedder import Embedder from chatbot.components.input_pipeline import InputPipeline from chatbot.components.encoders import BasicEncoder, BidirectionalEncoder from chatbot.components.decoders import BasicDecoder, AttentionDecoder __all__ = ["InputPipeline", "Embedder", "BasicEncoder", "BidirectionalEncoder", "BasicDecoder", "AttentionDecoder"] ================================================ FILE: chatbot/components/base/__init__.py ================================================ ================================================ FILE: chatbot/components/base/_rnn.py ================================================ """Collection of base RNN classes and custom RNNCells. """ import tensorflow as tf from tensorflow.python.util import nest from tensorflow.python.ops import rnn_cell_impl from chatbot.components import bot_ops from tensorflow.contrib.rnn import RNNCell from tensorflow.contrib.rnn import GRUCell, MultiRNNCell, LSTMStateTuple from tensorflow.python.layers import core as layers_core # Required due to TensorFlow's unreliable naming across versions . . . try: # r1.1 from tensorflow.contrib.seq2seq import DynamicAttentionWrapper \ as AttentionWrapper from tensorflow.contrib.seq2seq import DynamicAttentionWrapperState \ as AttentionWrapperState except ImportError: # master from tensorflow.contrib.seq2seq import AttentionWrapper from tensorflow.contrib.seq2seq import AttentionWrapperState class Cell(RNNCell): """Simple wrapper class for any extensions I want to make to the encoder/decoder rnn cells. For now, just Dropout+GRU.""" def __init__(self, state_size, num_layers, dropout_prob, base_cell): """Define the cell by composing/wrapping with tf.contrib.rnn functions. Args: state_size: number of units in the cell. num_layers: how many cells to include in the MultiRNNCell. dropout_prob: probability of a node being dropped. base_cell: (str) name of underling cell to use (e.g. 'GRUCell') """ self._state_size = state_size self._num_layers = num_layers self._dropout_prob = dropout_prob self._base_cell = base_cell def single_cell(): """Convert cell name (str) to class, and create it.""" return getattr(tf.contrib.rnn, base_cell)(num_units=state_size) if num_layers == 1: self._cell = single_cell() else: self._cell = MultiRNNCell( [single_cell() for _ in range(num_layers)]) @property def state_size(self): return self._cell.state_size @property def shape(self): """Needed for shape_invariants arg for tf.while_loop.""" if self._num_layers == 1: return self.single_layer_shape() else: return tuple(self.single_layer_shape() for _ in range(self._num_layers)) def single_layer_shape(self): if 'LSTM' in self._base_cell: return LSTMStateTuple(c=tf.TensorShape([None, self._state_size]), h=tf.TensorShape([None, self._state_size])) else: return tf.TensorShape([None, self._state_size]) @property def output_size(self): return self._cell.output_size def __call__(self, inputs, state, scope=None): """Run this RNN cell on inputs, starting from the given state. Args: inputs: `2-D` tensor with shape `[batch_size x input_size]`. state: Either 2D Tensor or tuple of 2D tensors, determined by cases: - `self.state_size` is int: `2-D Tensor` with shape `[batch_size x self.state_size]`. - `self.state_size` is tuple: tuple with shapes `[batch_size x s] for s in self.state_size`. scope: VariableScope for the created subgraph; defaults to class name. Returns: A pair containing: - Output: 2D tensor with shape [batch_size x self.output_size]. - New state: Either a single `2-D` tensor, or a tuple of tensors matching the arity and shapes of `state`. """ output, new_state = self._cell(inputs, state, scope) output = tf.layers.dropout(output, rate=self._dropout_prob, name="dropout") return output, new_state class RNN(object): """Base class for encoders/decoders. Has simple instance attributes and an RNNCell object and getter. """ def __init__(self, state_size, embed_size, dropout_prob, num_layers, base_cell="GRUCell", state_wrapper=None): """ Args: state_size: number of units in underlying rnn cell. embed_size: dimension size of word-embedding space. dropout_prob: probability of a node being dropped. num_layers: how many cells to include in the MultiRNNCell. base_cell: (str) name of underling cell to use (e.g. 'GRUCell') state_wrapper: allow states to store their wrapper class. See the wrapper method docstring below for more info. """ self.state_size = state_size self.embed_size = embed_size self.num_layers = num_layers self.dropout_prob = dropout_prob self.base_cell = base_cell self._wrapper = state_wrapper def get_cell(self, name): """Returns a cell instance, defined by its name scope.""" with tf.name_scope(name, "get_cell"): return Cell(state_size=self.state_size, num_layers=self.num_layers, dropout_prob=self.dropout_prob, base_cell=self.base_cell) def wrapper(self, state): """Some RNN states are wrapped in namedtuples. (TensorFlow decision, definitely not mine...). This is here for derived classes to specify their wrapper state. Some examples: LSTMStateTuple and AttentionWrapperState. Args: state: tensor state tuple, will be unpacked into the wrapper tuple. """ if self._wrapper is None: return state else: return self._wrapper(*state) def __call__(self, *args): raise NotImplemented class SimpleAttentionWrapper(RNNCell): """A simplified and tweaked version of TensorFlow's AttentionWrapper. It closely follows the implementation described by Luong et. al, 2015 in `Effective Approaches to Attention-based Neural Machine Translation`. """ def __init__(self, cell, attention_mechanism, initial_cell_state=None, name=None): """Construct the wrapper. Main tweak is creating the attention_layer with a tanh activation (Luong's choice) as opposed to linear (TensorFlow's choice). Also, since I am sticking with Luong's approach, parameters that are in the constructor of TensorFlow's AttentionWrapper have been removed, and the corresponding values are set to how Luong's paper defined them. Args: cell: instance of the Cell class above. attention_mechanism: instance of tf AttentionMechanism. initial_cell_state: The initial state value to use for the cell when the user calls `zero_state()`. name: Name to use when creating ops. """ super(SimpleAttentionWrapper, self).__init__(name=name) # Assume that 'cell' is an instance of the custom 'Cell' class above. self._base_cell = cell._base_cell self._num_layers = cell._num_layers self._state_size = cell._state_size self._attention_size = attention_mechanism.values.get_shape()[-1].value self._attention_layer = layers_core.Dense(self._attention_size, activation=tf.nn.tanh, name="attention_layer", use_bias=False) self._cell = cell self._attention_mechanism = attention_mechanism with tf.name_scope(name, "AttentionWrapperInit"): if initial_cell_state is None: self._initial_cell_state = None else: final_state_tensor = nest.flatten(initial_cell_state)[-1] state_batch_size = ( final_state_tensor.shape[0].value or tf.shape(final_state_tensor)[0]) error_message = ( "Constructor AttentionWrapper %s: " % self._base_name + "Non-matching batch sizes between the memory " "(encoder output) and initial_cell_state.") with tf.control_dependencies( [tf.assert_equal(state_batch_size, self._attention_mechanism.batch_size, message=error_message)]): self._initial_cell_state = nest.map_structure( lambda s: tf.identity(s, name="check_initial_cell_state"), initial_cell_state) def zero_state(self, batch_size, dtype): with tf.name_scope(type(self).__name__ + "ZeroState", values=[batch_size]): if self._initial_cell_state is not None: cell_state = self._initial_cell_state else: cell_state = self._cell.zero_state(batch_size, dtype) error_message = ( "zero_state of AttentionWrapper %s: " % self._base_name + "Non-matching batch sizes between the memory " "(encoder output) and the requested batch size.") with tf.control_dependencies( [tf.assert_equal(batch_size, self._attention_mechanism.batch_size, message=error_message)]): cell_state = nest.map_structure( lambda s: tf.identity(s, name="checked_cell_state"), cell_state) alignment_history = () _zero_state_tensors = rnn_cell_impl._zero_state_tensors return AttentionWrapperState( cell_state=cell_state, time=tf.zeros([], dtype=tf.int32), attention=_zero_state_tensors(self._attention_size, batch_size, dtype), alignments=self._attention_mechanism.initial_alignments( batch_size, dtype), alignment_history=alignment_history) def call(self, inputs, state): """First computes the cell state and output in the usual way, then works through the attention pipeline: h --> a --> c --> h_tilde using the naming/notation from Luong et. al, 2015. Args: inputs: `2-D` tensor with shape `[batch_size x input_size]`. state: An instance of `AttentionWrapperState` containing the tensors from the prev timestep. Returns: A tuple `(attention_or_cell_output, next_state)`, where: - `attention_or_cell_output` depending on `output_attention`. - `next_state` is an instance of `DynamicAttentionWrapperState` containing the state calculated at this time step. """ # Concatenate the previous h_tilde with inputs (input-feeding). cell_inputs = tf.concat([inputs, state.attention], -1) # 1. (hidden) Compute the hidden state (cell_output). cell_output, next_cell_state = self._cell(cell_inputs, state.cell_state) # 2. (align) Compute the normalized alignment scores. [B, L_enc]. # where L_enc is the max seq len in the encoder outputs for the (B)atch. score = self._attention_mechanism( cell_output, previous_alignments=state.alignments) alignments = tf.nn.softmax(score) # Reshape from [B, L_enc] to [B, 1, L_enc] expanded_alignments = tf.expand_dims(alignments, 1) # (Possibly projected) encoder outputs: [B, L_enc, state_size] encoder_outputs = self._attention_mechanism.values # 3 (context) Take inner prod. [B, 1, state size]. context = tf.matmul(expanded_alignments, encoder_outputs) context = tf.squeeze(context, [1]) # 4 (h_tilde) Compute tanh(W [c, h]). attention = self._attention_layer( tf.concat([cell_output, context], -1)) next_state = AttentionWrapperState( cell_state=next_cell_state, attention=attention, time=state.time + 1, alignments=alignments, alignment_history=()) return attention, next_state @property def output_size(self): return self._attention_size @property def state_size(self): return AttentionWrapperState( cell_state=self._cell.state_size, attention=self._attention_size, time=tf.TensorShape([]), alignments=self._attention_mechanism.alignments_size, alignment_history=()) @property def shape(self): return AttentionWrapperState( cell_state=self._cell.shape, attention=tf.TensorShape([None, self._attention_size]), time=tf.TensorShape(None), alignments=tf.TensorShape([None, None]), alignment_history=()) class BasicRNNCell(RNNCell): """Same as tf.contrib.rnn.BasicRNNCell, rewritten for clarity. For example, many TF implementations have leftover code debt from past versions, so I wanted to show what is actually going on, with the fluff removed. Also, I've removed generally accepted values from parameters/args in favor of just setting them. """ def __init__(self, num_units, reuse=None): self._num_units = num_units self._reuse = reuse @property def state_size(self): return self._num_units @property def output_size(self): return self._num_units def __call__(self, inputs, state, scope=None): """Most basic RNN. Define as: output = new_state = act(W * input + U * state + B). """ output = tf.tanh(bot_ops.linear_map( args=[inputs, state], output_size=self._num_units, bias=True)) return output, output ================================================ FILE: chatbot/components/bot_ops.py ================================================ """Custom TF 'ops' as meant in the TensorFlow definition of ops.""" import numpy as np import tensorflow as tf from utils import io_utils from tensorflow.python.util import nest def dynamic_sampled_softmax_loss(labels, logits, output_projection, vocab_size, from_scratch=False, num_samples=512, name=None): """Sampled softmax loss function able to accept 3D Tensors as input, as opposed to the official TensorFlow support for <= 2D. This is dynamic because it can be applied across variable-length sequences, which are unspecified at initialization with size 'None'. Args: labels: 2D integer tensor of shape [batch_size, None] containing the word ID labels for each individual rnn state from logits. logits: 3D float tensor of shape [batch_size, None, state_size] as ouput by a DynamicDecoder instance. from_scratch: (bool) Whether to use the version I wrote from scratch, or to use the version I wrote that applies map_fn(sampled_softmax) across timeslices, which is probably less efficient. (Currently testing) num Returns: loss as a scalar Tensor, computed as the mean over all batches and sequences. """ if from_scratch: return _dynamic_sampled_from_scratch(labels, logits, output_projection, vocab_size, num_samples=num_samples, name=name) else: return _dynamic_sampled_map(labels, logits, output_projection, vocab_size, num_samples=num_samples, name=name) def _dynamic_sampled_map(labels, logits, output_projection, vocab_size, num_samples=512, name=None): """Sampled softmax loss function able to accept 3D Tensors as input, as opposed to the official TensorFlow support for <= 2D. This is dynamic because it can be applied across variable-length sequences, which are unspecified at initialization with size 'None'. Args: labels: 2D integer tensor of shape [batch_size, None] containing the word ID labels for each individual rnn state from logits. logits: 3D float tensor of shape [batch_size, None, state_size] as ouput by a DynamicDecoder instance. Returns: loss as a scalar Tensor, computed as the mean over all batches and sequences. """ with tf.name_scope(name, "dynamic_sampled_softmax_loss", [labels, logits, output_projection]): seq_len = tf.shape(logits)[1] st_size = tf.shape(logits)[2] time_major_outputs = tf.reshape(logits, [seq_len, -1, st_size]) time_major_labels = tf.reshape(labels, [seq_len, -1]) # Reshape is apparently faster (dynamic) than transpose. w_t = tf.reshape(output_projection[0], [vocab_size, -1]) b = output_projection[1] def sampled_loss(elem): logits, lab = elem lab = tf.reshape(lab, [-1, 1]) # TODO: Figure out how this accurately gets loss without requiring weights, # like sparse_softmax_cross_entropy requires. return tf.reduce_mean( tf.nn.sampled_softmax_loss( weights=w_t, biases=b, labels=lab, inputs=logits, num_sampled=num_samples, num_classes=vocab_size, partition_strategy='div')) batch_losses = tf.map_fn(sampled_loss, (time_major_outputs, time_major_labels), dtype=tf.float32) loss = tf.reduce_mean(batch_losses) return loss def _dynamic_sampled_from_scratch(labels, logits, output_projection, vocab_size, num_samples, name=None): """Note: I closely follow the notation from Tensorflow's Candidate Sampling reference. - Link: https://www.tensorflow.org/extras/candidate_sampling.pdf Args: output_projection: (tuple) returned by any DynamicDecoder.get_projections_tensors() - output_projection[0] == w tensor. [state_size, vocab_size] - output_projection[0] == b tensor. [vocab_size] labels: 2D Integer tensor. [batch_size, None] logits: 3D float Tensor [batch_size, None, state_size]. - In this project, usually is the decoder batch output sequence (NOT projected). num_samples: number of classes out of vocab_size possible to use. vocab_size: total number of classes. """ with tf.name_scope(name, "dynamic_sampled_from_scratch", [labels, logits, output_projection]): batch_size, seq_len, state_size = tf.unstack(tf.shape(logits)) time_major_outputs = tf.reshape(logits, [seq_len, batch_size, state_size]) time_major_labels = tf.reshape(labels, [seq_len, batch_size]) weights = tf.transpose(output_projection[0]) biases = output_projection[1] def sampled_loss_single_timestep(args): """ Args: 2-tuple (because map_fn below) targets: 1D tensor (sighs loudly) of shape [batch_size] logits: 2D tensor (sighs intensify) of shape [batch_size, state_size]. """ logits, targets = args with tf.name_scope("compute_sampled_logits", [weights, biases, logits, targets]): targets = tf.cast(targets, tf.int64) sampled_values = tf.nn.log_uniform_candidate_sampler( true_classes=tf.expand_dims(targets, -1), num_true=1, num_sampled=num_samples, unique=True, range_max=vocab_size) S, Q_true, Q_samp = (tf.stop_gradient(s) for s in sampled_values) # Get concatenated 1D tensor of shape [batch_size * None + num_samples], all_ids = tf.concat([targets, S], 0) _W = tf.nn.embedding_lookup(weights, all_ids, partition_strategy='div') _b = tf.nn.embedding_lookup(biases, all_ids) W = {'targets': tf.slice(_W, begin=[0, 0], size=[batch_size, state_size]), 'samples': tf.slice(_W, begin=[batch_size, 0], size=[num_samples, state_size])} b = {'targets': tf.slice(_b, begin=[0], size=[batch_size]), 'samples': tf.slice(_b, begin=[batch_size], size=[num_samples])} true_logits = tf.reduce_sum(tf.multiply(logits, W['targets']), 1) true_logits += b['targets'] - tf.log(Q_true) sampled_logits = tf.matmul(logits, W['samples'], transpose_b=True) sampled_logits += b['samples'] - tf.log(Q_samp) F = tf.concat([true_logits, sampled_logits], 1) def fn(s_i): return tf.where(targets == s_i, tf.ones_like(targets), tf.zeros_like(targets)) sample_labels = tf.transpose(tf.map_fn(fn, S)) out_targets = tf.concat([tf.ones_like(true_logits, dtype=tf.int64), sample_labels], 1) return tf.losses.softmax_cross_entropy(out_targets, logits=F) return tf.reduce_mean(tf.map_fn(sampled_loss_single_timestep, (time_major_outputs, time_major_labels), dtype=tf.float32)) def cross_entropy_sequence_loss(logits, labels, weights): """My version of various tensorflow sequence loss implementations I've seen. They all seem to do the basic operations below, but in a much more roundabout way. This version is able to be simpler because it assumes that the inputs are coming from a chatbot.Model subclass. """ with tf.name_scope('cross_entropy_sequence_loss'): losses = tf.nn.sparse_softmax_cross_entropy_with_logits( logits=logits, labels=labels) # We can get the sequence lengths simply by casting all PAD labels # with 0 and everything else with 1. weights = tf.to_float(weights) losses = tf.multiply(losses, weights) return tf.reduce_sum(losses) / tf.reduce_sum(weights) def dot_prod(x, y): return tf.reduce_sum(tf.multiply(x, y)) def bahdanau_score(attention_dim, h_j, s_i): state_size = tf.get_shape(h_j)[0] h_proj = tf.get_variable('W_1', [attention_dim, state_size], dtype=tf.float32) s_proj = tf.get_variable('W_2', [attention_dim, state_size], dtype=tf.float32) v = tf.get_variable('v', [attention_dim, state_size], dtype=tf.float32) score = dot_prod(v, tf.tanh(h_proj + s_proj)) return score def luong_score(attention_dim, h_j, s_i): h_proj = tf.get_variable('W_1', [attention_dim, tf.get_shape(h_j)[0]], dtype=tf.float32) s_proj = tf.get_variable('W_2', [attention_dim, tf.get_shape(s_i)[0]], dtype=tf.float32) score = dot_prod(h_proj, s_proj) return score def linear_map(args, output_size, biases=None): """Linear map: sum_i(args[i] * W[i]), where W[i] is a variable. Basically, you pass in a bunch of vectors (ok you got me, 2D tensors because batch dimensions) that you want added together but need their dimensions to match. This function has you covered. Args: args: a 2D Tensor or a list of 2D, batch x n, Tensors. output_size: int, second dimension of W[i]. biases: tensor of shape [output_size] added to all in batch if not None. Returns: A 2D Tensor with shape [batch x output_size] equal to sum_i(args[i] * W[i]), where W[i]s are newly created matrices. """ if not nest.is_sequence(args): args = [args] # Calculate the total size of arguments on dimension 1. total_arg_size = 0 shapes = [tf.shape(a)[1] for a in args] for shape in shapes: total_arg_size = tf.add(total_arg_size, shape) dtype = args[0].dtype # Now the computation. scope = tf.get_variable_scope() with tf.variable_scope(scope) as outer_scope: weights = tf.get_variable('weights', [total_arg_size, output_size], dtype=dtype) if len(args) == 1: res = tf.matmul(args[0], weights) else: res = tf.matmul(tf.concat(args, 1), weights) return res if not biases else tf.nn.bias_add(res, biases) ================================================ FILE: chatbot/components/decoders.py ================================================ import logging import tensorflow as tf import sys # Required due to TensorFlow's unreliable naming across versions . . . try: # r1.1 from tensorflow.contrib.seq2seq import DynamicAttentionWrapperState \ as AttentionWrapperState except ImportError: # master from tensorflow.contrib.seq2seq import AttentionWrapperState from tensorflow.contrib.seq2seq import BahdanauAttention, LuongAttention from tensorflow.contrib.rnn import LSTMStateTuple, LSTMCell from chatbot.components.base._rnn import RNN, SimpleAttentionWrapper from utils import io_utils class Decoder(RNN): """Dynamic decoding (base) class that supports both training and inference without requiring superfluous helper objects. With simple boolean parameters, handles the decoder sub-graph construction dynamically in its entirety. """ def __init__(self, base_cell, encoder_outputs, state_size, vocab_size, embed_size, dropout_prob, num_layers, temperature, max_seq_len, state_wrapper=None): """ Args: base_cell: (str) name of RNNCell class for underlying cell. state_size: number of units in underlying rnn cell. vocab_size: dimension of output space for projections. embed_size: dimension size of word-embedding space. dropout_prob: probability of a node being dropped. num_layers: how many cells to include in the MultiRNNCell. temperature: (float) determines randomness of outputs/responses. - Some notable values (to get some intuition): - t -> 0: outputs approach simple argmax. - t = 1: same as sampling from softmax distribution over outputs, interpreting the softmax outputs as from a multinomial (probability) distribution. - t -> inf: outputs approach uniform random distribution. state_wrapper: allow states to store their wrapper class. See the wrapper method docstring below for more info. """ self.encoder_outputs = encoder_outputs if state_wrapper is None and base_cell == 'LSTMCell': state_wrapper = LSTMStateTuple super(Decoder, self).__init__( base_cell=base_cell, state_size=state_size, embed_size=embed_size, dropout_prob=dropout_prob, num_layers=num_layers, state_wrapper=state_wrapper) self.temperature = temperature self.vocab_size = vocab_size self.max_seq_len = max_seq_len with tf.variable_scope('projection_tensors'): w = tf.get_variable( name="w", shape=[state_size, vocab_size], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer()) b = tf.get_variable( name="b", shape=[vocab_size], dtype=tf.float32, initializer=tf.contrib.layers.xavier_initializer()) self._projection = (w, b) def __call__(self, inputs, is_chatting, loop_embedder, cell, initial_state=None): """Run the inputs on the decoder. If we are chatting, then conduct dynamic sampling, which is the process of generating a response given inputs == GO_ID. Args: inputs: Tensor with shape [batch_size, max_time, embed_size]. For training, inputs are the 'to' sentence tokens (embedded). For chatting, first input is and thereafter, the input is the bot's previous output (looped around through embedding). initial_state: Tensor with shape [batch_size, state_size]. is_chatting: (bool) Determines how we retrieve the outputs and the returned Tensor shape. loop_embedder: required if is_chatting==True. Embedder instance needed to feed decoder outputs as next inputs. Returns: outputs: if not chatting, tensor of shape [batch_size, max_time, vocab_size]. Otherwise, tensor of response IDs with shape [batch_size, max_time]. state: if not is_chatting, tensor of shape [batch_size, state_size]. Otherwise, None. """ self.rnn = tf.make_template('decoder_rnn', tf.nn.dynamic_rnn, cell=cell, dtype=tf.float32) outputs, state = self.rnn(inputs=inputs, initial_state=initial_state) if not is_chatting: return outputs, state if loop_embedder is None: raise ValueError( "Loop function required to feed outputs as inputs.") def body(response, state): """Input callable for tf.while_loop. See below.""" tf.get_variable_scope().reuse_variables() decoder_input = loop_embedder(tf.reshape(response[-1], (1, 1)), reuse=True) outputs, state = self.rnn(inputs=decoder_input, initial_state=state, sequence_length=[1]) next_id = self.sample(self.apply_projection(outputs)) response = tf.concat([response, tf.stack([next_id])], axis=0) return response, state def cond(response, s): """Input callable for tf.while_loop. See below.""" return tf.logical_and( tf.not_equal(response[-1], io_utils.EOS_ID), tf.less_equal(tf.size(response), self.max_seq_len)) # Project to full output state during inference time. # Note: "outputs" at this point, at this exact line, is technically just # a single output: the bot's first response token. outputs = self.apply_projection(outputs) # Begin the process of building the list of output tokens. response = tf.stack([self.sample(outputs)]) # Reshape is needed so the while_loop ahead knows the shape of response. # The comma after the 1 is intentional, it forces tf to believe us. response = tf.reshape(response, [1,], name='response') tf.get_variable_scope().reuse_variables() # ============== BEHOLD: The tensorflow while loop. ================== # This allows us to sample dynamically. It also makes me happy! # -- Repeat 'body' while the 'cond' returns true. # -- 'cond': callable returning a boolean scalar tensor. # -- 'body': callable returning a tuple of tensors of same # arity as loop_vars. # -- 'loop_vars': tuple of tensors that is passed to 'cond' and 'body'. response, _ = tf.while_loop( cond, body, (response, state), shape_invariants=(tf.TensorShape([None]), cell.shape), back_prop=False) # =============== FAREWELL: The tensorflow while loop. ================= outputs = tf.expand_dims(response, 0) return outputs, None def apply_projection(self, outputs, scope=None): """Defines & applies the affine transformation from state space to output space. Args: outputs: Tensor of shape [batch_size, max_time, state_size] returned by tf dynamic_rnn. scope: (optional) variable scope for any created here. Returns: Tensor of shape [batch_size, max_time, vocab_size] representing the projected outputs. """ with tf.variable_scope(scope, "proj_scope", [outputs]): # Swap 1st and 2nd indices to match expected input of map_fn. seq_len = tf.shape(outputs)[1] st_size = tf.shape(outputs)[2] time_major_outputs = tf.reshape(outputs, [seq_len, -1, st_size]) # Project batch at single timestep from state space to output space. def proj_op(batch): return tf.matmul(batch, self._projection[0]) + self._projection[1] # Get projected output states; # 3D Tensor with shape [batch_size, seq_len, ouput_size]. projected_state = tf.map_fn(proj_op, time_major_outputs) return tf.reshape(projected_state, [-1, seq_len, self.vocab_size]) def sample(self, projected_output): """Return integer ID tensor representing the sampled word. Args: projected_output: Tensor [1, 1, state_size], representing a single decoder timestep output. """ # TODO: We really need a tf.control_dependencies check here (for rank). with tf.name_scope('decoder_sampler', values=[projected_output]): # Protect against extra size-1 dimensions; grab the 1D tensor # of size state_size. logits = tf.squeeze(projected_output) if self.temperature < 0.02: return tf.argmax(logits, axis=0) # Convert logits to probability distribution. probabilities = tf.div(logits, self.temperature) projected_output = tf.div( tf.exp(probabilities), tf.reduce_sum(tf.exp(probabilities), axis=-1)) # Sample 1 time from the probability distribution. sample_ID = tf.squeeze( tf.multinomial(tf.expand_dims(probabilities, 0), 1)) return sample_ID def get_projection_tensors(self): """Returns the tuple (w, b) that decoder uses for projecting. Required as argument to the sampled softmax loss. """ return self._projection class BasicDecoder(Decoder): """Simple (but dynamic) decoder that is essentially just the base class.""" def __call__(self, inputs, initial_state=None, is_chatting=False, loop_embedder=None, cell=None): return super(BasicDecoder, self).__call__( inputs=inputs, initial_state=initial_state, is_chatting=is_chatting, loop_embedder=loop_embedder, cell=self.get_cell('decoder_cell')) class AttentionDecoder(Decoder): """Dynamic decoder that applies an attention mechanism over the full sequence of encoder outputs. Using Bahdanau for now (may change). TODO: Luong's paper mentions that they only use the *top* layer of stacked LSTMs for attention-related computation. Since currently I'm only testing attention models with one-layer encoder/decoders, this isn't an issue. However, in a couple days I should revisit this. """ def __init__(self, encoder_outputs, base_cell, state_size, vocab_size, embed_size, attention_mechanism='BahdanauAttention', dropout_prob=1.0, num_layers=1, temperature=0.0, max_seq_len=10): """We need to explicitly call the constructor now, so we can: - Specify we need the state wrapped in AttentionWrapperState. - Specify our attention mechanism (will allow customization soon). """ super(AttentionDecoder, self).__init__( encoder_outputs=encoder_outputs, base_cell=base_cell, state_size=state_size, vocab_size=vocab_size, embed_size=embed_size, dropout_prob=dropout_prob, num_layers=num_layers, temperature=temperature, max_seq_len=max_seq_len, state_wrapper=AttentionWrapperState) _mechanism = getattr(tf.contrib.seq2seq, attention_mechanism) self.attention_mechanism = _mechanism(num_units=state_size, memory=encoder_outputs) self.output_attention = True def __call__(self, inputs, initial_state=None, is_chatting=False, loop_embedder=None, cell=None): """ The only modifcation to the superclass is we pass in our own cell that is wrapped with a custom attention class (specified in base/_rnn.py). It is mostly the same as tensorflow's, but with minor tweaks so that it could easily hang out with the other components of the project. """ if cell is None: cell = self.get_cell('attn_cell', initial_state) return super(AttentionDecoder, self).__call__( inputs=inputs, is_chatting=is_chatting, loop_embedder=loop_embedder, cell=cell) def get_cell(self, name, initial_state): # Get the simple underlying cell first. cell = super(AttentionDecoder, self).get_cell(name) # Return the normal cell wrapped to support attention. return SimpleAttentionWrapper( cell=cell, attention_mechanism=self.attention_mechanism, initial_cell_state=initial_state) ================================================ FILE: chatbot/components/embedder.py ================================================ import tensorflow as tf import logging import numpy as np from chatbot._models import Model from utils import io_utils import time class Embedder: """Acts on tensors with integer elements, embedding them in a higher-dimensional vector space. A single Embedder instance can embed both encoder and decoder by associating them with distinct scopes. """ def __init__(self, vocab_size, embed_size, l1_reg=0.0): self.vocab_size = vocab_size self.embed_size = embed_size self.l1_reg = l1_reg self._scopes = dict() def __call__(self, inputs, reuse=None): """Embeds integers in inputs and returns the embedded inputs. Args: inputs: input tensor of shape [batch_size, max_time]. Returns: Output tensor of shape [batch_size, max_time, embed_size] """ # Ensure inputs has expected rank of 2. assert len(inputs.shape) == 2, \ "Expected inputs rank 2 but found rank %r" % len(inputs.shape) scope = tf.get_variable_scope() # Parse info from scope input needed for reliable reuse across model. if scope is not None: scope_name = scope if isinstance(scope, str) else scope.name if scope_name not in self._scopes: self._scopes[scope_name] = scope else: self._scopes['embedder_call'] = tf.variable_scope('embedder_call') embed_tensor = tf.get_variable( name="embed_tensor", shape=[self.vocab_size, self.embed_size], initializer=tf.contrib.layers.xavier_initializer(), regularizer=tf.contrib.layers.l1_regularizer(self.l1_reg)) embedded_inputs = tf.nn.embedding_lookup(embed_tensor, inputs) # Place any checks on inputs here before returning. if not isinstance(embedded_inputs, tf.Tensor): raise TypeError("Embedded inputs should be of type Tensor.") if len(embedded_inputs.shape) != 3: raise ValueError("Embedded sentence has incorrect shape.") tf.summary.histogram(scope.name, embed_tensor) return embedded_inputs def assign_visualizers(self, writer, scope_names, metadata_path): """Setup the tensorboard embedding visualizer. Args: writer: instance of tf.summary.FileWriter scope_names: list of """ assert writer is not None if not isinstance(scope_names, list): scope_names = [scope_names] for scope_name in scope_names: assert scope_name in self._scopes, \ "I don't have any embedding tensors for %s" % scope_name config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig() emb = config.embeddings.add() emb.tensor_name = scope_name.rstrip('/') + '/embed_tensor:0' emb.metadata_path = metadata_path tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config) def get_scope_basename(self, scope): """ Args: scope: tf.variable_scope. """ return scope.name.strip('/').split('/')[-1] class AutoEncoder(Model): """[UNDER CONSTRUCTION]. AutoEncoder for unsupervised pretraining the word embeddings for dynamic models. """ def __init__(self, dataset, params): self.log = logging.getLogger('AutoEncoderLogger') super(AutoEncoder, self).__init__(self.log, dataset, params) self.build_computation_graph(dataset) self.compile() def build_computation_graph(self, dataset): from chatbot.components.input_pipeline import InputPipeline # Organize input pipeline inside single node for clean visualization. self.pipeline = InputPipeline( file_paths=dataset.paths, batch_size=self.batch_size, is_chatting=self.is_chatting) self.encoder_inputs = self.pipeline.encoder_inputs with tf.variable_scope('autoencoder_encoder'): embed_tensor = tf.get_variable( name="embed_tensor", shape=[self.vocab_size, self.embed_size]) _h = tf.nn.embedding_lookup(embed_tensor, self.encoder_inputs) h = tf.contrib.keras.layers.Dense(self.embed_size, activation='relu')(_h) with tf.variable_scope('autoencoder_decoder'): w = tf.get_variable( name="w", shape=[self.embed_size, self.vocab_size], dtype=tf.float32) b = tf.get_variable( name="b", shape=[self.vocab_size], dtype=tf.float32) # Swap 1st and 2nd indices to match expected input of map_fn. seq_len = tf.shape(h)[1] st_size = tf.shape(h)[2] time_major_outputs = tf.reshape(h, [seq_len, -1, st_size]) # Project batch at single timestep from state space to output space. def proj_op(h_t): return tf.matmul(h_t, w) + b decoder_outputs = tf.map_fn(proj_op, time_major_outputs) decoder_outputs = tf.reshape(decoder_outputs, [-1, seq_len, self.vocab_size]) self.outputs = tf.identity(decoder_outputs, name='outputs') # Tag inputs and outputs by name should we want to freeze the model. self.graph.add_to_collection('freezer', self.encoder_inputs) self.graph.add_to_collection('freezer', self.outputs) # Merge any summaries floating around in the aether into one object. self.merged = tf.summary.merge_all() def compile(self): if not self.is_chatting: with tf.variable_scope("evaluation") as scope: target_labels = self.encoder_inputs[:, 1:] target_weights = tf.cast(target_labels > 0, target_labels.dtype) print('\ntl\n', target_labels) print('\ntw\n', target_weights) preds = self.outputs[:, :-1, :] print('\npreds\n', preds) self.loss = tf.losses.sparse_softmax_cross_entropy( labels=target_labels, logits=preds, weights=target_weights) print(self.loss) self.train_op = tf.contrib.layers.optimize_loss( loss=self.loss, global_step=self.global_step, learning_rate=self.learning_rate, optimizer='Adam', summaries=['gradients']) # Compute accuracy, ensuring we use fully projected outputs. _preds = tf.argmax(self.outputs[:, :-1, :], axis=2) correct_pred = tf.equal( _preds, target_labels) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) tf.summary.scalar('accuracy', accuracy) tf.summary.scalar('loss_train', self.loss) self.merged = tf.summary.merge_all() super(AutoEncoder, self).compile() def step(self, forward_only=False): if not forward_only: return self.sess.run([self.merged, self.loss, self.train_op]) else: return self.sess.run(fetches=tf.argmax(self.outputs[:, :-1, :], axis=2), feed_dict=self.pipeline.feed_dict) def train(self, close_when_done=True): coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=self.sess, coord=coord) try: avg_loss = avg_step_time = 0.0 while not coord.should_stop(): i_step = self.sess.run(self.global_step) start_time = time.time() summaries, step_loss, _ = self.step() avg_step_time += (time.time() - start_time) / self.steps_per_ckpt avg_loss += step_loss / self.steps_per_ckpt # Print updates in desired intervals (steps_per_ckpt). if i_step % self.steps_per_ckpt == 0: print('loss:', avg_loss) self.save(summaries=summaries) avg_loss = avg_step_time = 0.0 if i_step >= self.max_steps: print("Maximum step", i_step, "reached.") raise SystemExit except (KeyboardInterrupt, SystemExit): print("Training halted. Cleaning up . . . ") coord.request_stop() except tf.errors.OutOfRangeError: print("OutOfRangeError. You have run out of data.") coord.request_stop() finally: coord.join(threads) if close_when_done: self.close() def __call__(self, sentence): encoder_inputs = io_utils.sentence_to_token_ids( tf.compat.as_bytes(sentence), self.dataset.word_to_idx) encoder_inputs = np.array([encoder_inputs[::-1]]) self.pipeline.feed_user_input(encoder_inputs) # Get output sentence from the chatbot. response = self.step(forward_only=True) return self.dataset.as_words(response[0]) ================================================ FILE: chatbot/components/encoders.py ================================================ """Classes for the dynamic encoders.""" import tensorflow as tf from tensorflow.contrib.rnn import GRUCell from tensorflow.contrib.rnn import LSTMStateTuple, LSTMCell from chatbot.components.base._rnn import RNN from tensorflow.python.layers import core as layers_core class BasicEncoder(RNN): """Encoder architecture that is defined by its cell running inside dynamic_rnn. """ def __call__(self, inputs, initial_state=None): """Run the inputs on the encoder and return the output(s). Args: inputs: Tensor with shape [batch_size, max_time, embed_size]. initial_state: (optional) Tensor with shape [batch_size, state_size] to initialize decoder cell. Returns: outputs: (only if return_sequence is True) Tensor of shape [batch_size, max_time, state_size]. state: The final encoder state; shape [batch_size, state_size]. """ cell = self.get_cell("basic_enc_cell") _, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state, dtype=tf.float32) return _, state class BidirectionalEncoder(RNN): """Encoder that concatenates two copies of its cell forward and backward and feeds into a bidirectional_dynamic_rnn. Outputs are concatenated before being returned. I may move this functionality to an intermediate class layer that handles shape-matching between encoder/decoder. """ def __call__(self, inputs, initial_state=None): """Run the inputs on the encoder and return the output(s). Args: inputs: Tensor with shape [batch_size, max_time, embed_size]. Returns: outputs: Tensor of shape [batch_size, max_time, state_size]. state: The final encoder state; shape [batch_size, state_size]. """ cell_fw = self.get_cell("cell_fw") cell_bw = self.get_cell("cell_bw") outputs_tuple, final_state_tuple = tf.nn.bidirectional_dynamic_rnn( cell_fw=cell_fw, cell_bw=cell_bw, inputs=inputs, dtype=tf.float32) # Create fully connected layer to help get us back to # state size (from the dual state fw-bw). layer = layers_core.Dense(units=self.state_size, use_bias=False) def single_state(state): """Reshape bidirectional state (via fully connected layer) to state size. """ if 'LSTM' in self.base_cell: bridged_state = LSTMStateTuple( c=layer(state[0]), h=layer(state[1])) else: bridged_state = layer(state) return bridged_state # Concatenate each of the tuples fw and bw dimensions. # Now we are dealing with the concatenated "states" with dimension: # [batch_size, max_time, state_size * 2]. # NOTE: Convention of LSTMCell is that outputs only contain the # the hidden state (i.e. 'h' only, no 'c'). outputs = tf.concat(outputs_tuple, -1) outputs = tf.map_fn(layer, outputs) # Similarly, combine the tuple of final states, resulting in: # [batch_size, state_size * 2]. final_state = tf.concat(final_state_tuple, -1) if self.num_layers == 1: final_state = single_state(final_state) else: final_state = tuple([single_state(fs) for fs in tf.unstack(final_state)]) return outputs, final_state ================================================ FILE: chatbot/components/input_pipeline.py ================================================ import logging import tensorflow as tf from utils import io_utils from tensorflow.contrib.training import bucket_by_sequence_length LENGTHS = {'encoder_sequence_length': tf.FixedLenFeature([], dtype=tf.int64), 'decoder_sequence_length': tf.FixedLenFeature([], dtype=tf.int64)} SEQUENCES = {'encoder_sequence': tf.FixedLenSequenceFeature([], dtype=tf.int64), 'decoder_sequence': tf.FixedLenSequenceFeature([], dtype=tf.int64)} class InputPipeline: """TensorFlow-only input pipeline with parallel enqueuing, dynamic bucketed-batching, and more. Overview of pipeline construction: 1. Create ops for reading protobuf tfrecords line-by-line. 2. Enqueue raw outputs, attach to threads, and parse sequences. 3. Organize sequences into buckets of similar lengths, pad, and batch. """ def __init__(self, file_paths, batch_size, capacity=None, is_chatting=False, scope=None): """ Args: file_paths: (dict) returned by instance of Dataset via Dataset.paths. batch_size: number of examples returned by dequeue op. capacity: maximum number of examples allowed in the input queue at a time. is_chatting: (bool) determines whether we're feeding user input or file inputs. """ with tf.name_scope(scope, 'input_pipeline') as scope: if capacity is None: self.capacity = max(50 * batch_size, int(1e4)) logging.info("Input capacity set to %d examples." % self.capacity) self.batch_size = batch_size self.paths = file_paths self.control = {'train': 0, 'valid': 1} self.active_data = tf.convert_to_tensor(self.control['train']) self.is_chatting = is_chatting self._user_input = tf.placeholder(tf.int32, [1, None], name='user_input') self._feed_dict = None self._scope = scope if not is_chatting: # Create tensors that will store input batches at runtime. self._train_lengths, self.train_batches = self.build_pipeline('train') self._valid_lengths, self.valid_batches = self.build_pipeline('valid') def build_pipeline(self, name): """Creates a new input subgraph composed of the following components: - Reader queue that feeds protobuf data files. - RandomShuffleQueue assigned parallel-thread queuerunners. - Dynamic padded-bucketed-batching queue for organizing batches in a time and space-efficient manner. Args: name: filename prefix for data. See Dataset class for naming conventions. Returns: 2-tuple (lengths, sequences): lengths: (dict) parsed context feature from protobuf file. Supports keys in LENGTHS. sequences: (dict) parsed feature_list from protobuf file. Supports keys in SEQUENCES. """ with tf.variable_scope(name + '_pipeline'): proto_text = self._read_line(self.paths[name + '_tfrecords']) context_pair, sequence_pair = self._assign_queue(proto_text) input_length = tf.add(context_pair['encoder_sequence_length'], context_pair['decoder_sequence_length'], name=name + 'length_add') return self._padded_bucket_batches(input_length, sequence_pair) @property def encoder_inputs(self): """Determines, via tensorflow control structures, which part of the pipeline to run and retrieve inputs to a Model encoder component. """ if not self.is_chatting: return self._cond_input('encoder') else: return self._user_input @property def decoder_inputs(self): """Determines, via tensorflow control structures, which part of the pipeline to run and retrieve inputs to a Model decoder component. """ if not self.is_chatting: return self._cond_input('decoder') else: # In a chat session, we just give the bot the go-ahead to respond! return tf.convert_to_tensor([[io_utils.GO_ID]]) @property def user_input(self): return self._user_input @property def feed_dict(self): return self._feed_dict def feed_user_input(self, user_input): """Called by Model instances upon receiving input from stdin.""" self._feed_dict = {self._user_input.name: user_input} def toggle_active(self): """Simple callable that toggles active_data between training and validation.""" def to_valid(): return tf.constant(self.control['valid']) def to_train(): return tf.constant(self.control['train']) self.active_data = tf.cond(tf.equal(self.active_data, self.control['train']), to_valid, to_train) def _cond_input(self, prefix): with tf.name_scope(self._scope): def train(): return self.train_batches[prefix + '_sequence'] def valid(): return self.valid_batches[prefix + '_sequence'] return tf.cond(tf.equal(self.active_data, self.control['train']), train, valid, name=prefix + '_cond_input') def _read_line(self, file): """Create ops for extracting lines from files. Returns: Tensor that will contain the lines at runtime. """ with tf.variable_scope('reader'): filename_queue = tf.train.string_input_producer([file]) reader = tf.TFRecordReader(name='tfrecord_reader') _, next_raw = reader.read(filename_queue, name='read_records') return next_raw def _assign_queue(self, proto_text): """ Args: proto_text: object to be enqueued and managed by parallel threads. """ with tf.variable_scope('shuffle_queue'): queue = tf.RandomShuffleQueue( capacity=self.capacity, min_after_dequeue=10*self.batch_size, dtypes=tf.string, shapes=[()]) enqueue_op = queue.enqueue(proto_text) example_dq = queue.dequeue() qr = tf.train.QueueRunner(queue, [enqueue_op] * 4) tf.train.add_queue_runner(qr) _sequence_lengths, _sequences = tf.parse_single_sequence_example( serialized=example_dq, context_features=LENGTHS, sequence_features=SEQUENCES) return _sequence_lengths, _sequences def _padded_bucket_batches(self, input_length, data): with tf.variable_scope('bucket_batch'): lengths, sequences = bucket_by_sequence_length( input_length=tf.to_int32(input_length), tensors=data, batch_size=self.batch_size, bucket_boundaries=[8, 16, 32], capacity=self.capacity, dynamic_pad=True) return lengths, sequences ================================================ FILE: chatbot/dynamic_models.py ================================================ """Sequence-to-sequence models with dynamic unrolling and faster embedding techniques. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import sys import time import logging import numpy as np import tensorflow as tf from chatbot import components from chatbot.components import bot_ops, Embedder, InputPipeline from chatbot._models import Model from utils import io_utils from pydoc import locate class DynamicBot(Model): """ General sequence-to-sequence model for conversations. Will eventually support beam search, and a wider variety of cell options. At present, supports multi-layer encoder/decoders, GRU/LSTM cells, attention, and dynamic unrolling (online decoding included). Additionally, will eventually support biologically inspired mechanisms for learning, such as hebbian-based update rules. """ def __init__(self, dataset, params): """Build the model computation graph. Args: dataset: any instance inheriting from data.DataSet. params: dictionary of hyperparameters. For supported keys, see DEFAULT_FULL_CONFIG. (chatbot.globals.py) """ self.log = logging.getLogger('DynamicBotLogger') # Let superclass handle common bookkeeping (saving/loading/dir paths). super(DynamicBot, self).__init__(self.log, dataset, params) # Build the model's structural components. self.build_computation_graph(dataset) # Configure training and evaluation. # Note: this is distinct from build_computation_graph for historical # reasons, and I plan on refactoring. Initially, I more or less followed # the feel of Keras for setting up models, but after incorporating the # YAML configuration files, this seems rather unnecessary. self.compile() def build_computation_graph(self, dataset): """Create the TensorFlow model graph. Note that this only builds the structural components, i.e. nothing related to training parameters, optimization, etc. The main components to be built (in order): 1. InputPipeline 2. Embedder - single object shared between encoder/decoder. - creates distict embeddings for distinct variable scopes. 2. Encoder 3. Decoder """ # Grab the model classes (Constructors) specified by user in params. encoder_class = locate(getattr(self, 'encoder.class')) \ or getattr(components, getattr(self, 'encoder.class')) decoder_class = locate(getattr(self, 'decoder.class')) \ or getattr(components, getattr(self, 'decoder.class')) assert encoder_class is not None, "Couldn't find requested %s." % \ self.model_params['encoder.class'] assert decoder_class is not None, "Couldn't find requested %s." % \ self.model_params['decoder.class'] # Organize input pipeline inside single node for clean visualization. self.pipeline = InputPipeline( file_paths=dataset.paths, batch_size=self.batch_size, is_chatting=self.is_chatting) # Grab the input feeds for encoder/decoder from the pipeline. encoder_inputs = self.pipeline.encoder_inputs self.decoder_inputs = self.pipeline.decoder_inputs # Create embedder object -- handles all of your embedding needs! # By passing scope to embedder calls, we can create distinct embeddings, # while storing inside the same embedder object. self.embedder = Embedder( self.vocab_size, self.embed_size, l1_reg=self.l1_reg) # Explicitly show required parameters for any subclass of # chatbot.components.base.RNN (e.g. encoders/decoders). # I do this for readability; you can easily tell below which additional # params are needed, e.g. for a decoder. rnn_params = { 'state_size': self.state_size, 'embed_size': self.embed_size, 'num_layers': self.num_layers, 'dropout_prob': self.dropout_prob, 'base_cell': self.base_cell} with tf.variable_scope('encoder'): embedded_enc_inputs = self.embedder(encoder_inputs) # For now, encoders require just the RNN params when created. encoder = encoder_class(**rnn_params) # Apply embedded inputs to encoder for the final (context) state. encoder_outputs, encoder_state = encoder(embedded_enc_inputs) with tf.variable_scope("decoder"): embedded_dec_inputs = self.embedder(self.decoder_inputs) # Sneaky. Would be nice to have a "cleaner" way of doing this. if getattr(self, 'attention_mechanism', None) is not None: rnn_params['attention_mechanism'] = self.attention_mechanism self.decoder = decoder_class( encoder_outputs=encoder_outputs, vocab_size=self.vocab_size, max_seq_len=dataset.max_seq_len, temperature=self.temperature, **rnn_params) # For decoder outpus, we want the full sequence (output sentence), # not simply the last. decoder_outputs, decoder_state = self.decoder( embedded_dec_inputs, initial_state=encoder_state, is_chatting=self.is_chatting, loop_embedder=self.embedder) self.outputs = tf.identity(decoder_outputs, name='outputs') # Tag inputs and outputs by name should we want to freeze the model. tf.add_to_collection('freezer', encoder_inputs) tf.add_to_collection('freezer', self.outputs) # Merge any summaries floating around in the aether into one object. self.merged = tf.summary.merge_all() def compile(self): """ TODO: perhaps merge this into __init__? Originally, this function accepted training/evaluation specific parameters. However, since moving the configuration parameters to .yaml files and interfacing with the dictionary, no args are needed here, and thus would mainly be a hassle to have to call before training. Will decide how to refactor this later. """ if not self.is_chatting: with tf.variable_scope("evaluation") as scope: # Loss - target is to predict (as output) next decoder input. # target_labels has shape [batch_size, dec_inp_seq_len - 1] target_labels = self.decoder_inputs[:, 1:] target_weights = tf.cast(target_labels > 0, target_labels.dtype) preds = self.decoder.apply_projection(self.outputs) reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) l1 = tf.reduce_sum(tf.abs(reg_losses)) if self.sampled_loss: self.log.info("Training with dynamic sampled softmax loss.") assert 0 < self.num_samples < self.vocab_size, \ "num_samples is %d but should be between 0 and %d" \ % (self.num_samples, self.vocab_size) self.loss = bot_ops.dynamic_sampled_softmax_loss( target_labels, self.outputs[:, :-1, :], self.decoder.get_projection_tensors(), self.vocab_size, num_samples=self.num_samples) + l1 else: self.loss = tf.losses.sparse_softmax_cross_entropy( labels=target_labels, logits=preds[:, :-1, :], weights=target_weights) + l1 # New loss function I'm experimenting with below: # I'm suspicious that it may do the same stuff # under-the-hood as sparse_softmax_cross_entropy, # but I'm doing speed tests/comparisons to make sure. #self.loss = bot_ops.cross_entropy_sequence_loss( # labels=target_labels, # logits=preds[:, :-1, :], # weights=target_weights) + l1 self.log.info("Optimizing with %s.", self.optimizer) self.train_op = tf.contrib.layers.optimize_loss( loss=self.loss, global_step=self.global_step, learning_rate=self.learning_rate, optimizer=self.optimizer, clip_gradients=self.max_gradient, summaries=['gradients']) # Compute accuracy, ensuring we use fully projected outputs. correct_pred = tf.equal(tf.argmax(preds[:, :-1, :], axis=2), target_labels) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) tf.summary.scalar('accuracy', accuracy) tf.summary.scalar('loss_train', self.loss) self.merged = tf.summary.merge_all() # Note: Important not to merge in the validation loss, since # we don't want to couple it with the training loss summary. self.valid_summ = tf.summary.scalar('loss_valid', self.loss) super(DynamicBot, self).compile() def step(self, forward_only=False): """Run one step of the model, which can mean 1 of the following: 1. forward_only == False. - This means we are training. - We do a forward and a backward pass. 2. self.is_chatting. - We are running a user's input sentence to generate a response. - We only do a forward pass to get the response (word IDs). 3. Otherwise: inference (used for validation) - Do a forward pass, but also compute loss(es) and summaries. Args: forward_only: if True, don't perform backward pass (gradient updates). Returns: 3-tuple: (summaries, step_loss, step_outputs). Qualifications/details for each of the 3 cases: 1. If forward_only == False: - This is a training step: 'summaries' are training summaries. - step_outputs = None 2. else if self.is_chatting: - summaries = step_loss = None - step_outputs == the bot response tokens 3. else (validation): - This is validation: 'summaries' are validation summaries. - step_outputs == None (to reduce computational cost). """ if not forward_only: fetches = [self.merged, self.loss, self.train_op] summaries, step_loss, _ = self.sess.run(fetches) return summaries, step_loss, None elif self.is_chatting: response = self.sess.run( fetches=self.outputs, feed_dict=self.pipeline.feed_dict) return None, None, response else: fetches = [self.valid_summ, self.loss] # , self.outputs] summaries, step_loss = self.sess.run(fetches) return summaries, step_loss, None def train(self, dataset=None): """Train bot on inputs until user types CTRL-C or queues run out of data. Args: dataset: (DEPRECATED) any instance of the Dataset class. Will be removed soon. """ def perplexity(loss): return np.exp(float(loss)) if loss < 300 else float("inf") if dataset is None: dataset = self.dataset coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=self.sess, coord=coord) # Tell embedder to coordinate with TensorBoard's "Embedddings" tab. # This allows us to view words in 3D-projected embedding space. self.embedder.assign_visualizers( self.file_writer, ['encoder', 'decoder'], dataset.paths['vocab']) # Note: Calling sleep allows sustained GPU utilization across training. # Without it, GPU has to wait for data to be enqueued more often. print('QUEUE RUNNERS RELEASED.', end=" ") for _ in range(3): print('.', end=" "); time.sleep(1); sys.stdout.flush() print('GO!') try: avg_loss = avg_step_time = 0.0 while not coord.should_stop(): i_step = self.sess.run(self.global_step) start_time = time.time() summaries, step_loss, _ = self.step() # Calculate running averages. avg_step_time += (time.time() - start_time) / self.steps_per_ckpt avg_loss += step_loss / self.steps_per_ckpt # Print updates in desired intervals (steps_per_ckpt). if i_step % self.steps_per_ckpt == 0: # Display averged-training updates and save. print("Step %d:" % i_step, end=" ") print("step time = %.3f" % avg_step_time) print("\ttraining loss = %.3f" % avg_loss, end="; ") print("training perplexity = %.2f" % perplexity(avg_loss)) self.save(summaries=summaries) # Toggle data switch and led the validation flow! self.pipeline.toggle_active() with self.graph.device('/cpu:0'): summaries, eval_loss, _ = self.step(forward_only=True) self.save(summaries=summaries) self.pipeline.toggle_active() print("\tValidation loss = %.3f" % eval_loss, end="; ") print("val perplexity = %.2f" % perplexity(eval_loss)) # Reset the running averages and exit checkpoint. avg_loss = avg_step_time = 0.0 if i_step >= self.max_steps: print("Maximum step", i_step, "reached.") raise SystemExit except (KeyboardInterrupt, SystemExit): print("Training halted. Cleaning up . . . ") coord.request_stop() except tf.errors.OutOfRangeError: print("OutOfRangeError. You have run out of data.") coord.request_stop() finally: coord.join(threads) self.close(save_current=False, rebuild_for_chat=True) def decode(self): """Sets up and manages chat session between bot and user (stdin).""" # Make sure params are set to chat values, just in case the user # forgot to specify/doesn't know about such things. self._set_chat_params() # Decode from standard input. print("Type \"exit\" to exit.\n") sentence = io_utils.get_sentence() while sentence != 'exit': response = self(sentence) print("Robot:", response) sentence = io_utils.get_sentence() print("Farewell, human.") def __call__(self, sentence): """This is how we talk to the bot interactively. While decode(self) above sets up/manages the chat session, users can also use this directly to get responses from the bot, given an input sentence. For example, one could do: sentence = 'Hi, bot!' response = bot(sentence) for a single input-to-response with the bot. Args: sentence: (str) Input sentence from user. Returns: response string from bot. """ # Convert input sentence to token-ids. encoder_inputs = io_utils.sentence_to_token_ids( tf.compat.as_bytes(sentence), self.dataset.word_to_idx) encoder_inputs = np.array([encoder_inputs[::-1]]) self.pipeline.feed_user_input(encoder_inputs) # Get output sentence from the chatbot. _, _, response = self.step(forward_only=True) # response has shape [1, response_length]. # Its last element is the EOS_ID, which we don't show user. response = self.dataset.as_words(response[0][:-1]) if 'UNK' in response: response = "I don't know." return response def chat(self): """Alias for decode.""" self.decode() def respond(self, sentence): """Alias for __call__. (Suggestion)""" return self.__call__(sentence) def close(self, save_current=True, rebuild_for_chat=True): """Before closing, which will freeze our graph to a file, rebuild it so that it's ready for chatting when unfreezed, to make it easier for the user. Training can still be resumed with no issue since it doesn't load frozen models, just ckpts. """ if rebuild_for_chat: lr_val = self.learning_rate.eval(session=self.sess) tf.reset_default_graph() # Gross. Am ashamed: self.sess = tf.Session() with self.graph.name_scope(tf.GraphKeys.SUMMARIES): self.global_step = tf.Variable(initial_value=0, trainable=False) self.learning_rate = tf.constant(lr_val) self._set_chat_params() self.build_computation_graph(self.dataset) self.compile() super(DynamicBot, self).close(save_current=save_current) def _set_chat_params(self): """Set training-specific param values to chatting-specific values.""" # TODO: use __setattr__ instead of this. self.__dict__['__params']['model_params']['decode'] = True self.__dict__['__params']['model_params']['is_chatting'] = True self.__dict__['__params']['model_params']['batch_size'] = 1 self.__dict__['__params']['model_params']['reset_model'] = False self.__dict__['__params']['model_params']['dropout_prob'] = 0.0 assert self.is_chatting and self.decode and not self.reset_model ================================================ FILE: chatbot/globals.py ================================================ """Place all default/global chatbot variables here.""" import tensorflow as tf OPTIMIZERS = { 'Adagrad': tf.train.AdagradOptimizer, 'Adam': tf.train.AdamOptimizer, 'SGD': tf.train.GradientDescentOptimizer, 'RMSProp': tf.train.RMSPropOptimizer, } # All allowed and/or used default configuration values, period. DEFAULT_FULL_CONFIG = { "model": "DynamicBot", "dataset": "Cornell", "model_params": { "base_cell": "GRUCell", "ckpt_dir": "out", # Directory to store training checkpoints. "decode": False, "batch_size": 256, "dropout_prob": 0.2, # Drop rate applied at encoder/decoders output. "decoder.class": "BasicDecoder", "encoder.class": "BasicEncoder", "embed_size": 128, "learning_rate": 0.002, "l1_reg": 1.0e-6, # L1 regularization applied to word embeddings. "lr_decay": 0.98, "max_gradient": 5.0, "max_steps": int(1e6), # Max number of training iterations. "num_layers": 1, # Num layers for each of encoder, decoder. "num_samples": 512, # IF sampled_loss is true, default sample size. "optimizer": "Adam", # Options are those in OPTIMIZERS above. "reset_model": True, "sampled_loss": False, # Whether to do sampled softmax. "state_size": 512, "steps_per_ckpt": 200, "temperature": 0.0, # Response temp for chat sessions. (default argmax) }, "dataset_params": { "data_dir": None, # Require user to specify. "vocab_size": 40000, "max_seq_len": 10, # Maximum length of sentence used to train bot. "optimize_params": True # Reduce vocab size if exceeds num unique words }, } ================================================ FILE: chatbot/legacy/__init__.py ================================================ ================================================ FILE: chatbot/legacy/_decode.py ================================================ """Used by legacy_models for decoding. Not needed by DynamicBot.""" import tensorflow as tf import logging import os import sys from utils import io_utils from utils.io_utils import sentence_to_token_ids, get_vocab_dicts import numpy as np def decode(bot, dataset, teacher_mode=True): """Runs a chat session between the given chatbot and user.""" # We decode one sentence at a time. bot.batch_size = 1 # Decode from standard input. print("Type \"exit\" to exit.") print("Write stuff after the \">\" below and I, your robot friend, will respond.") sentence = io_utils.get_sentence() while sentence: # Convert input sentence to token-ids. token_ids = sentence_to_token_ids(tf.compat.as_bytes(sentence), dataset.word_to_idx) # Get output sentence from the chatbot. outputs = decode_inputs(token_ids, dataset.idx_to_word, bot) # Print the chatbot's response. print(outputs) if teacher_mode: print("What should I have said?") feedback = io_utils.get_sentence() feedback_ids = sentence_to_token_ids(tf.compat.as_bytes(feedback), dataset.inputs_to_word) outputs = train_on_feedback(bot, token_ids, feedback_ids, dataset.idx_to_word) print("Okay. Let me try again:\n", outputs) # Wait for next input. sentence = io_utils.get_sentence() # Stop program if sentence == 'exit\n'. if sentence == 'exit': print("Fine, bye :(") break def decode_inputs(inputs, idx_to_word, chatbot): # Which bucket does it belong to? bucket_id = _assign_to_bucket(inputs, chatbot.buckets) # Get a 1-element batch to feed the sentence to the chatbot. data = {bucket_id: [(inputs, [])]} encoder_inputs, decoder_inputs, target_weights = chatbot.get_batch(data, bucket_id) # Get output logits for the sentence. _, _, _, output_logits = chatbot.step(encoder_inputs, decoder_inputs, target_weights, bucket_id, True) # Convert raw output to chat response & print. return _logits_to_outputs(output_logits, chatbot.temperature, idx_to_word) def train_on_feedback(chatbot, input_ids, feedback_ids, idx_to_outputs): bucket_id = _assign_to_bucket(feedback_ids, chatbot.buckets) data = {bucket_id: [(input_ids, feedback_ids)]} enc_in, dec_in, weights = chatbot.get_batch(data, bucket_id) # Jack up learning rate & make sure robot learned its lesson. chatbot.sess.run(chatbot.learning_rate.assign(0.7)) for _ in range(10): # LEARN YOU FOOL, LEARN. :) chatbot.step(enc_in, dec_in, weights, bucket_id, False) return decode_inputs(input_ids, idx_to_outputs, chatbot) def _logits_to_outputs(output_logits, temperature, idx_word): """ Args: output_logits: shape is [output_length, [vocab_size]] :return: """ # outputs = [int(np.argmax(logit, axis=1)) for logit in output_logits] outputs = [_sample(l, temperature) for l in output_logits] # If there is an EOS symbol in outputs, cut them at that point. if io_utils.EOS_ID in outputs: outputs = outputs[:outputs.index(io_utils.EOS_ID)] outputs = " ".join([tf.compat.as_str(idx_word[output]) for output in outputs]) + "." # Capitalize. outputs = outputs[0].upper() + outputs[1:] return outputs def _sample(logits, temperature): if temperature < 0.5: return int(np.argmax(logits, axis=1)) logits = logits.flatten() logits = logits / temperature logits = np.exp(logits - np.max(logits)) logits = logits / np.sum(logits) sampleID = np.argmax(np.random.multinomial(1, logits, 1)) while sampleID == io_utils.UNK_ID: sampleID = np.argmax(np.random.multinomial(1, logits, 1)) return int(sampleID) def _assign_to_bucket(token_ids, buckets): """Find bucket large enough for token_ids, else warning.""" bucket_id = len(buckets) - 1 for i, bucket in enumerate(buckets): if bucket[0] >= len(token_ids): bucket_id = i break else: logging.warning("Sentence longer than truncated: %s", len(token_ids)) return bucket_id ================================================ FILE: chatbot/legacy/_train.py ================================================ """Train seq2seq attention chatbot. Note: Only used for legacy_models. For (better) DynamicBot implementation, please see dynamic_models.py and, for saving/restoring ops, the base class of all models in _models.py. """ import time from utils import * def train(bot, dataset): """ Train chatbot using dataset given by dataset. chatbot: instance of ChatBot or SimpleBot. """ # Get data as token-ids. train_set, dev_set = io_utils.read_data(dataset, bot.buckets) # Interpret train_buckets_scale[i] as [cumulative] frac of samples in bucket i or below. train_buckets_scale = _get_data_distribution(train_set, bot.buckets) # This is the training loop. i_step = 0 step_time, loss = 0.0, 0.0 previous_losses = [] try: while True: # Sample a random bucket index according to the data distribution, # then get a batch of data from that bucket by calling chatbot.get_batch. rand = np.random.random_sample() bucket_id = min([i for i in range(len(train_buckets_scale)) if train_buckets_scale[i] > rand]) # Get a batch and make a step. start_time = time.time() summary, step_loss = run_train_step(bot, train_set, bucket_id, False) step_time += (time.time() - start_time) / bot.steps_per_ckpt loss += step_loss / bot.steps_per_ckpt # Once in a while, we save checkpoint, print statistics, and run evals. if i_step % bot.steps_per_ckpt == 0: run_checkpoint(bot, step_time, loss, previous_losses, dev_set) step_time, loss = 0.0, 0.0 i_step += 1 except (KeyboardInterrupt, SystemExit): print("Training halted. Cleaning up . . . ") # Store the model's graph in ckpt directory. bot.saver.export_meta_graph(bot.ckpt_dir + dataset.name + '.meta') bot.close() print("Done.") def run_train_step(model, train_set, bucket_id, forward_only=False): encoder_inputs, decoder_inputs, target_weights = model.get_batch(train_set, bucket_id) step_returns = model.step(encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only) summary, _, losses, _ = step_returns if not forward_only and summary is not None: model.train_writer.add_summary(summary, model.global_step.eval(model.sess)) return summary, losses def run_checkpoint(model, step_time, loss, previous_losses, dev_set): # Print statistics for the previous epoch. perplexity = np.exp(float(loss)) if loss < 300 else float("inf") print("\nglobal step:", model.global_step.eval(model.sess), end=" ") print("learning rate: %.4f" % model.learning_rate.eval(session=model.sess), end=" ") print("step time: %.2f" % step_time, end=" ") print("perplexity: %.2f" % perplexity) # Run evals on development set and print their perplexity. for bucket_id in range(len(model.buckets)): if len(dev_set[bucket_id]) == 0: print(" eval: empty bucket %d" % (bucket_id)) continue summary, eval_loss = run_train_step(model, dev_set, bucket_id, forward_only=True) model.save(summaries=summary) eval_ppx = np.exp(float(eval_loss)) if eval_loss < 300 else float("inf") print(" eval: bucket %d perplexity %.2f" % (bucket_id, eval_ppx)) sys.stdout.flush() def _get_data_distribution(train_set, buckets): # Get number of samples for each bucket (i.e. train_bucket_sizes[1] == num-trn-samples-in-bucket-1). train_bucket_sizes = [len(train_set[b]) for b in range(len(buckets))] # The total number training samples, excluding the ones too long for our bucket choices. train_total_size = float(sum(train_bucket_sizes)) # Interpret as: train_buckets_scale[i] == [cumulative] fraction of samples in bucket i or below. return [sum(train_bucket_sizes[:i + 1]) / train_total_size for i in range(len(train_bucket_sizes))] ================================================ FILE: chatbot/legacy/legacy_models.py ================================================ """Sequence-to-sequence models.""" # EDIT: Modified inheritance strucutre (see _models.py) so these *should* work again. from __future__ import absolute_import from __future__ import division from __future__ import print_function import logging import numpy as np import tensorflow as tf from tensorflow.contrib.legacy_seq2seq import embedding_attention_seq2seq from tensorflow.contrib.legacy_seq2seq import model_with_buckets #from tensorflow.contrib.rnn.python.ops import core_rnn from tensorflow.contrib.rnn.python.ops import core_rnn_cell from tensorflow.python.ops import embedding_ops from chatbot._models import BucketModel class ChatBot(BucketModel): """Sequence-to-sequence model with attention and for multiple buckets. The input-to-output path can be thought of (on a high level) as follows: 1. Inputs: Batches of integer lists, where each integer is a word ID to a pre-defined vocabulary. 2. Embedding: each input integer is mapped to an embedding vector. Each embedding vector is of length 'layer_size', an argument to __init__. The encoder and decoder have their own distinct embedding spaces. 3. Encoding: The embedded batch vectors are fed to a multi-layer cell containing GRUs. 4. Attention: At each timestep, the output of the multi-layer cell is saved, so that the decoder can access them in the manner specified in the paper on jointly learning to align and translate. (should give a link to paper...) 5. Decoding: The decoder, the same type of embedded-multi-layer cell as the encoder, is initialized with the last output of the encoder, the "context". Thereafter, we either feed it a target sequence (when training) or we feed its previous output as its next input (chatting). """ def __init__(self, buckets, dataset, params): logging.basicConfig(level=logging.INFO) logger = logging.getLogger('ChatBotLogger') super(ChatBot, self).__init__( logger=logger, buckets=buckets, dataset=dataset, params=params) if len(buckets) > 1: self.log.error("ChatBot requires len(buckets) be 1 since tensorflow's" " model_with_buckets function is now deprecated and BROKEN. The only" "workaround is ensuring len(buckets) == 1. ChatBot apologizes." "ChatBot also wishes it didn't have to be this way. " "ChatBot is jealous that DynamicBot does not have these issues.") raise ValueError("Not allowed to pass buckets with len(buckets) > 1.") # ========================================================================================== # Define basic components: cell(s) state, encoder, decoder. # ========================================================================================== #cell = tf.contrib.rnn.MultiRNNCell([tf.contrib.rnn.GRUCell(state_size)for _ in range(num_layers)]) cell = tf.contrib.rnn.GRUCell(self.state_size) self.encoder_inputs = ChatBot._get_placeholder_list("encoder", buckets[-1][0]) self.decoder_inputs = ChatBot._get_placeholder_list("decoder", buckets[-1][1] + 1) self.target_weights = ChatBot._get_placeholder_list("weight", buckets[-1][1] + 1, tf.float32) target_outputs = [self.decoder_inputs[i + 1] for i in range(len(self.decoder_inputs) - 1)] # If specified, sample from subset of full vocabulary size during training. softmax_loss, output_proj = None, None if 0 < self.num_samples < self.vocab_size: softmax_loss, output_proj = ChatBot._sampled_loss(self.num_samples, self.state_size, self.vocab_size) # ========================================================================================== # Combine the components to construct desired model architecture. # ========================================================================================== # The seq2seq function: we use embedding for the input and attention. def seq2seq_f(encoder_inputs, decoder_inputs): # Note: the returned function uses separate embeddings for encoded/decoded sets. # Maybe try implementing same embedding for both. # Question: the outputs are projected to vocab_size NO MATTER WHAT. # i.e. if output_proj is None, it uses its own OutputProjectionWrapper instead # --> How does this affect our model?? A bit misleading imo. #with tf.variable_scope(scope or "seq2seq2_f") as seq_scope: return embedding_attention_seq2seq(encoder_inputs, decoder_inputs, cell, num_encoder_symbols=self.vocab_size, num_decoder_symbols=self.vocab_size, embedding_size=self.state_size, output_projection=output_proj, feed_previous=self.is_chatting, dtype=tf.float32) # Note that self.outputs and self.losses are lists of length len(buckets). # This allows us to identify which outputs/losses to compute given a particular bucket. # Furthermore, \forall i < j, len(self.outputs[i]) < len(self.outputs[j]). (same for loss) self.outputs, self.losses = model_with_buckets( self.encoder_inputs, self.decoder_inputs, target_outputs, self.target_weights, buckets, seq2seq_f, softmax_loss_function=softmax_loss) # If decoding, append _projection to true output to the model. if self.is_chatting and output_proj is not None: self.outputs = ChatBot._get_projections(len(buckets), self.outputs, output_proj) with tf.variable_scope("summaries"): self.summaries = {} for i, loss in enumerate(self.losses): name = "loss{}".format(i) self.summaries[name] = tf.summary.scalar("loss{}".format(i), loss) def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False): """Run a step of the model. Args: encoder_inputs: list of numpy int vectors to feed as encoder inputs. decoder_inputs: list of numpy int vectors to feed as decoder inputs. target_weights: list of numpy float vectors to feed as target weights. bucket_id: which bucket of the model to use. Returns: [summary, gradient_norms, loss, outputs] """ encoder_size, decoder_size = self.buckets[bucket_id] super(ChatBot, self).check_input_lengths( [encoder_inputs, decoder_inputs, target_weights], [encoder_size, decoder_size, decoder_size]) input_feed = {} for l in range(encoder_size): input_feed[self.encoder_inputs[l].name] = encoder_inputs[l] for l in range(decoder_size): input_feed[self.decoder_inputs[l].name] = decoder_inputs[l] input_feed[self.target_weights[l].name] = target_weights[l] input_feed[self.decoder_inputs[decoder_size].name] = np.zeros([self.batch_size], dtype=np.int32) if not forward_only: # Not just for decoding; also for validating in training. fetches = [self.summaries["loss{}".format(bucket_id)], self.apply_gradients[bucket_id], # Update Op that does SGD. self.losses[bucket_id]] # Loss for this batch. outputs = self.sess.run(fetches=fetches, feed_dict=input_feed) return outputs[0], None, outputs[2], None # Summary, no gradients, loss, outputs. else: fetches = [self.losses[bucket_id]] # Loss for this batch. for l in range(decoder_size): # Output logits. fetches.append(self.outputs[bucket_id][l]) outputs = self.sess.run(fetches=fetches, feed_dict=input_feed) return None, None, outputs[0], outputs[1:] # No summary, no gradients, loss, outputs. @staticmethod def _sampled_loss(num_samples, hidden_size, vocab_size): """Defines the samples softmax loss op and the associated output _projection. Args: num_samples: (context: importance sampling) size of subset of outputs for softmax. hidden_size: number of units in the individual recurrent states. vocab_size: number of unique output words. Returns: sampled_loss, apply_projection - function: sampled_loss(labels, inputs) - apply_projection: transformation to full vocab space, applied to decoder output. """ assert(0 < num_samples < vocab_size) # Define the standard affine-softmax transformation from hidden_size -> vocab_size. # True output (for a given bucket) := tf.matmul(decoder_out, w) + b w_t = tf.get_variable("proj_w", [vocab_size, hidden_size], dtype=tf.float32) w = tf.transpose(w_t) b = tf.get_variable("proj_b", [vocab_size], dtype=tf.float32) output_projection = (w, b) def sampled_loss(labels, inputs): labels = tf.reshape(labels, [-1, 1]) return tf.nn.sampled_softmax_loss( weights=w_t, biases=b, labels=labels, inputs=inputs, num_sampled=num_samples, num_classes=vocab_size) return sampled_loss, output_projection @staticmethod def _get_projections(num_buckets, unprojected_vals, projection_operator): """Apply _projection operator to unprojected_vals, a tuple of length num_buckets. :param num_buckets: the number of projections that will be applied. :param unprojected_vals: tuple of length num_buckets. :param projection_operator: (in the mathematical meaning) tuple of shape unprojected_vals.shape[-1]. :return: tuple of length num_buckets, with entries the same shape as entries in unprojected_vals, except for the last dimension. """ projected_vals = unprojected_vals for b in range(num_buckets): projected_vals[b] = [tf.matmul(output, projection_operator[0]) + projection_operator[1] for output in unprojected_vals[b]] return projected_vals @staticmethod def _get_placeholder_list(name, length, dtype=tf.int32): """ Args: name: prefix of name of each tf.placeholder list item, where i'th name is [name]i. length: number of items (tf.placeholders) in the returned list. Returns: list of tensorflow placeholder of dtype=tf.int32 and unspecified shape. """ return [tf.placeholder(dtype, shape=[None], name=name+str(i)) for i in range(length)] class SimpleBot(BucketModel): """Primitive implementation from scratch, for learning purposes. 1. Inputs: same as ChatBot. 2. Embedding: same as ChatBot. 3. BasicEncoder: Single GRUCell. 4. DynamicDecoder: Single GRUCell. """ def __init__(self, dataset, params): # SimpleBot allows user to not worry about making their own buckets. # SimpleBot does that for you. SimpleBot cares. max_seq_len = dataset.max_seq_len buckets = [(max_seq_len // 2, max_seq_len // 2), (max_seq_len, max_seq_len)] logging.basicConfig(level=logging.INFO) logger = logging.getLogger('SimpleBotLogger') super(SimpleBot, self).__init__( logger=logger, buckets=buckets, dataset=dataset, params=params) # ========================================================================================== # Create placeholder lists for encoder/decoder sequences. # ========================================================================================== with tf.variable_scope("placeholders"): self.encoder_inputs = [tf.placeholder(tf.int32, shape=[None], name="encoder"+str(i)) for i in range(self.max_seq_len)] self.decoder_inputs = [tf.placeholder(tf.int32, shape=[None], name="decoder"+str(i)) for i in range(self.max_seq_len+1)] self.target_weights = [tf.placeholder(tf.float32, shape=[None], name="weight"+str(i)) for i in range(self.max_seq_len+1)] # ========================================================================================== # Before bucketing, need to define the underlying model(x, y) -> outputs, state(s). # ========================================================================================== def seq2seq(encoder_inputs, decoder_inputs, scope=None): """Builds basic encoder-decoder model and returns list of (2D) output tensors.""" with tf.variable_scope(scope or "seq2seq"): encoder_cell = tf.contrib.rnn.GRUCell(self.state_size) encoder_cell = tf.contrib.rnn.EmbeddingWrapper(encoder_cell, self.vocab_size, self.state_size) # BasicEncoder(raw_inputs) -> Embed(raw_inputs) -> [be an RNN] -> encoder state. _, encoder_state = tf.contrib.rnn.static_rnn(encoder_cell, encoder_inputs, dtype=tf.float32) with tf.variable_scope("decoder"): def loop_function(x): with tf.variable_scope("loop_function"): params = tf.get_variable("embed_tensor", [self.vocab_size, self.state_size]) return embedding_ops.embedding_lookup(params, tf.argmax(x, 1)) _decoder_cell = tf.contrib.rnn.GRUCell(self.state_size) _decoder_cell = tf.contrib.rnn.EmbeddingWrapper(_decoder_cell, self.vocab_size, self.state_size) # Dear TensorFlow: you should replace the 'reuse' param in # OutputProjectionWrapper with 'scope' and just do scope.reuse in __init__. # sincerely, programming conventions. decoder_cell = tf.contrib.rnn.OutputProjectionWrapper( _decoder_cell, self.vocab_size, reuse=tf.get_variable_scope().reuse) decoder_outputs = [] prev = None decoder_state = None for i, dec_inp in enumerate(decoder_inputs): if self.is_chatting and prev is not None: dec_inp = loop_function(tf.reshape(prev, [1, 1])) if i == 0: output, decoder_state = decoder_cell(dec_inp, encoder_state, scope=tf.get_variable_scope()) else: tf.get_variable_scope().reuse_variables() output, decoder_state = decoder_cell(dec_inp, decoder_state, scope=tf.get_variable_scope()) decoder_outputs.append(output) return decoder_outputs # ==================================================================================== # Now we can build a simple bucketed seq2seq model. # ==================================================================================== self.losses = [] self.outputs = [] values = self.encoder_inputs + self.decoder_inputs + self.decoder_inputs with tf.name_scope("simple_bucket_model", values): for idx_b, bucket in enumerate(buckets): # Reminder: you should never explicitly set reuse=False. It's a no-no. with tf.variable_scope(tf.get_variable_scope(), reuse=True if idx_b > 0 else None)\ as bucket_scope: # The outputs for this bucket are defined entirely by the seq2seq function. self.outputs.append(seq2seq( self.encoder_inputs[:bucket[0]], self.decoder_inputs[:bucket[1]], scope=bucket_scope)) # Target outputs are just the inputs time-shifted by 1. target_outputs = [self.decoder_inputs[i + 1] for i in range(len(self.decoder_inputs) - 1)] # Compute loss by comparing outputs and target outputs. self.losses.append(SimpleBot._simple_loss(self.batch_size, self.outputs[-1], target_outputs[:bucket[1]], self.target_weights[:bucket[1]])) with tf.variable_scope("summaries"): self.summaries = {} for i, loss in enumerate(self.losses): name = "loss{}".format(i) self.summaries[name] = tf.summary.scalar("loss{}".format(i), loss) @staticmethod def _simple_loss(batch_size, logits, targets, weights): """Compute weighted cross-entropy loss on softmax(logits).""" # Note: name_scope only affects names of ops, # while variable_scope affects both ops AND variables. with tf.name_scope("simple_loss", values=logits+targets+weights): log_perplexities = [] for l, t, w in zip(logits, targets, weights): cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=t, logits=l) log_perplexities.append(cross_entropy * w) # Reduce via elementwise-sum. log_perplexities = tf.add_n(log_perplexities) # Get weighted-averge by dividing by sum of the weights. log_perplexities /= tf.add_n(weights) + 1e-12 return tf.reduce_sum(log_perplexities) / tf.cast(batch_size, tf.float32) def step(self, encoder_inputs, decoder_inputs, target_weights, bucket_id, forward_only=False): """Run a step of the model. Args: encoder_inputs: list of numpy int vectors to feed as encoder inputs. decoder_inputs: list of numpy int vectors to feed as decoder inputs. target_weights: list of numpy float vectors to feed as target weights. bucket_id: which bucket of the model to use. Returns: [summary, gradient_norms, loss, outputs]: """ encoder_size, decoder_size = self.buckets[bucket_id] super(SimpleBot, self).check_input_lengths( [encoder_inputs, decoder_inputs, target_weights], [encoder_size, decoder_size, decoder_size]) input_feed = {} for l in range(encoder_size): input_feed[self.encoder_inputs[l].name] = encoder_inputs[l] for l in range(decoder_size): input_feed[self.decoder_inputs[l].name] = decoder_inputs[l] input_feed[self.target_weights[l].name] = target_weights[l] input_feed[self.decoder_inputs[decoder_size].name] = np.zeros([self.batch_size], dtype=np.int32) # Fetches: the Operations/Tensors we want executed/evaluated during session.run(...). if not forward_only: # Not just for decoding; also for validating in training. fetches = [self.summaries["loss{}".format(bucket_id)], self.apply_gradients[bucket_id], # Update Op that does SGD. self.losses[bucket_id]] # Loss for this batch. outputs = self.sess.run(fetches=fetches, feed_dict=input_feed) return outputs[0], None, outputs[2], None # summaries, No gradient norm, loss, no outputs. else: fetches = [self.losses[bucket_id]] # Loss for this batch. for l in range(decoder_size): # Output logits. fetches.append(self.outputs[bucket_id][l]) outputs = self.sess.run(fetches=fetches, feed_dict=input_feed) return None, None, outputs[0], outputs[1:] #No summary, No gradient norm, loss, outputs. ================================================ FILE: configs/example_attention.yml ================================================ model: DynamicBot dataset: Cornell model_params: base_cell: LSTMCell ckpt_dir: out/cornell attention_mechanism: BahdanauAttention decoder.class: AttentionDecoder encoder.class: BasicEncoder batch_size: 256 embed_size: 128 num_layers: 1 state_size: 512 steps_per_ckpt: 250 dataset_params: data_dir: /home/brandon/Datasets/cornell # Change to your path! vocab_size: 52000 max_seq_len: 10 ================================================ FILE: configs/example_cornell.yml ================================================ model: DynamicBot dataset: Cornell model_params: base_cell: LSTMCell num_layers: 2 attention_mechanism: LuongAttention decoder.class: AttentionDecoder encoder.class: BidirectionalEncoder ckpt_dir: out/cornell dataset_params: data_dir: /home/brandon/Datasets/cornell # The only truly 'mandatory' parameter. vocab_size: 52000 # Approximately the true number of unique words in the dataset. max_seq_len: 20 ================================================ FILE: configs/example_reddit.yml ================================================ model: DynamicBot dataset: Reddit model_params: base_cell: GRUCell batch_size: 128 embed_size: 128 num_layers: 1 reset_model: true steps_per_ckpt: 200 ckpt_dir: out/reddit/basicReddit dataset_params: data_dir: /home/brandon/Datasets/reddit max_seq_len: 15 vocab_size: 80000 # HUGE dataset = huge vocabulary. ================================================ FILE: configs/example_ubuntu.yml ================================================ model: DynamicBot dataset: Ubuntu model_params: base_cell: GRUCell ckpt_dir: out/ubuntu decoder.class: BasicDecoder encoder.class: BasicEncoder num_layers: 2 state_size: 512 dataset_params: data_dir: /home/brandon/Datasets/ubuntu vocab_size: 60000 # Should probably be higher. Ubuntu is noisy. max_seq_len: 12 # Any longer, and output quality is a challenge. ================================================ FILE: configs/ubuntu_basic.yml ================================================ model: chatbot.DynamicBot dataset: data.Ubuntu model_params: base_cell: GRUCell ckpt_dir: out/ubuntu/basic decode: False batch_size: 128 decoder.class: BasicDecoder encoder.class: BasicEncoder embed_size: 128 learning_rate: 0.002 num_layers: 1 reset_model: True state_size: 512 steps_per_ckpt: 100 dataset_params: data_dir: /home/brandon/Datasets/ubuntu vocab_size: 60000 max_seq_len: 12 optimize_params: true ================================================ FILE: configs/website_config.yml ================================================ # Experimenting with best model params for website. model: DynamicBot dataset: Reddit model_params: base_cell: LSTMCell batch_size: 128 ckpt_dir: out/reddit/website_config dropout_prob: 0.0 decoder.class: BasicDecoder encoder.class: BasicEncoder l1_reg: 0.0 learning_rate: 0.001 embed_size: 128 num_layers: 2 reset_model: False state_size: 512 steps_per_ckpt: 500 dataset_params: data_dir: /home/brandon/Datasets/reddit # The only truly 'mandatory' parameter. vocab_size: 40000 max_seq_len: 15 ================================================ FILE: data/__init__.py ================================================ from __future__ import absolute_import from data import data_helper from data import _dataset from data import dataset_wrappers from data.data_helper import DataHelper from data._dataset import Dataset from data.dataset_wrappers import Cornell, Ubuntu, Reddit, TestData __all__ = ['Cornell', 'Reddit', 'Ubuntu', 'TestData'] ================================================ FILE: data/_dataset.py ================================================ """ABC for datasets. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import logging import numpy as np import tensorflow as tf from utils import io_utils from abc import ABCMeta, abstractmethod, abstractproperty from chatbot.globals import DEFAULT_FULL_CONFIG DEFAULT_PARAMS = DEFAULT_FULL_CONFIG['dataset_params'] class DatasetABC(metaclass=ABCMeta): @abstractmethod def convert_to_tf_records(self, *args): """If not found in data dir, will create tfrecords data files from text files. """ pass @abstractmethod def train_generator(self, batch_size): """Returns a generator function for batches of batch_size train data. """ pass @abstractmethod def valid_generator(self, batch_size): """Returns a generator function for batches of batch_size validation data. """ pass @abstractproperty def word_to_idx(self): """Return dictionary map from str -> int. """ pass @abstractproperty def idx_to_word(self): """Return dictionary map from int -> str. """ pass @abstractproperty def name(self): """Returns name of the dataset as a string.""" pass @abstractproperty def max_seq_len(self): """Return the maximum allowed sentence length.""" pass class Dataset(DatasetABC): def __init__(self, dataset_params): """Implements the general of subset of operations that all dataset subclasses can use. Args: dataset_params: dictionary of configuration parameters. See DEFAULT_FULL_CONFIG at top of file for supported keys. """ self.__dict__['__params'] = Dataset.fill_params(dataset_params) # We query io_utils to ensure all data files are organized properly, # and io_utils returns the paths to files of interest. id_paths, vocab_path, vocab_size = io_utils.prepare_data( data_dir=self.data_dir, vocab_size=self.vocab_size, optimize=dataset_params.get('optimize_params'), config_path=dataset_params.get('config_path')) if vocab_size != self.vocab_size: self.log.info("Updating vocab size from %d to %d", self.vocab_size, vocab_size) self.vocab_size = vocab_size # Also update the input dict, in case it is used later/elsewhere. dataset_params['vocab_size'] = self.vocab_size self.paths = dict() self.paths = { **id_paths, 'vocab': vocab_path, 'train_tfrecords': None, 'valid_tfrecords': None} self._word_to_idx, self._idx_to_word = io_utils.get_vocab_dicts( vocab_path) # Create tfrecords file if not located in data_dir. self.convert_to_tf_records('train') self.convert_to_tf_records('valid') def convert_to_tf_records(self, prefix='train'): """If can't find tfrecords 'prefix' files, creates them. Args: prefix: 'train' or 'valid'. Determines which tfrecords to build. """ from_path = self.paths['from_'+prefix] to_path = self.paths['to_'+prefix] tfrecords_fname = (prefix + 'voc%d_seq%d' % (self.vocab_size, self.max_seq_len) + '.tfrecords') output_path = os.path.join(self.data_dir, tfrecords_fname) if os.path.isfile(output_path): self.log.info('Using tfrecords file %s' % output_path) self.paths[prefix + '_tfrecords'] = output_path return def get_sequence_example(encoder_line, decoder_line): space_needed = max(len(encoder_line.split()), len(decoder_line.split())) if space_needed > self.max_seq_len: return None example = tf.train.SequenceExample() encoder_list = [int(x) for x in encoder_line.split()] decoder_list = [io_utils.GO_ID] \ + [int(x) for x in decoder_line.split()] \ + [io_utils.EOS_ID] # Why tensorflow . . . why . . . example.context.feature['encoder_sequence_length'].int64_list.value.append( len(encoder_list)) example.context.feature['decoder_sequence_length'].int64_list.value.append( len(decoder_list)) encoder_sequence = example.feature_lists.feature_list['encoder_sequence'] decoder_sequence = example.feature_lists.feature_list['decoder_sequence'] for e in encoder_list: encoder_sequence.feature.add().int64_list.value.append(e) for d in decoder_list: decoder_sequence.feature.add().int64_list.value.append(d) return example with tf.gfile.GFile(from_path, mode="r") as encoder_file: with tf.gfile.GFile(to_path, mode="r") as decoder_file: with tf.python_io.TFRecordWriter(output_path) as writer: encoder_line = encoder_file.readline() decoder_line = decoder_file.readline() while encoder_line and decoder_line: sequence_example = get_sequence_example( encoder_line, decoder_line) if sequence_example is not None: writer.write(sequence_example.SerializeToString()) encoder_line = encoder_file.readline() decoder_line = decoder_file.readline() self.log.info("Converted text files %s and %s into tfrecords file %s" \ % (os.path.basename(from_path), os.path.basename(to_path), os.path.basename(output_path))) self.paths[prefix + '_tfrecords'] = output_path def sentence_generator(self, prefix='from'): """Yields (as words) single sentences from training data, for testing purposes. """ self.log.info("Generating sentences from %s", self.paths[prefix+'_train']) with tf.gfile.GFile(self.paths[prefix+'_train'], mode="r") as f: sentence = self.as_words( list(map(int, f.readline().strip().lower().split()))) while sentence: yield sentence sentence = self.as_words( list(map(int, f.readline().strip().lower().split()))) def pairs_generator(self, num_generate=None): in_sentences = self.sentence_generator('from') in_sentences = [s for s in in_sentences] out_sentences = self.sentence_generator('to') out_sentences = [s for s in out_sentences] if num_generate is None: num_generate = len(in_sentences) count = 0 for in_sent, out_sent in zip(in_sentences, out_sentences): yield in_sent, out_sent count += 1 if count >= num_generate: break def train_generator(self, batch_size): """[Note: not needed by DynamicBot since InputPipeline]""" return self._generator( self.paths['from_train'], self.paths['to_train'], batch_size) def valid_generator(self, batch_size): """[Note: not needed by DynamicBot since InputPipeline]""" return self._generator( self.paths['from_valid'], self.paths['to_valid'], batch_size) def _generator(self, from_path, to_path, batch_size): """(Used by BucketModels only). Returns a generator function that reads data from file, and yields shuffled batches. Args: from_path: full path to file for encoder inputs. to_path: full path to file for decoder inputs. batch_size: number of samples to yield at once. """ def longest_sentence(enc_list, dec_list): max_enc_len = max([len(s) for s in enc_list]) max_dec_len = max([len(s) for s in dec_list]) return max(max_enc_len, max_dec_len) def padded_batch(encoder_tokens, decoder_tokens): max_sent_len = longest_sentence(encoder_tokens, decoder_tokens) encoder_batch = np.array( [s + [io_utils.PAD_ID] * (max_sent_len - len(s)) for s in encoder_tokens])[:, ::-1] decoder_batch = np.array( [s + [io_utils.PAD_ID] * (max_sent_len - len(s)) for s in decoder_tokens]) return encoder_batch, decoder_batch encoder_tokens = [] decoder_tokens = [] with tf.gfile.GFile(from_path, mode="r") as source_file: with tf.gfile.GFile(to_path, mode="r") as target_file: source, target = source_file.readline(), target_file.readline() while source and target: # Skip sentence pairs that are too long for specifications. space_needed = max(len(source.split()), len(target.split())) if space_needed > self.max_seq_len: source, target = source_file.readline(), target_file.readline() continue # Reformat token strings to token lists. # Note: GO_ID is prepended by the chat bot, since it # determines whether or not it's responsible for responding. encoder_tokens.append([int(x) for x in source.split()]) decoder_tokens.append( [int(x) for x in target.split()] + [io_utils.EOS_ID]) # Have we collected batch_size number of sentences? # If so, pad & yield. assert len(encoder_tokens) == len(decoder_tokens) if len(encoder_tokens) == batch_size: yield padded_batch(encoder_tokens, decoder_tokens) encoder_tokens = [] decoder_tokens = [] source, target = source_file.readline(), target_file.readline() # Don't forget to yield the 'leftovers'! assert len(encoder_tokens) == len(decoder_tokens) assert len(encoder_tokens) <= batch_size if len(encoder_tokens) > 0: yield padded_batch(encoder_tokens, decoder_tokens) @property def word_to_idx(self): """Return dictionary map from str -> int. """ return self._word_to_idx @property def idx_to_word(self): """Return dictionary map from int -> str. """ return self._idx_to_word def as_words(self, sentence): """Convert list of integer tokens to a single sentence string.""" words = [] for token in sentence: word = self.idx_to_word[token] try: word = tf.compat.as_str(word) except UnicodeDecodeError: logging.error("UnicodeDecodeError on (token, word): " "(%r, %r)", token, word) word = str(word) words.append(word) words = " ".join(words) #words = " ".join([tf.compat.as_str(self.idx_to_word[i]) for i in sentence]) words = words.replace(' , ', ', ').replace(' .', '.').replace(' !', '!') words = words.replace(" ' ", "'").replace(" ?", "?") if len(words) < 2: return words return words[0].upper() + words[1:] @property def name(self): """Returns name of the dataset as a string.""" return self._name @property def train_size(self): raise NotImplemented @property def valid_size(self): raise NotImplemented @property def max_seq_len(self): return self._max_seq_len @staticmethod def fill_params(dataset_params): """Assigns default values from DEFAULT_FULL_CONFIG for keys not in dataset_params.""" if 'data_dir' not in dataset_params: raise ValueError('data directory not found in dataset_params.') return {**DEFAULT_PARAMS, **dataset_params} def __getattr__(self, name): if name not in self.__dict__['__params']: raise AttributeError(name) else: return self.__dict__['__params'][name] ================================================ FILE: data/data_helper.py ================================================ """Provides pre-processing functionality. Abstracts paths and filenames so we don't have to think about them. Currently, in use by Brandon, but will extend to general users in the future. """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import re import pdb import sys import json import logging import tempfile from pprint import pprint from subprocess import Popen, PIPE import pandas as pd import numpy as np from pympler.asizeof import asizeof # for profiling memory usage # Absolute path to this file. _WORD_SPLIT = re.compile(r'([.,!?\"\':;)(])|\s') HERE = os.path.dirname(os.path.realpath(__file__)) DATA_ROOTS = { 'brandon': '/home/brandon/Datasets/reddit', 'ivan': '/Users/ivan/Documents/sp_17/reddit_data', 'mitch': '/Users/Mitchell/Documents/Chatbot/RedditData', 'george': '/Users/George/Documents/ChatbotData/reddit' } # Maximum memory usage allowed (in GiB). MAX_MEM = 2.0 def prompt(text, default="", required=False): print("%s (default=%r): " % (text, default), end="") errors = 0 userinput = input() while not userinput and required: errors += 1 userinput = input("C'mon dude, be serious%s " % ( ':' if errors <= 1 else ('!' * errors))) return userinput or default class DataHelper: """Manages file locations and computing resource during preprocessing. This interacts directly with the user and double-checks their work; It makes it harder for you to screw up. """ def __init__(self, log_level=logging.INFO): """ Establish some baseline data with the user. """ self.logfile = tempfile.NamedTemporaryFile( mode='w', prefix='data_helper', delete=False) self.logfile.close() logging.basicConfig(filename=self.logfile.name, level=log_level) print("Using logfile:", self.logfile.name) self.file_counter = 0 # current file we're processing self._word_freq = None # temporary: for parallelizing frequency dict print("Hi, I'm a DataHelper. For now, I help with the reddit dataset.") print("At any prompt, press ENTER if you want the default value.") # 1. Get user name. We can associate info with a given user as we go. user = prompt("Username", default="brandon").lower() if user not in DATA_ROOTS: print("I don't recognize you, %s." % user) self.data_root = prompt("Please give me the path to your data:", required=True) else: self.data_root = DATA_ROOTS[user] print("Hello, %s, I've set your data root to %s" % (user, self.data_root)) # 2. Get absolute paths to all data filenames in self.file_paths. self.file_paths = [] years = prompt("Years to process", default="2007,2008,2009") # Secretly supports passing a range too. Shhhh. if '-' in years: years = list(map(int, years.split('-'))) years = list(range(years[0], years[1]+1)) years = list(map(str, years)) else: years = years.split(',') for y in years: # The path is: $ROOT/raw_data/$YEAR # Add the entirety of the directory to the file paths. base_path = os.path.join(self.data_root, 'raw_data', y) rel_paths = os.listdir(base_path) self.file_paths.extend([ os.path.join(base_path, f) for f in rel_paths \ if not f.endswith(".bz2") ]) self._next_file_path = self.file_paths[0] print("These are the files I found:") pprint(self.file_paths) print() _max_mem = prompt("Maximum memory to use (in GiB)", "%.2f" % MAX_MEM) try: self.max_mem = float(_max_mem) except ValueError: print("C'mon dude, get it together!") def safe_load(self): """ Load data while keeping an eye on memory usage.""" if self.file_counter >= len(self.file_paths): print("No more files to load!") return None # For in-place appending. # S.O.: https://stackoverflow.com/questions/20906474/ list_ = [] # real descriptive :) for i in range(self.file_counter, len(self.file_paths)): # lines=True means "read as json-object-per-line." list_.append(pd.read_json(self.file_paths[i], lines=True)) mem_usage = float(asizeof(list_)) / 1e9 logging.info("Data list has size %.3f GiB", mem_usage) logging.info("Most recent file loaded: %s", self.file_paths[i]) print("\rLoaded file", self.file_paths[i], end="") sys.stdout.flush() if mem_usage > self.max_mem: print("\nPast max capacity:", mem_usage, "Leaving data collection early.") logging.warning('Terminated data loading after ' 'reading %d files.', i + 1) logging.info('Files read into df: %r', self.file_paths[:i+1]) break print() # If the user decides they want to continue loading later # (when memory frees up), we want the file_counter set so that it # starts on the next file. self.file_counter = i + 1 self._next_file_path = self.file_paths[self.file_counter] df = pd.concat(list_).reset_index() logging.info("Number of lines in raw data file: %r", len(df.index)) logging.info("Column names from raw data file: %r", df.columns) logging.info("DataHelper.safe_load: df.head() = %r", df.head()) return df def load_random(self, year=None): """Load a random data file and return as a DataFrame. Args: year: (int) If given, get a random file from this year. """ files = self.file_paths if year is not None: files = list(filter(lambda f: str(year) in f, files)) rand_index = np.random.randint(low=0, high=len(files)) print('Returning data from file:\n', files[rand_index]) return pd.read_json(files[rand_index], lines=True) def load_next(self): if self.next_file_path is None: logging.warning('Tried loading next file but no files remain.') return None df = pd.read_json(self.next_file_path, lines=True) self.file_counter += 1 if self.file_counter < len(self.file_paths): self._next_file_path = self.file_paths[self.file_counter] else: self._next_file_path = None return df def set_word_freq(self, wf): """Hacky (temporary) fix related to multiprocessing.Pool complaints for the reddit preprocessing script. """ self._word_freq = wf @property def word_freq(self): return self._word_freq @property def next_file_path(self): return self._next_file_path def get_year_from_path(self, path): year = path.strip('/').split('/')[-2] try: _ = int(year) except ValueError: logging.warning("Couldn't get year from file path. Your directory" " structure is unexpected.") return None logging.info('Extracted year %s', year) return year def generate_files(self, from_file_path, to_file_path, root_to_children, comments_dict): """Generates two files, [from_file_path] and [to_file_path] of 1-1 comments. """ from_file_path = os.path.join(self.data_root, from_file_path) to_file_path = os.path.join(self.data_root, to_file_path) print("Writing data files:\n", from_file_path, "\n", to_file_path) with open(from_file_path, 'w') as from_file: with open(to_file_path, 'w') as to_file: for root_ID, child_IDs in root_to_children.items(): for child_ID in child_IDs: try: from_file.write(comments_dict[root_ID].strip() + '\n') to_file.write(comments_dict[child_ID].strip() + '\n') except KeyError: pass (num_samples, stderr) = Popen( ['wc', '-l', from_file_path], stdout=PIPE).communicate() num_samples = int(num_samples.strip().split()[0]) print("Final processed file has %d samples total." % num_samples) # First make sure user has copy of bash script we're about to use. # os.popen('cp %s %s' % (os.path.join(HERE, 'split_into_n.sh'), self.data_root)) # Split data into 90% training and 10% validation. # os.popen('bash %s %d' % (os.path.join(self.data_root, 'split_into_n.sh'), # 0.1 * num_samples)) def df_generator(self): """ Generates df from single files at a time.""" for i in range(len(self.file_paths)): df = pd.read_json(self.file_paths[i], lines=True) init_num_rows = len(df.index) logging.info("Number of lines in raw data file: %r" % init_num_rows) logging.info("Column names from raw data file: %r" % df.columns) yield df @staticmethod def random_rows_generator(num_rows_per_print, num_rows_total): """ Fun generator for viewing random comments (rows) in dataframes.""" num_iterations = num_rows_total // num_rows_per_print shuffled_indices = np.arange(num_rows_per_print * num_iterations) np.random.shuffle(shuffled_indices) for batch in shuffled_indices.reshape(num_iterations, num_rows_per_print): yield batch @staticmethod def word_tokenizer(sentences): """ Tokenizes sentence / list of sentences into word tokens.""" # Minor optimization: pre-create the list and fill it. tokenized = [None for _ in range(len(sentences))] for i in range(len(sentences)): tokenized[i] = [ w for w in _WORD_SPLIT.split(sentences[i].strip()) if w ] return tokenized @staticmethod def df_to_json(df, target_file=None, orient='records', lines=False, **kwargs): """Converts dataframe to json object in the intuitive way, i.e. each row is converted to a json object, where columns are properties. If target_file is not None, then each such object is saved as a line in the target_file. Helpful because pandas default args are NOT this behavior. Note: Setting lines=True can result in some problems when trying to reload the file. Setting lines=False, while makes an essentially unreadable (for humans) output file, it at least reproduces the saved dataframe upon loading via df_reloaded = pd.read_json(target_file) Args: df: Pandas DataFrame. orient: lines: whether or not to save rows on their own line or writing full file to single line. target_file: Where to save the json-converted df. If None, just return the json object. kwargs: any additional named params the user wishes to pass to df.to_json. """ if target_file is None: return df.to_json(orient=orient, lines=lines, **kwargs) df.to_json(path_or_buf=target_file, orient=orient, lines=lines, **kwargs) ================================================ FILE: data/dataset_wrappers.py ================================================ """Named data wrapper classes. No added functionality to dataset base class for now, but preprocessing checks will be incorporated into each when it's time. """ import logging import os from data._dataset import Dataset def check_data(abs_path, name): """All dataset wrappers call this as a quick sanity check.""" if abs_path is None: raise ValueError('No data directory found in dataset_wrappers.check_data.' 'Either specify data_dir or use io_utils.parse_config.') if os.path.basename(abs_path) != name: print("Data directory %s does not match dataset name %s." % (abs_path, name)) propose_path = os.path.join(os.path.dirname(abs_path), name.lower()) print("Would you like me to change data_dir to {}? [y/n] ".format(propose_path)) answer = input() if answer == 'y': return propose_path else: raise ValueError("Rejected path change. Terminating program.") return abs_path class Cornell(Dataset): """Movie dialogs.""" def __init__(self, dataset_params): self._name = "cornell" self.log = logging.getLogger('CornellLogger') dataset_params['data_dir'] = check_data( dataset_params.get('data_dir'), self.name) super(Cornell, self).__init__(dataset_params) class Ubuntu(Dataset): """Technical support chat logs from IRC.""" def __init__(self, dataset_params): self._name = "ubuntu" self.log = logging.getLogger('UbuntuLogger') dataset_params['data_dir'] = check_data( dataset_params.get('data_dir'), self.name) super(Ubuntu, self).__init__(dataset_params) class Reddit(Dataset): """Reddit comments from 2007-2015.""" def __init__(self, dataset_params): self._name = "reddit" self.log = logging.getLogger('RedditLogger') dataset_params['data_dir'] = check_data( dataset_params.get('data_dir'), self.name) super(Reddit, self).__init__(dataset_params) class TestData(Dataset): """Mock dataset with a handful of sentences.""" def __init__(self, dataset_params): self.log = logging.getLogger('TestDataLogger') self._name = "test_data" dataset_params['data_dir'] = check_data( dataset_params.get('data_dir'), self.name) super(TestData, self).__init__(dataset_params) ================================================ FILE: data/reddit_preprocessor.py ================================================ """Reddit data preprocessing.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import time from functools import wraps from itertools import chain from collections import Counter, defaultdict from multiprocessing import Pool import numpy as np import pandas as pd from data.data_helper import DataHelper from data.regex import regex_replace, contractions from nltk.corpus import wordnet # Global helper object that helps abstract away locations of # files & directories, and keeps an eye on memory usage. if __name__ == '__main__': data_helper = DataHelper() else: data_helper = None # Max number of words in any saved sentence. MAX_SEQ_LEN = 20 # Number of CPU cores available. NUM_CORES = 2 # How many chunks we should split dataframes into at any given time. NUM_PARTITIONS = 64 def timed_function(*expected_args): """Simple decorator to show how long the functions take to run.""" def decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): start_time = time.time() res = fn(*args, **kwargs) stop_time = time.time() fname = expected_args[0] print("Time to run %s: %.3f seconds." % (fname, stop_time - start_time)) return res return wrapper return decorator @timed_function('parallel_map_df') def parallel_map_df(fn, df): """ Based on great explanation from 'Pandas in Parallel' (racketracer.com). """ df = np.array_split(df, NUM_PARTITIONS) pool = Pool(NUM_CORES) df = pd.concat(pool.map(fn, df)) pool.close() pool.join() return df @timed_function('parallel_map_list') def parallel_map_list(fn, iterable): """ Based on great explanation from 'Pandas in Parallel' (racketracer.com). """ iterable = np.array_split(iterable, NUM_PARTITIONS) pool = Pool(NUM_CORES) iterable = np.concatenate(pool.map(fn, iterable)) pool.close() pool.join() return iterable def sentence_score(sentences): word_freq = data_helper.word_freq scores = [] for sentence in sentences: word_count = len(sentence) + 1e-20 sent_score = sum([1.0 / ((word_freq[w] + 1e-20) * word_count) for w in sentence if not wordnet.synsets(w)]) scores.append(sent_score) return scores def root_comments(df): """ Builds a list determining which rows of df are root comments. Returns: list of length equal to the number of rows in our data frame. """ root_value = [] # Iterate over DataFrame rows as namedtuples, # with index value as first element of the tuple. for row in df.itertuples(): root_value.append(row.parent_id == row.link_id) return root_value @timed_function('remove_extra_columns') def remove_extra_columns(df): """Throw away columns we don't need and misc. style formatting.""" df['root'] = root_comments(df) df = df[['author', 'body', 'link_id', 'parent_id', 'name', 'root', 'subreddit']] df.style.set_properties(subset=['body'], **{'width': '500px'}) df.style.set_properties(**{'text-align': 'left'}) df.head() return df @timed_function('regex_replacements') def regex_replacements(df): # Remove comments that are '[deleted]'. df = df.loc[df.body != '[deleted]'].reset_index(drop=True) df.style.set_properties(subset=['body'], **{'width': '800px'}) # Make all comments lowercase to help reduce vocab size. df['body'] = df['body'].map(lambda s: s.strip().lower()) # Loop over regex replacements specified by modify_list. for regex in regex_replace: df['body'].replace( {regex: regex_replace[regex]}, regex=True, inplace=True) return df @timed_function('remove_large_comments') def remove_large_comments(max_len, df): # Could probably do a regex find on spaces to make this faster. df = df[df['body'].map(lambda s: len(s.split())) < max_len].reset_index(drop=True) return df @timed_function('expand_contractions') def expand_contractions(df): """ Replace all contractions with their expanded chat_form. Note: contractions is dict(contraction -> expanded form) """ for c in contractions: df['body'].replace({c: contractions[c]}, regex=True, inplace=True) return df @timed_function('children_dict') def children_dict(df): """ Returns a dictionary with keys being the root comments and values being their immediate root_to_children. Assumes that df has 'root' column. Go through all comments. If it is a root, skip it since they wont have a parent_id that corresponds to a comment. """ children = defaultdict(list) for row in df.itertuples(): if row.root == False: children[row.parent_id].append(row.name) return children def main(): """Processes each file individually through the whole pipeline. This decision was made due to the very large (many larger than 5 Gb) files. I have scripts that combine the output files, and I plan on making those available soon (very basic). """ current_file = data_helper.next_file_path df = data_helper.load_next() while df is not None: # Execute preprocessing steps on current_file's dataframe. df = remove_extra_columns(df) df = regex_replacements(df) df = remove_large_comments(max_len=MAX_SEQ_LEN, df=df) df = expand_contractions(df) sentences = parallel_map_list(fn=DataHelper.word_tokenizer, iterable=df.body.values) data_helper.set_word_freq(Counter(chain.from_iterable(sentences))) print('Bout to score!') df['score'] = parallel_map_list(fn=sentence_score, iterable=sentences) del sentences # Keep the desired percentage of lowest-scored sentences. (low == good) keep_best_percent = 0.8 df = df.loc[df['score'] < df['score'].quantile(keep_best_percent)] print('Prepping for the grand finale.') comments_dict = pd.Series(df.body.values, index=df.name).to_dict() root_to_children = children_dict(df) file_basename = os.path.join('processed_data', data_helper.get_year_from_path(current_file), os.path.basename(current_file)) data_helper.generate_files( from_file_path="{}_encoder.txt".format(file_basename), to_file_path="{}_decoder.txt".format(file_basename), root_to_children=root_to_children, comments_dict=comments_dict) # Prep for next loop. current_file = data_helper.next_file_path df = data_helper.load_next() if __name__ == '__main__': main() ================================================ FILE: data/regex.py ================================================ regex_replace = { (r"https?:\/\/" r"(www\.)?" r"[^\s\.]+" r"\.\S{2,}"): "", # Raw link. r"\[[^\(\)]*\]\(.*\)": "", # Markdown link. r"\r?\n": " ", # Newlines. r"\d+": "", r"\.{2,}": ".", r"(>|\*|)": "", r"[_-]+": " " } contractions = { "sha'n't": "shall not", "I've": "I have", "who's": "who has", "you're": "you are", "can't've": "cannot have", "could've": "could have", "shan't": "shall not", "he'd've": "he would have", "hadn't've": "had not have", "couldn't've": "could not have", "y'all've": "you all have", "when've": "when have", "that'd've": "that would have", "it'll": "it shall", "oughtn't've": "ought not have", "you'll": "you shall", "shouldn't've": "should not have", "shouldn't": "should not", "we've": "we have", "who've": "who have", "why've": "why have", "needn't've": "need not have", "ma'am": "madam", "oughtn't": "ought not", "mustn't've": "must not have", "they'd've": "they would have", "isn't": "is not", "y'all're": "you all are", "so's": "so as", "he'd": "he had", "doesn't": "does not", "he's": "he has", "I'm": "I am", "mightn't've": "might not have", "hadn't": "had not", "needn't": "need not", "don't": "do not", "he'll've": "he shall have", "we'll've": "we will have", "what'll": "what shall", "that's": "that has", "it'd": "it had", "how's": "how has", "you've": "you have", "wouldn't": "would not", "he'll": "he shall", "we'd": "we had", "I'll": "I shall", "when's": "when has", "we'll": "we will", "couldn't": "could not", "you'll've": "you shall have", "will've": "will have", "there'd've": "there would have", "they'd": "they had", "I'd": "I had", "y'all": "you all", "won't've": "will not have", "aren't": "are not", "haven't": "have not", "mustn't": "must not", "what've": "what have", "it's": "it has", "she'll": "she shall", "wasn't": "was not", "they're": "they are", "that'd": "that would", "how'd'y": "how do you", "what's": "what has", "there'd": "there had", "to've": "to have", "I'll've": "I shall have", "y'all'd": "you all would", "would've": "would have", "how'll": "how will", "she'd": "she had", "what're": "what are", "wouldn't've": "would not have", "might've": "might have", "mayn't": "may not", "o'clock": "of the clock", "'cause": "because", "mightn't": "might not", "didn't": "did not", "they'll": "they shall", "there's": "there has", "we'd've": "we would have", "hasn't": "has not", "let's": "let us", "she's": "she has", "who'll": "who shall", "shan't've": "shall not have", "won't": "will not", "where've": "where have", "it'll've": "it shall have", "where's": "where has", "you'd've": "you would have", "weren't": "were not", "who'll've": "who shall have", "why's": "why has", "how'd": "how did", "we're": "we are", "she'd've": "she would have", "ain't": "am not", "y'all'd've": "you all would have", "I'd've": "I would have", "they've": "they have", "must've": "must have", "what'll've": "what shall have", "she'll've": "she shall have", "where'd": "where did", "should've": "should have", "you'd": "you had", "can't": "cannot", "it'd've": "it would have", "so've": "so have", "they'll've": "they shall have"} ================================================ FILE: main.py ================================================ #!/usr/bin/env python3 """main.py: Train and/or chat with a bot. (work in progress). Typical use cases: 1. Train a model specified by yaml config file, located at path_to/my_config.yml, where paths are relative to project root: ./main.py --config path_to/my_config.yml 2. Train using mix of yaml config and cmd-line args, with command-line args taking precedence over any values. ./main.py \ --config path_to/my_config.yml \ --model_params "{'batch_size': 32, 'optimizer': 'RMSProp'}" 3. Load a pretrained model that was saved in path_to/pretrained_dir, which is assumed to be relative to the project root. ./main.py --pretrained_dir path_to/pretrained_dir """ from __future__ import print_function from __future__ import absolute_import from __future__ import division import os # Meaning of values: # 1: INFO messages are not printed. # 2: INFO, WARNING messages are not printed. # I'm temporarily making the default '2' since the TF master # branch (as of May 6) is spewing warnings that are clearly # due to bugs on their side. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import data import chatbot import logging import tensorflow as tf from pydoc import locate from utils import io_utils # ============================================================================= # FLAGS: Command line argument parser from TensorFlow. # ============================================================================= flags = tf.app.flags flags.DEFINE_string( flag_name="pretrained_dir", default_value=None, docstring="relative path to a pretrained model directory." "It is assumed that the model is one from this repository, and " " thus has certain files that are generated after any training" " session (TL;DR: any ckpt_dir you've trained previously).") flags.DEFINE_string( flag_name="config", default_value=None, docstring="relative path to a valid yaml config file." " For example: configs/example_cornell.yml") flags.DEFINE_string( flag_name="debug", default_value=False, docstring="If true, increases output verbosity (log levels).") flags.DEFINE_string( flag_name="model", default_value="{}", docstring="Options: chatbot.{DynamicBot,Simplebot,ChatBot}.") flags.DEFINE_string( flag_name="model_params", default_value="{}", docstring="Configuration dictionary, with supported keys specified by" " those in chatbot.globals.py.") flags.DEFINE_string( flag_name="dataset", default_value="{}", docstring="Name (capitalized) of dataset to use." " Options: [data.]{Cornell,Ubuntu,Reddit}." " - Legend: [optional] {Pick,One,Of,These}.") flags.DEFINE_string( flag_name="dataset_params", default_value="{}", docstring="Configuration dictionary, with supported keys specified by" " those in chatbot.globals.py.") FLAGS = flags.FLAGS def start_training(dataset, bot): """Train bot. Will expand this function later to aid interactivity/updates. """ print("Training bot. CTRL-C to stop training.") bot.train(dataset) def start_chatting(bot): """Talk to bot. Will re-add teacher mode soon. Old implementation in _decode.py.""" print("Initiating chat session.") print("Your bot has a temperature of %.2f." % bot.temperature, end=" ") if bot.temperature < 0.1: print("Not very adventurous, are we?") elif bot.temperature < 0.7: print("This should be interesting . . . ") else: print("Enjoy your gibberish!") bot.chat() def main(argv): if FLAGS.debug: # Setting to '0': all tensorflow messages are logged. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0' logging.basicConfig(level=logging.INFO) # Extract the merged configs/dictionaries. config = io_utils.parse_config(flags=FLAGS) if config['model_params']['decode'] and config['model_params']['reset_model']: print("Woops! You passed {decode: True, reset_model: True}." " You can't chat with a reset bot! I'll set reset to False.") config['model_params']['reset_model'] = False # If loading from pretrained, double-check that certain values are correct. # (This is not something a user need worry about -- done automatically) if FLAGS.pretrained_dir is not None: assert config['model_params']['decode'] \ and not config['model_params']['reset_model'] # Print out any non-default parameters given by user, so as to reassure # them that everything is set up properly. io_utils.print_non_defaults(config) print("Setting up %s dataset." % config['dataset']) dataset_class = locate(config['dataset']) or getattr(data, config['dataset']) dataset = dataset_class(config['dataset_params']) print("Creating", config['model'], ". . . ") bot_class = locate(config['model']) or getattr(chatbot, config['model']) bot = bot_class(dataset, config) if not config['model_params']['decode']: start_training(dataset, bot) else: start_chatting(bot) if __name__ == "__main__": tf.logging.set_verbosity('ERROR') tf.app.run() ================================================ FILE: notebooks/Analysis.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analysis, Goals, and Predictions\n", "\n", "Here, I'd like to go over the loss functions being used to train the models and what we are aiming for, so that we can better understand the models' performance as training progresses. My approach will follow that of Ng (2015), as outlined in the textbook __\"Deep Learning\" by Goodfellow et al.__:\n", "\n", "* Determine your goals -- error metric(s) and target (re: desired) value(s). \n", "* Establish a working end-to-end pipeline. \n", "* Determine bottlenecks in performance, their sources, and whether they're due to overfitting/underfitting/software defect(s). \n", "* Repeatedly make incremental changes such as gathering new data, adjusting hyperparams, or changing algorithms. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Selecting Hyperparameters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Manual HyperParameter Tuning\n", "\n", "Here are I'll just bullet the main ideas:\n", "* The learning rate is perhaps the most important hyperparameter. The training error increases appx exponentially as the learning rate decreases below its optimal value. Above the optimal value, the training error basically shoots off to infinity (vertical wall). \n", "* Next, the best perfomance usually comes from a large model that is regularized well, for example, by using dropout. \n", "* Table showing typical hyperparameter relationships with model capacity. Remember that you can basically brute force your way to good performance by jacking up the model capacity and training set size. \n", "\n", "| Hyperparameter | Increases capacity when... | \n", "| -------------- | -------------------------- |\n", "| Num hidden units | increased | \n", "| Learning rate | tuned optimally |\n", "| Convolution kernal width | increased | \n", "| Implicit zero padding | increased | \n", "| Weight decay coefficient | decreased | \n", "| Dropout rate | decreased | \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Automatic HyperParameter Optimization\n", "\n", "__Grid Search__: This is what I'm doing right now. User selects a small finite set of values to explore. Grid search trains a model for every joint specification of hyperparameter values in the Cartesian product of possible values. The experiment with the best _validation error_ is chosen as the best. \n", "\n", "__Random Search (Better)__: \n", "1. Define a marginal distribution for each hyperparameter, e.g. multinoulli for discrete hparams or uniform (log-scale) for positive real-valued hyparams. For example, if we were interested in the range $[10^{-5}, 0.1]$ for the learning rate:\n", "$$\n", "\\begin{align}\n", "\\texttt{logLearningRate} &\\sim Unif[-1, -5] \\\\\n", "\\texttt{learningRate} &= 10^{logLearningRate}\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Debugging Strategies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Determining whether or not a machine learning model is broken is hard. Here are some debugging tips:\n", "* __Visualize the model in action__: Not just the quantitative stuff. How do the filters look? How is the chatbot responding?\n", "* __Visualize the worst mistakes__: For example, our chatbot models output probabilities for the word tokens, and we either sample or argmax. One way to get an idea of what sentences our model does poorly on is to choose examples where the output probability max is *small*. In other words, if argmax(output) is much lower than usual, that says our model is rather unsure what is the best next word (think of the limiting case where it outputs 1/numOutputs for all possible tokens!). \n", "* __Fit a tiny dataset__: Oooh, I like this one! Even small models can be guaranteed to be able to fit a sufficiently small dataset. Make sure you can write program that can train on say, a handful of input-output sentences, and produce the output given any of the inputs with near perfect accuracy. \n", "* __Monitor histograms of activations/gradients__: The preactivation can tell us if the units saturate, or how often they do. For tanh units, the average of the absolute value of the preactivations tells us how saturated the unit is. It is also useful to compare the parameter gradients with the parameters themselves. Ideally, we'd like the gradients over a minibatch to be about 1 percent of the magnitude of the parameter. " ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Plotting the Hyperparameter-Search Results" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline\n", "plt.style.use('ggplot')\n", "plt.rcParams['figure.figsize'] = 10, 8\n", "BASE = '/home/brandon/Documents/seq2seq_projects/data/saved_train_data/'" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
embed_sizeglobal_steplearning_ratelossstate_sizevocab_size
05620.1898859.21114638010000
0562030.1898855.38502038010000
0564040.1898855.21942538010000
0566050.1898854.84963838010000
0568060.1898854.68262838010000
\n", "
" ], "text/plain": [ " embed_size global_step learning_rate loss state_size vocab_size\n", "0 56 2 0.189885 9.211146 380 10000\n", "0 56 203 0.189885 5.385020 380 10000\n", "0 56 404 0.189885 5.219425 380 10000\n", "0 56 605 0.189885 4.849638 380 10000\n", "0 56 806 0.189885 4.682628 380 10000" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = BASE + 'cornell_03_11.csv'\n", "df = pd.read_csv(path, index_col=0)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{32}\n", "{128}\n", "{0.5}\n" ] } ], "source": [ "embed_sizes = set(df['embed_size'])\n", "state_sizes = set(df['state_size'])\n", "learning_rates = set(df['learning_rate'])\n", "print(embed_sizes)\n", "print(state_sizes)\n", "print(learning_rates)\n", "\n", "def get_split(df, col, vals):\n", " return [(v, df[df[col]==v]) for v in vals]\n", "\n", "def split_df_and_plot(df, split_col, split_vals):\n", " \"\"\"\n", " Example usage:\n", " split_df_and_plot(df, 'learning_rate', learning_rates)\n", " \"\"\"\n", " df_split = get_split(df, split_col, split_vals)\n", " plt.figure(figsize=(8, 6))\n", " for val, df_sp in df_split:\n", " ax=plt.subplot()\n", " plt.scatter(df_sp['global_step'], df_sp['loss'], label='%.3f' % val)\n", "\n", " plt.title(split_col + ' Comparisons', fontsize=20)\n", " ax.set_xlabel('Global Step', fontsize=15)\n", " ax.set_ylabel('Validation Loss', fontsize=15)\n", " leg = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \n", " title=split_col, prop={'size':15})\n", " plt.setp(leg.get_title(),fontsize=20)\n", " plt.tight_layout()\n", " plt.savefig(split_col+'.pdf', bbox_extra_artists=(leg,), bbox_inches='tight')\n", " plt.show()\n", " \n", "def inception_split(df, split_col_one, split_vals_one, split_col_two, split_vals_two):\n", " \"\"\"ENHANCE\"\"\"\n", " df_split_one = get_split(df, split_col_one, split_vals_one)\n", " fig = plt.figure(figsize=(12, 10))\n", " ctr = 1\n", " for val_one, df_sp_one in df_split_one:\n", " df_split_two = get_split(df_sp_one, split_col_two, split_vals_two)\n", " ax=fig.add_subplot(3, 2, ctr)\n", " for val_two, df_sp_two in df_split_two:\n", " ax.scatter(df_sp_two['global_step'], df_sp_two['loss'], label=split_col_two + ': %.2f' % val_two)\n", " ax.set_ylim([3., 10.])\n", " plt.title(split_col_one + ' = %.2f' % val_one, fontsize=15)\n", " ax.set_xlabel('Global Step', fontsize=12)\n", " ax.set_ylabel('Validation Loss', fontsize=12)\n", " if ctr in [2, 4, 6]:\n", " leg = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., \n", " title=split_col_two, prop={'size':12})\n", " plt.setp(leg.get_title(),fontsize=15)\n", " ctr += 1\n", " plt.tight_layout()\n", " plt.savefig(split_col_one + \"_\" + split_col_two + '.pdf', bbox_extra_artists=(leg,), bbox_inches='tight')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Single Plots Distinguishing One Variable" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n1FNPsWPHDjZs2IDVauXQoUN88sknDBs27IZKPG41lVuUEafcFFyzo4s85podjVNuikovRERE7iBO\nFSvh9er75MXHkhtzDpc6dUt8B/lykydPZvr06QwaNIj09HQaN27Mxx9/TN26dYmOjrYlzwB79+7l\n6aefBiA3NxfDMGxPxli4cCGtW7fmrbfeYurUqXTs2BFnZ2fat2/PlClTbPM1a9aM999/nzlz5jBx\n4kQ8PT0JDg62jVvWTIZhGGUdxPU4f/58qczj7e1donO5Zp6m+rkFmHBcfgMTSXWfIafivSU2/40o\n6TX5o9F6ONKaONKa2NN6ONKa2PP29i7rEEQAlVuUmTxXD/KdqxR5LN+5CnmuNUs5IhEREREpoCS5\njOS7VCXHzfENNQA5bj4qtRAREREpQ0qSy1BqnYFkVWpMnrM7BibynN3JqtSY1DoDyzo0ERERkTua\nbtwrQ4aTGyneT/7/c5ITyHOtqR1kERERkXJASXI5kO9SVcmxiIiISDmicgsRERERkUKUJIuIiIiI\nFKIkWURERESkECXJIiIiIiKFKEkWERERESlESbKIiIiIkJmZyeuvv06HDh1o2bIlAwcOZOfOnVfs\n//333xMUFETLli1p06YNEydOJCEh4brG27lzJ0FBQbRq1Yr27dvz6quvkpmZWWLXeD2UJIuIiIgI\nISEhHDx4kIiICHbt2kXfvn0ZOXIkp06dcuj7888/88wzz9CjRw92797Nv//9b44fP87UqVOLPd6Z\nM2cYOXIkPXr04LvvvuPTTz/l8OHDhISElNo1X42SZBEREZFyJDYtm4PRScSmZZfanMnJyaxdu5bR\no0dTv3593NzcCAoKomHDhkRGRjrGGBvL4MGDCQ4OxtXVlbp169KnTx92795d7PGWLVtGgwYNCA4O\npmLFitSrV49Ro0axZs0aux3psqKXiYiIiIiUAxnWXKauO8rRmBQS0q3UrGymSZ2qvNmzCZXMJZuy\nHTlyhJycHAICAuzaLRYLP/74o0P/tm3b0rZtW7u26Oho7rrrrmKPFxUVhcVicTiem5vLkSNHHMYv\nbdpJFhERESkHpq47yvaTccSlW8kH4tKtbD8Zx9R1R0t87oKd2+rVq9u116hRg/j4+Gue//333xMZ\nGcnYsWOLPV5CQgLVqlVzOA4Ua86SpiRZREREpIzFpmVzNCalyGNHY1JKtfSiMJPJdNXja9eu5bnn\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr8AAAGoCAYAAABPIo1QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlYlFX/P/D3sAzLDKtsomJogsoSKAouD66JCz5pZpYJ\nAplfNUUrc6lHM9NcSnFBUykUREMtccvURKvHUjRNE9cURBQFYhiGgYFhuX9/+HOexhltVAZU3q/r\n8qo558znfOYMXX04nvu+RYIgCCAiIiIiagRMGjoBIiIiIqL6wuKXiIiIiBoNFr9ERERE1Giw+CUi\nIiKiRoPFLxERERE1Gix+iYiIiKjRYPFLVAciIiLg7e39TM7p7e2NiIgIo89DD2flypXw9vZGRkZG\nQ6dCRPRUMWvoBIjoybZ8+XI4Ojo2aA7l5eVITU3FwYMHcfXqVZSVlcHR0RHPPfccBg0ahJdeegmW\nlpYNmmN9GzBgANq0aYM2bdo0dCpERE8VFr9E9ED9+/dv0PkvXryI8ePHIy8vD7169cKkSZNgY2OD\nvLw87N+/H7Nnz8bXX3+N1atXw93dvUFzrU/PP/88nn/++YZOg4joqcPil4ieWDKZDG+99RZKS0vx\n1VdfoXv37lr948ePx6pVq7BixQpMnToVmzZtgkgkaqBsiYjoacAzv/TMkslkmDdvHnr37g1fX18E\nBwdj/PjxOHPmjNa4u2cnf/vtN3z55Zfo2bMn/P39MXToUM15yg0bNqBv37544YUXMHjwYOzbt0/v\nnEqlErNnz0a3bt3g6+uL8PBw7Nix45FzA4Dz589j9OjRCAgIQFBQEMaOHYusrKzHXp8LFy5gypQp\n6NmzJ/z8/NC9e3eMGzcOJ0+e1Bp375lfb2/vB/75O5VKhbi4OISFhcHX1xedOnVCVFQUfv75Z4Ny\nTEhIQEFBAd577z2dwveut99+G8OGDUNISAjKy8s17SUlJVi4cCH69u0LX19fdOzYERERETh48KDW\n+7dv3w5vb2/s3LkTO3bsQFhYGPz8/NC/f398//33AIBdu3Zh0KBB8Pf3R1hYGDZt2qQVY8aMGfD2\n9sbFixexbNky9OrVC76+vujbty8SExNx71Pks7KyMGPGDHTv3h0+Pj7o3r07xo4diz/++ENrXEZG\nBry9vbF69Wp8+eWX6Nq1K2JjYwHoP/Obm5uLDz/8EH369IG/vz9CQkIQGRmJQ4cO6azbmTNnMG7c\nOAQHB8PX1xehoaGYOXMmbty4oTUuIiIC7du3h1qtxuLFi9GjRw/4+vqid+/e2LBhg9bYqqoqbNiw\nAUOGDEFQUBACAwMxcOBArFixAmq1Wu/3R0RU37jzS8+kkpISvPbaa5DJZBgxYgTatGmDgoICfP31\n13jjjTeQkJCALl26aL1n48aNKCgowIQJE1BQUIB169Zh4sSJiIyMxJEjRzBmzBgolUqsW7cOU6dO\nRUBAANzc3LRivPvuu7C0tERsbCwUCgW2bNmC6dOnQyKR4MUXX3zo3PLy8hAZGYmamhpERETA09MT\nly5dwpgxYyCRSB55fXJzc/H666/Dzs4Oo0aNQtOmTVFYWIjU1FRERUVh06ZN8Pf31/ve5cuX67Rd\nu3YNcXFxWsWvWq1GdHQ0zp8/j1deeQX+/v6Qy+X45ptvMHbsWCxcuBBDhgx5YJ47d+6EVCrF8OHD\nHzju008/1XqtUqkwatQoXLlyBcOHD4e/vz+USiW2b9+Ot99+G5988gleffVVrfccOnQIWVlZiIyM\nRGVlJdasWYP33nsPeXl5+PbbbzFy5EgAdwryuXPnws/PT2eNFi9ejKqqKowZMwZisRipqalYtGgR\nBEHAm2++CQDIz8/HyJEjUVtbi5iYGDRr1gz5+fnYuHEjRo4cia+//hp+fn5acf/44w/cuHEDU6dO\nRdOmTfWuQWlpKV577TWo1WqMHj0aLVu2hEKhwPbt2zFhwgTEx8ejb9++AICjR4/irbfeQpMmTTB6\n9Gi4u7vjypUr2LRpE3766SekpaXB1dVVK/7MmTNRVFSE8ePHa4rcBQsWoHnz5pq48+bNQ2pqKgYN\nGoSIiAiYmprixIkTWL16NS5fvoz4+PgHfo9ERPVCIHoGffrpp0Lbtm2F06dPa7Xfvn1b6NixozB4\n8GBN24oVKwQvLy+hX79+QmVlpaZ9zpw5gpeXl9CrVy+t9oSEBMHLy0vYtm2bpm3UqFGCl5eX8P77\n72vNl5WVJbRt21Z4+eWXHym3Tz/9VGcuQRCEtLQ0wcvLS/Dy8nqYZdFYv3694OXlJXz//fda7YWF\nhcLo0aOFtLQ0TZuXl5cwatSo+8YqLy8XwsPDhQ4dOgjXrl3TtCclJQleXl7C3r17tcYrlUqhV69e\nQnBwsKBWq+8b9/r164KXl5cQHR39sB9PWLt2reDl5SWsWbNGq720tFTo1q2bEBQUJFRUVAiCIAjf\nfvut4OXlJQQFBQklJSWasXe/54CAAEEmk2na9+7dK3h5eQnLli3TtE2fPl3w8vISwsPDhaqqKk27\nQqEQgoKChM6dOws1NTWCIAjCf//7XyEyMlLYvXu3Vm4///yz4OXlJXzwwQeatmPHjgleXl5C+/bt\nhRs3bmiNv/tze+zYMUEQBOHAgQOCl5eX8OWXX2qNq6ioEN566y2t9v79+wt+fn7C9evXtcbe/Wyz\nZ8/WtN392R47dqxQW1uraT9x4oTOz3yHDh2EQYMGCfdau3at8PbbbwtlZWU6fURE9Y3HHuiZtHfv\nXrRu3Rqenp5QKBSaP1ZWVggKCsKlS5dQUlKi9Z7BgwdDLBZrXrdt2xYAMGjQIL3thYWFOvOOGDFC\n67WnpyfatWuHzMxMKJXKh87t6NGjMDExwcCBA7XihoeHQyqVPurywNTUFABw6tQprXYnJyfNX1sb\n6qOPPsLly5exYMECtGzZUtO+d+9eSKVSdOvWTetz1tTUoGfPniguLsaff/5537hFRUUAoLMDaYiD\nBw9CJBLpfB9SqRRhYWFQKBQ6n71v376wtbXVvL77Pffq1QsODg467fq+/2HDhsHM7H9/oWZjY4Mu\nXbpALpdrPmv37t2RlJSE8PBwAHfuZKFQKDQX6928eVMnrp+fH5o1a/bAz3z3Oz1z5gxqamo07RYW\nFli3bp1m5/nq1avIyspCt27d0KJFC60Y/fr1g42NDX788Ued+FFRUVrnqe/uTv99HczMzJCfn69z\ndGLs2LGIj4+HtbX1Az8DEVF94LEHeuaUlpaioKAABQUF6NSp033H3bp1C3Z2dprX9xYX5ubmD2yv\nrq7Wienl5aXT1rx5c5w7dw63bt2Cm5vbQ+WWm5sLZ2dnnaLBzMwMLVu2xLlz5+4b40EGDRqElJQU\nJCUl4aeffkLv3r0REhKCkJAQWFhYGBwnNTUVO3fuRExMDPr166fVd/XqVSiVygd+zry8PLRv315v\nn4nJnd/Na2trDc7nrqysLDg7O8Pe3l6nz9PTEwCQnZ2tdfSlLr5/fXdfcHFxAXDns949FrJ3714k\nJSXh8uXLWueUAWgVrvfLTZ/u3bsjMDAQ+/fvR+/evdGnTx+EhISga9euWr8oZWdnA9D/s2pqagoP\nDw+cO3cOFRUVWrePu7dQvvtz8vd1ePvttzF//nwMGDAAoaGh6Nq1K7p37671SxERUUNj8UvPnLKy\nMgB3dug++OCD+467t6D4++6uIe366DuHe7eAqKioeOjcKioqNMXT/eI+CkdHR2zZsgVJSUn47rvv\nkJiYiMTEREilUkRHR2PChAma4vN+zp07h/nz56Njx4547733dPrLysrg5OSEpUuX3jdG69at79v3\n96LxYZWXl6NJkyZ6++4WbSqVSqu9Lr5/fTubd38m7l7wtW3bNvznP/9B06ZNMXHiRDz//POwtLRE\nSUkJJk2apDeuIee7xWIxEhMTkZqairS0NGzatAmbNm2ChYUFXn31VUybNg1isVjzM2hlZaU3zt2f\nq/Lycq2fMUN+KYqMjETr1q2RnJyM//73v5qLCzt06IA5c+bU+4NgiIj0YfFLz5y7hUJVVRWCg4Pr\ndW6VSqVTqFRUVAC4U2w8bG6WlpaorKzU23fvjuHDsre3x+TJkzF58mTk5OTg8OHDSElJwcqVK2Fi\nYoIJEybc970KhQKxsbGwsbFBXFyc1l/13yWRSKBUKh/5O3Bzc0PTpk3xxx9/QKFQaB1JuJdSqYRY\nLNYUqtbW1poi7153i97HuWDwfu5+1/fmBkBzdCIxMRGmpqZYv369ZhcaQJ3cwcPa2hoxMTGIiYnB\n7du38fPPP2PTpk3YuHEjVCoV5s+fr/nc9/v5edz16datG7p164aKigocP34ce/bswa5duzB69Ggc\nOHDggd8jEVF94JlfeubY2NjA1dUVOTk5mnOjfyeTyYw299WrV3XacnJyIBKJ0KxZs4fOzd3dHYWF\nhToFsFqtRk5OTp3l3bJlS0RFRWHr1q0wNzfHgQMH7jtWEARMnz4dt27dwpIlS+57Jvf5559HRUUF\nzp8/r9NXXFysc/svfYYOHYqKigokJiY+cNwnn3yCfv364fr165q5CwsL9X7XV65cAfDgXedHpe/7\nv3v+9e5O9o0bN+Dm5qZV+ALAb7/9Vqe5uLm54dVXX8W2bdvg7Oys+U7vfu7Lly/rvKe6uho5OTlo\n3rz5Qx1/0cfS0hKhoaFYvHgxRo8ejeLiYhw/fvyxYhIR1QUWv/RMGjBgAKqrq5GcnKzVXlJSgiFD\nhmDMmDFGmfebb77Ren3lyhVcvnwZAQEBmr9mfpjcOnXqhOrqavzwww9aY3fv3v1YO7+zZ8/GSy+9\npFNUW1tbw8TE5IF/1Z+QkIBDhw4hNjZW53ZxfzdgwAAA0Clc1Wo1YmJiMHjw4H88z3v3VmAJCQlI\nS0vT6RcEAfHx8dixYwdatWoFDw8PAP97Kt2WLVu0xhcXF2P//v1wdnZGYGDgA+d+FDt27NA6syuX\ny5GRkQFnZ2fNuVcnJycUFxdrHbu4desWNm7cCED/7rEh4uPj0bt3b52C38zMDBYWFprv1NPTE97e\n3vjll1+Qm5urNXb37t0oKyvTOb9tiMzMTISFhWHr1q06fXfPHD/MERIiImPhsQd6Jo0fPx7p6elY\nu3YtioqK0KlTJxQVFSE1NRVFRUWIjIys8zlNTExw48YNvPfeewgJCYFcLsfmzZshCALGjx//SLmN\nHj0aaWlp+Oijj3DlyhV4eHjg4sWL+OGHH+Dr64vMzMxHyjUkJARbt27FiBEjMGTIEDg5OaGkpAQ7\nd+5EZWUl3njjDb3v++OPP7Bs2TI0bdoULVu21Puwj7t3Jnjttdewe/du7N69G5WVlejTpw+USiW+\n/fZbnD9/HvPmzfvHc8U2NjZITEzE2LFjMWPGDHz77bfo27cvHB0dkZeXh7179+LSpUsIDQ1FXFyc\n5n0jR47Erl27sHLlShQUFMDf3x8ymQzffPMNSktLsXz5cr1HNR6XVCpFVFQU+vfvD7FYjE2bNkGl\nUuH999/X3ClhwIAB+OqrrzBp0iSEh4ejoKAAycnJ+OCDD7BgwQJcuHABX3/9NXr27PlQc4eEhGDN\nmjUYMWIEhg8fjqZNm6K8vBwHDhzAjRs3MGXKFM3Y2bNnIzo6GpGRkXj99dfh7OyMS5cuYfPmzfDw\n8MC4ceMe+rO3bdsWFhYWmDt3Li5evAhfX1+Ympri4sWLSElJQZs2bRASEvLQcYmI6hqLX3om2dvb\nY+vWrVi1ahUOHz6MHTt2wMrKCi+88ALmzZuHzp071/mcEokEy5cvx8KFCxEXFweFQgFPT0/ExcWh\nR48ej5Sbp6cnEhMTsWTJEqxfvx6mpqYIDAxEQkICVqxY8cjF78CBAyGRSJCcnIy1a9dCoVBAIpHA\nx8cHa9euvW/hdeXKFdTU1ODWrVtaxdTfLViwAC+//DLEYjE2bNiAdevWYd++fTh8+DDMzc3h4+OD\n+Ph4zUM//slzzz2H3bt3Y8uWLThw4AC++OILKJVK2NjY4IUXXsA777yDnj17at2GSywWIzk5GfHx\n8Thw4AC2bdumWeO5c+c+8A4UjyM2NhZHjx7FV199hYKCAri7u2PWrFlav0xMmjQJarUaBw4cwMcf\nf4w2bdrg448/Rp8+fVBeXo7Fixdj6dKleu8c8SBBQUFISUnBl19+ieTkZMjlcojFYnh7e2PRokVa\nt68LCgrC5s2bER8fjy+//BLl5eVwcXHBq6++igkTJmjdBcVQZmZm2LRpE7744gukp6cjLS0NVVVV\naNasGd544w2MGzeOO79E9EQQCYYcvCMiovuaMWMG0tLSsGXLFgQEBDR0OkRE9AA880tEREREjQaP\nPRA9A0pKSvQ+HEEfc3Nz2NjYGDkjIiKiJxOLX6JnwNChQ/U+Flefzp07a+4sQERE1NjwzC/RM+D0\n6dP3fRjGvWxtbdGuXTsjZ0RERPRkYvFLRERERI3GU3fsIS8vr17mcXd3r7e5nhZcE21cD11cE11c\nE21cD11cE23u7u4NnQI943i3ByIiIiJqNFj8EhEREVGjweKXiIiIiBoNFr9ERERE1Giw+CUiIiKi\nRoPFLxEREVEDioiIgLe39zM5p7e3NyIiIow+z8N46m51RkRERERPh+XLl8PR0bGh09DC4peIiIiI\njKJ///4NnYIOHnsgIiIiokaDO79EREREeshkMqxevRqHDh1CQUEBJBIJOnTogHHjxuGFF14AAKxc\nuRLx8fHYtGkTTp8+jZSUFMhkMrRu3RozZsxAcHAwNmzYgJSUFBQWFsLDwwNvv/223h1RpVKJxYsX\nIz09HSUlJXjuuecwZswYDBky5KHzuuv8+fNYtGgRzpw5AzMzM3To0AEzZsx47LW5cOEC1q5di9On\nT6OoqAh2dnbw9fXFW2+9hY4dO2rGeXt7o3Pnzti4caPm9YNcunRJ8+8qlQpr1qzBvn37cPPmTVhZ\nWcHHxwcxMTEIDQ195NxZ/BIRERHdo6SkBK+99hpkMhlGjBiBNm3aoKCgAF9//TXeeOMNJCQkoEuX\nLprxGzduREFBASZMmICCggKsW7cOEydORGRkJI4cOYIxY8ZAqVRi3bp1mDp1KgICAuDm5qY157vv\nvgtLS0vExsZCoVBgy5YtmD59OiQSCV588cWHzisvLw+RkZGoqalBREQEPD09cenSJYwZMwYSieSR\n1yY3Nxevv/467OzsMGrUKDRt2hSFhYVITU1FVFQUNm3aBH9/f73vXb58uU7btWvXEBcXp1UYq9Vq\nREdH4/z583jllVfg7+8PuVyOb775BmPHjsXChQt1fikwFIvfJ0CFqhZlylpIpCawtOJJFCIiooa2\nevVq5ObmIjU1VWs39aWXXsKgQYOwYMEC7Nq1S9N+8eJF7N69G2KxGABQVFSEzZs3Iy0tDfv27dO0\nA8Bnn32GI0eO4JVXXtGa097eHosXL9a87tu3LwYOHIg1a9Zoit+HySspKQmlpaWYP3++1lzt2rXD\n9OnTH3lt0tPToVKpsHDhQq0d7MGDB2Pq1KnIysq6b/F77463SqXCqlWrIJVKsXLlSk17amoqfv/9\ndyxbtgwDBgzQtA8fPhyDBw/GwoULMWjQIJibmz90/qy0GlB1lYDj/1Xi5wOl+PXQnX8e/68S1VVC\nQ6dGRETUqO3duxetW7eGp6cnFAqF5o+VlRWCgoJw6dIllJSUaMYPHjxYq8Bt27YtAGDQoEF62wsL\nC3XmHDFihNZrT09PtGvXDpmZmVAqlQ+d19GjR2FiYoKBAwdqxQ0PD4dUKn3ktTE1NQUAnDp1Sqvd\nyckJGzZseKgd2Y8++giXL1/GggUL0LJlS0373r17IZVK0a1bN63PWVNTg549e6K4uBh//vnnI+XP\nnd8GdOpYGfLzqjWvKysE5OdV49SxMnT+16P/UBIREdGjKy0tRUFBAQoKCtCpU6f7jrt165bm35s1\na6bVd3dH8n7t1dXVuJeXl5dOW/PmzXHu3DncunULbm5uBudlZ2eH3NxcODs7w9raWqvfzMwMLVu2\nxLlz5+4b40EGDRqElJQUJCUl4aeffkLv3r0REhKCkJAQWFhYGBwnNTUVO3fuRExMDPr166fVd/Xq\nVSiVygd+zry8PLRv3/6h82fx20AqVLWQy2r09sllNahQ1fIIBBERUQMoKysDcGeX9oMPPrjvuL8X\ntn/f3f27+7Xro+8crqWlJQCgoqLiofOqqKiAi4uL3jF34z4KR0dHbNmyBUlJSfjuu++QmJiIxMRE\nSKVSREdHY8KECTAxeXANc+7cOcyfPx8dO3bEe++9p9NfVlYGJycnLF269L4xWrdu/Uj5s/htIGXK\nWlRW6D/eUFkhoEzJ4peIiKgh3C1Cq6qqEBwcXG/zqlQqnQK4oqICAGBlZfXQeVlaWqKyslJvX3l5\n+WPlam9vj8mTJ2Py5MnIycnB4cOHkZKSgpUrV8LExAQTJky473sVCgViY2NhY2ODuLg4mJnplqMS\niQRKpdIo61+vxW9KSgouXLiA2tpaDBkyBL/99huysrJgY2MDAPj3v/+NDh061GdKDUYiNYGFpUhv\nAWxhKYJEysKXiIioIdjY2MDV1RU5OTkoKipCkyZNtPplMplRnlp29epVnQvFcnJyIBKJ0KxZM1hZ\nWT1UXu7u7rh27RoqKyu1jiOo1Wrk5OTUWd4tW7ZEVFQU/v3vfyM0NBQHDhy4b/ErCAKmT5+OW7du\n4auvvoKrq6vecc8//zxOnTqF8+fP6xxtKC4uhr29PUQi0SPlW28VVmZmJnJzczF//nx88MEH2LBh\nAwBg5MiRmDNnDubMmdNoCl8AsLQygb2jqd4+e0dT7voSERE1oAEDBqC6uhrJycla7SUlJRgyZAjG\njBlT53N+8803Wq+vXLmCy5cvIyAgAFZWVg+dV6dOnVBdXY0ffvhBa+zu3bsfa+d39uzZeOmll3R2\nla2trWFiYvLAox4JCQk4dOgQYmNjtW4Vd6+7d3hITEzUaler1YiJicHgwYNRW1v7SPnX285v+/bt\n8fzzzwO4s5VdWVn5yEk/KzqESHDqWBnkshpUVgiwsBTB3tEUHUIe/d57RERE9PjGjx+P9PR0rF27\nFkVFRejUqROKioqQmpqKoqIiREZG1ul8JiYmuHHjBt577z2EhIRALpdj8+bNEAQB48ePf6S8Ro8e\njbS0NHz00Ue4cuUKPDw8cPHiRfzwww/w9fVFZmbmI+UaEhKCrVu3YsSIERgyZAicnJxQUlKCnTt3\norKyEm+88Ybe9/3xxx9YtmwZmjZtipYtW2Lfvn06Y/z8/NCsWTO89tpr2L17N3bv3o3Kykr06dMH\nSqUS3377Lc6fP4958+b947ni+6m34tfExERzuPrQoUMIDAyEiYkJ9u3bhz179sDOzg4xMTGwtbWt\nr5QanJm5CJ3/JeV9fomIiJ4w9vb22Lp1K1atWoXDhw9jx44dsLKywgsvvIB58+ahc+fOdTqfRCLB\n8uXLsXDhQsTFxUGhUMDT0xNxcXHo0aPHI+Xl6emJxMRELFmyBOvXr4epqSkCAwORkJCAFStWPHLx\nO3DgQEgkEiQnJ2Pt2rVQKBSQSCTw8fHB2rVr0bNnT73vu3LlCmpqanDr1i1MmTJF75gFCxbg5Zdf\nhlgsxoYNG7Bu3Trs27cPhw8fhrm5OXx8fBAfH6+57/GjEAmCUK83lT1x4gTS0tLwn//8B1evXoWN\njQ2ee+457NixA0VFRXjzzTfrMx0iIiIiakTq9YK306dPY/v27fjwww9hbW0NPz8/TV9QUBASEhL+\nMUZeXp4xU9Rwd3evt7meFlwTbVwPXVwTXVwTbVwPXVwTbe7u7g2dAj3j6q34LS8vR0pKCmbNmqV5\nqsjnn3+OiIgIuLq64ty5c2jRokV9pUNEREREuHOxXE2N/mcP3Mvc3Fxzl66nVb0Vv7/++itKS0sR\nFxenaevZsyeWLVsGsVgMS0vLB94TjoiIiIjq3tChQ3Hz5k2Dxnbu3BkbN240ckbGVW/Fb9++fdG3\nb1+d9vsdiiYiIiIi41u6dOl9H4Zxr2fhxgR8whsRERFRIxYQENDQKdQr3leLiIiIiBoNFr9ERERE\n1Giw+CUiIiKiRoPFLxERERE1Gix+iYiIiKjRYPFLRERERI0Gi18iIiIiajR4n18iIiKiZ1zv3r2R\nn58PExPtfc9du3bB09MTWVlZmD9/Pk6dOgUzMzN0794ds2bNgqOjo954MpkM8+fPx4kTJ6BSqdCu\nXTtMmzYNvr6+mjF79uzBV199hWvXrsHZ2RkDBgxAbGwsTE1NDY5hDNz5JSIiIqonNUWFqMz8HTVF\nhfU+9yeffIKzZ89q/fH09ERJSQkiIyPh4+ODn3/+GXv27EFlZSWSk5PvG2vKlCmQyWTYunUrfvzx\nR3To0AFvvvkmiouLAQDHjx/HjBkzMHbsWGRkZGDlypXYtWsXvvjiC4NjGAuLXyIiIiIjq1WVo3Du\nu7g9OQIFM/4Pt6dEoHDuu6hVlTd0atiyZQvs7Ozw7rvvwsbGBq6urli9ejWmTJmid/zly5eRkZGB\nadOmwc3NDRKJBBMnToRIJMKuXbsAACkpKQgNDcWAAQMgFovh7e2NqKgobNy4EbW1tQbFMBYWv0RE\nRERGVvTZf1CR8TNqi/8ChFrUyv5CRcbPKPrsP/WWw/fff4+BAweiY8eOePnll3Hw4EEAQEZGBtq3\nb485c+YgJCQEoaGhmDNnDsrKyvTGOXPmDMzNzdG2bVtNm5mZGXx8fHDmzBkAwOnTp+Hv76/1Pn9/\nf8jlcly7ds2gGMbC4peIiIjIiGqKCqH+87zePvWf5+vlCISXlxdatWqFlJQU/PTTT3jxxRcxceJE\nnD59Grdu3cIPP/wAHx8f/PTTT1i1ahV+/PFHzJ8/X28smUwGOzs7iEQirXZ7e3sUFRVpjfk7BwcH\nTZ8hMYyFxe8TQKlU4ubNm1AqlQ2dChEREdWx6ls3UFss09tXK5eh+vZNo+ewZs0azJw5E46OjpBK\npRg/fjzatWuHrVu3QhAEtG/fHsOHD4eFhQX8/Pzw1ltvYdeuXaiurn6oee4tZh9FXcR4EN7toQGp\n1Wrs37/lu6ysAAAgAElEQVQf+fn5KC8vh7W1NVxdXREWFgaxWNzQ6REREVEdMGvaHCYOjqiV/aXT\nZ2LvCDO3Zg2QFeDh4YH8/Hy4uLhAIpFo9bVo0QJVVVWQyWRwcXHR6mvSpAlKSkogCIJWoSqXy+Hk\n5AQAcHJyglwu13rf3QvZnJ2dDYphLNz5bUD79+9HdnY2ysvvHHYvLy9HdnY29u/f38CZERERUV0x\nbeIMcZv2evvEbdrDtImzUefPzc3Fxx9/DIVCodWelZWFli1bwtvbGxcuXEBNTY2m7/r167C0tISz\ns25ugYGBqKqqwrlz5zRtarUaZ8+eRVBQkGbMvWd3T548CWdnZ3h4eBgUw1hY/DYQpVKJ/Px8vX0F\nBQU8AkFERPQMafL+PFgGh8LE0QkwMYGJoxMsg0PR5P15Rp/byckJ6enp+Pjjj1FcXIzy8nLEx8cj\nOzsbo0aNwqhRoyCTyfD555+jrKwMly5dwpdffonXX39dsys7evRoJCUlAQBat26N0NBQLFq0CPn5\n+VAqlfj8889hYWGB8PBwzfgjR45g7969mqJ2/fr1iI6OhkgkMiiGsfDYQwMpKSnR7Pjeq7y8HAqF\nAlKptJ6zIiIiImMwsbKG8+ylqCkqRPXtmzBza2b0Hd+7rKyssH79enz22WcYMGAAVCoV2rdvj5SU\nFLRq1QoA8NVXX2HhwoXo0qULpFIphg8fjrffflsTIzc3FzLZ/84tL1myBPPmzUN4eDiqqqoQGBiI\n9evXa2qXgIAALF26FCtWrMC0adPg5OSEiIgIxMTEGBzDWESCIAhGnaGO5eXl1cs87u7uRp1LqVQi\nNTVVbwEskUgwYsSIJ674NfaaPG24Hrq4Jrq4Jtq4Hrq4Jtrc3d0bOgV6xvHYQwORSqVwdXXV2+fi\n4vLEFb5EREREzwIWvw0oLCwMnp6ekEgkEIlEkEgk8PT0RFhYWEOnRkRERPRM4pnfBiQWizF48GAo\nlUooFArY2tpyx5eIiIjIiFj8PgGkUimLXiIiIqJ6wGMPRERERNRosPglIiIiokaDxS8RERERNRos\nfomIiIio0WDxS0RERESNBotfIiIiImo0WPwSERERPeP+/PNPjBs3DsHBwfDz88PQoUNx8OBBAEBp\naSlmz56N7t27w8/PD71798a6desgCMJ942VmZiIqKgrBwcHo3r073n33XchkMk1/TU0N4uLiEBYW\nhsDAQAwZMgS7d+9+qBjGwuKXiIiI6BmmUqkwatQoeHh4ID09HSdPnkS/fv0QGxuLK1eu4J133kF2\ndja2bduG06dP4+OPP8bKlSuxdetWvfHkcjnGjBkDX19fHDx4EDt27IBCocDkyZM1Y7744gvs2LED\nS5cuRUZGBiZOnIiZM2ciIyPD4BjGwuKXiIiIqJ4UKivx+w05CpWV9TanSqXC1KlT8c4770AqlUIs\nFmPUqFGoqanB5cuXER4ejnnz5qFp06YwNTXFv/71L7Ru3RoXLlzQG2/Pnj0QBAFTpkyBjY0NnJyc\nMHXqVBw/fhwXL16EIAjYtGkToqOj4ePjA7FYjL59+6JHjx5ITk42KIYx8QlvREREREZWrq7GrD3n\ncf62ArIyNRwlYrR3s8Un4e1hLTZuOebo6Ijhw4drXhcXF2PdunVwc3NDly5d4ODgoOmrqKjAgQMH\nkJOTgw8//FBvvNOnT8PHxwdmZv/L29vbGxYWFjh9+jSsrKwgk8ng7++v9T5/f39s3LjRoBht27at\nk8+uD4tfIiIiIiObtec8fr76l+b1X2Vq/Hz1L8zacx5LXvZ/wDvrlq+vL6qqquDn54fExEStwjcm\nJga//PILXFxcsGTJEnTq1ElvjOLiYtjZ2Wm1iUQi2NnZoaioSHNu994xDg4Omr5/imFMPPZARERE\nZESFykqcv63Q23f+tqJej0BkZmbi6NGj6NGjB0aOHIns7GxNX2JiIk6fPo2ZM2di+vTp2Lt370PH\nF4lEj9Vv6JjHweKXiIiIyIhuyFWQlan19snK1bgpV9VrPo6Ojpg0aRJcXV2Rmpqq1WdlZYWBAwfi\npZdeQkJCgt73N2nSBHK5XKtNEASUlJTA2dkZTk5OAKAzpri4GE2aNDEohjGx+CUiIiIyoub2VnCU\niPX2OVqL0czeyqjzp6eno3fv3qis1N5hVqvVKC8vR+/evXHixAmdPlNTU73xAgMDcf78eVRVVWna\nzp49i8rKSnTo0AHNmzeHs7Mzzpw5o/W+kydPIigoyKAYxsTil4iIiMiInKUWaO9mq7evvZstnKUW\nRp0/MDAQKpUKc+fOhVwuR2VlJZKSknD9+nUMGzYMzZo1w+LFi5GTk4OamhocO3YMe/bsQf/+/QEA\n+fn56N+/P37//XcAQHh4OMzNzbF06VIolUrcvn0bixcvRs+ePdG6dWuIRCKMHj0aiYmJyMzMhFqt\nxp49e/Drr78iKirKoBjGxAveiIiIiIzsk/D2/7vbQ7kajtb/u9uDsTk6OiI5ORmLFi1Cr169YGJi\nglatWiE+Ph4BAQFYsWIF4uLiMGLECKhUKjRt2hQTJkxATEwMAKCqqgrZ2dlQqe4cz7CxsUFiYiLm\nzZuHbt26wcLCAn369NG6O8SYMWNQWVmJCRMmQCaTwdPTE8uXL9fcAcKQGMYiEh70+I4nUF5eXr3M\n4+7uXm9zPS24Jtq4Hrq4Jrq4Jtq4Hrq4Jtrc3d0bOgWjKlRW4qZchWb2Vkbf8SX9uPNLREREVE+c\npRYsehsYz/wSERERUaPB4peIiIiIGg0Wv0RERETUaLD4JSIiIqJGg8UvERERETUaLH6JiIiIqNFg\n8UtEREREjQaLXyIiIiJqNFj8EhEREVGjweKXiIiIiBoNFr9EREREz7g///wT48aNQ3BwMPz8/DB0\n6FAcPHgQAFBdXY34+Hi8+OKLCAgIQFhYGFJSUh4YLzc3F+PGjUPXrl3RpUsXjBs3Drm5uVpjkpKS\nMGjQIAQGBmLgwIHYsGHDQ8cwBha/RERERPWkTFmFWzfKUKasqrc5VSoVRo0aBQ8PD6Snp+PkyZPo\n168fYmNjceXKFSxfvhzffvstVq5ciZMnT+L999/Hp59+ivT0dL3xqqqq8NZbb8HW1hZ79uzB/v37\n4eDggDFjxqCq6s7n2rFjB5YvX45Zs2YhIyMDc+fOxcqVK5GWlmZwDGNh8UtERERkZFXqWuzbeR3b\nN2dh17YcbN+chX07r6NKXWv0uVUqFaZOnYp33nkHUqkUYrEYo0aNQk1NDS5fvgwzMzPMnDkTbdu2\nhampKfr27Ys2bdrg6NGjeuMdOXIEOTk5mDlzJhwdHWFra4vp06cjNzcXP/30EwAgOTkZw4YNQ0hI\nCMRiMYKCgjBs2DAkJSUZHMNYWPwSERERGVn69zeQk6VEeVkNAKC8rAY5WUqkf3/D6HM7Ojpi+PDh\nsLKyAgAUFxdj9erVcHNzQ5cuXTB58mT069dPM16tVqOgoABNmzbVG+/06dPw8PCAg4ODps3e3h4t\nWrTAmTNnoFarcfHiRfj7+2u9z9/fH5cuXYJKpfrHGMZkZtToRERERI1cmbIKhfkqvX2F+SqUKasg\nkZrXSy6+vr6oqqqCn58fEhMTtYpPABAEAR999BEsLS0xYsQIvTGKi4thZ2en0+7g4ICioiLI5XLU\n1NTojHFwcEBtbS3kcvk/xjAm7vwSERERGZFCrtbs+N5LVV4DRUn9nf/NzMzE0aNH0aNHD4wcORLZ\n2dmavoqKCkyZMgUZGRlITEyEVCp96PgikeixxxgS43Gw+CUiIiIyIlt7Mawlpnr7rKxNYWtXP7u+\ndzk6OmLSpElwdXVFamoqAEAmk2HUqFEoKCjA1q1b4enped/3N2nSBHK5XKe9uLgYTk5OsLe3h5mZ\nmc6Y4uJimJmZwcHB4R9jGBOLXyIiIiIjkkjN4exqpbfP2dXK6Ece0tPT0bt3b1RWVmq1q9VqmJqa\nQqlU4s0330SLFi2QlJT0j8VnYGAgcnNztY4n/PXXX7h+/TqCgoIgFovh4+Ojc3b35MmT8PX1hYWF\nxT/GMCYWv0RERERG1mdAc7RsJYW1xBQiEWAtMUXLVlL0GdDc6HMHBgZCpVJh7ty5kMvlqKysRFJS\nEq5fv45+/fph2bJlsLS0xGeffQaxWKw3Rv/+/bFv3z4AQLdu3fD8889j/vz5KC4uhkwmw7x58+Dl\n5YWuXbsCAKKiorB9+3YcPXoUarUav/zyC9LS0hAdHW1wDGPhBW9ERERERmYuNkH/lzxQpqyCoqQK\ntnbm9XaRm6OjI5KTk7Fo0SL06tULJiYmaNWqFeLj4xEQEICRI0dCJBIhMDBQ633u7u7Yv38/ACA7\nOxulpaUAAFNTU6xbtw5z585F7969IRKJ0LVrV6xbtw6mpneOdwwcOBAKhQKzZs3C7du34e7ujg8/\n/BD9+/c3OIaxiARBEIw6Qx3Ly8url3nc3d3rba6nBddEG9dDF9dEF9dEG9dDF9dEm7u7e0OnQM84\nHnsgIiIiokaDxS8RERERNRosfomIiIio0ajXC95SUlJw4cIF1NbWYsiQIWjdujXi4+NRW1sLe3t7\nTJo0Cebm9XuvOyIiIiJqPOqt+M3MzERubi7mz5+P0tJSTJs2DX5+fggLC0OXLl2wefNmHD58WOvZ\n0kREREREdanejj20b98e77zzDgBAIpGgsrIS586d09zIOCgoCH/88Ud9pUNEREREjVC9Fb8mJiaw\ntLQEABw6dAiBgYGorKzUHHOwtbXV+5g7IiIiIqK6Uu8PuThx4gQOHTqE//znP4iNjX3o99fn/f94\nr0FdXBNtXA9dXBNdXBNtXA9dXBOi+lOvxe/p06exfft2fPjhh7C2toalpSXUajXEYjFkMhkcHBz+\nMQYfctFwuCbauB66uCa6uCbauB66uCba+IsAGVu9HXsoLy9HSkoKZsyYAalUCgDw8/PDsWPHAADH\njh1DQEBAfaVDRERERI1Qve38/vrrrygtLUVcXJym7e2338aaNWtw8OBBODk5oUePHvWVDhEREVGj\nsn37dqxbtw43b96Ei4sLIiIiEBUVpTVGrVZj2LBhKCsrw6FDh+4bSyaTYf78+Thx4gRUKhXatWuH\nadOmwdfXVzNmz549+Oqrr3Dt2jU4OztjwIABiI2NhampqcExjKHeit++ffuib9++Ou2zZs2qrxTo\n/6tQ1aJMWQuJ1ASWVnzOCRER0bPuu+++w6JFi7B06VJ06tQJv//+O+bMmYOgoCCtYnPVqlW4desW\nbG1tHxhvypQpMDU1xdatW2FjY4OEhAS8+eab2LdvHxwcHHD8+HHMmDEDn332Gfr06YPs7GyMGzcO\n5ubmmDhxokExjIWVTyNSXSXg+H+V+PlAKX49dOefx/+rRHWV0NCpERERNQoKhQLZ2dlQKBT1Ou+q\nVaswZswYdOvWDWKxGMHBwfj++++1Ct/MzExs3rxZZzf4XpcvX0ZGRgamTZsGNzc3SCQSTJw4ESKR\nCLt27QJw58FmoaGhGDBgAMRiMby9vREVFYWNGzeitrbWoBjGUu93e6CGc+pYGfLzqjWvKysE5OdV\n49SxMnT+l7QBMyMiInq2VVZWIjU1FTdu3IBSqYRUKkXz5s3x2muvwcLCwqhzFxQU4OrVq7C2tsbr\nr7+OS5cuoVmzZhg7diwGDx4M4M5xh5kzZ2LKlCmwsrJ6YLwzZ87A3Nwcbdu21bSZmZnBx8cHZ86c\nAXDnJgcjR47Uep+/vz/kcjmuXbtmUAxj4c5vI1GhqoVcVqO3Ty6rQYWqtp4zIiIiajxSU1Nx4cIF\nlJaWQhAElJaW4sKFC0hNTTX63Ldv3wYAbNmyBXPmzMGRI0cwfPhwTJ06Fb/99huAOzvDDg4OOgWr\nPjKZDHZ2dhCJRFrt9vb2KCoq0hrzd3ePMshkMoNiGAt3fhuJMmUtKiv0H2+orBBQpqzl+V8iIiIj\nUCgUuHHjht6+GzduQKFQ/OMZ28chCHf+/x8REQFvb28AQGRkJHbu3Int27fDwsICmzZtQlpamk4x\n+rAe9/11FeNBWO00EhKpCSws7/wwVdeUo0Kdj+qacgCAhaUIEil/FIiIiIyhqKgISqVSb59SqYRM\nJjPq/C4uLgCgcxGZh4cHcnNzNccdWrRoYVC8Jk2aoKSkRFNU3yWXy+Hk5AQAcHJy0nlyb3FxMQDA\n2dnZoBjGwoqnkbC0MoGNXS1uyw/hpmwPbhXvx03Zd7gtPwQbO+76EhERGUuTJk00zzi4l1QqhaOj\no1Hnd3Fxgb29Pc6ePavVnpOTAwD4888/sXLlSgQHByM4OBiffPIJbt26heDgYJw8eVInXmBgIKqq\nqnDu3DlNm1qtxtmzZxEUFKQZc+/Z3ZMnT8LZ2RkeHh4GxTAWVjyNSGHJEagqb6C2tgIAUFurgqry\nBgoVRxo4MyIiomeXra0tmjdvrrevefPmRj3yAACmpqaIjo5GSkoKfv31V6jVamzatAkXLlzA1KlT\n8dNPP2Hnzp2aP5MnT4aLiwt27twJPz8/AMDo0aORlJQEAGjdujVCQ0OxaNEi5OfnQ6lU4vPPP4eF\nhQXCw8M1448cOYK9e/dqitr169cjOjoaIpHIoBjGwjO/jYRSqURBYb7evsLCAs2Vp0RERFT3Xnvt\ntfve7aE+/N///R+qq6sxc+ZMFBUVwdPTEwkJCXjhhRd0xtra2sLU1BRubm6attzcXK3jGUuWLMG8\nefMQHh6OqqoqBAYGYv369ZpaIiAgAEuXLsWKFSswbdo0ODk5ISIiAjExMQbHMBaRcO9hiydcfT3/\n/Fl71vrNmzfx7bff6u0TiUQYNmzYPz5P/Vlbk8fF9dDFNdHFNdHG9dDFNdH2T/8vetopFArIZDI4\nOjoafceX9OPObyNhZ2cHa2trlJeX6/RZW1vzP0AiIqJ6YGtry//nNjCe+W0kpFIpXF1d9fa5uLjw\nyAMRERE1Cix+G5GwsDB4enpCIpFAJBJBIpHA09MTYWFhDZ0aERERUb3gsYdGRCwWY/DgwVAqlZob\nanPHl4iIiBoTFr+NkFQqZdFLREREjRKPPRARERFRo8Hil4iIiIgaDRa/RERERNRosPglIiIiokaD\nxS8RERERNRosfomIiIio0WDxS0RERPSM+/PPPzFu3DgEBwfDz88PQ4cOxcGDBzX9SUlJGDRoEAID\nAzFw4EBs2LDhgfFkMhnee+89hIaGolOnToiMjERmZqbWmD179mDo0KEIDAxEv379EBcXh5qamoeK\nYQwsfomIiIjqiVBZDKHkEoTK4nqbU6VSYdSoUfDw8EB6ejpOnjyJfv36ITY2FleuXMGOHTuwfPly\nzJo1CxkZGZg7dy5WrlyJtLS0+8acMmUKZDIZtm7dih9//BEdOnTAm2++ieLiO5/r+PHjmDFjBsaO\nHYuMjAysXLkSu3btwhdffGFwDGNh8UtERERkZEJNBaozl6Hm949Qc2YBan7/CNWZyyDUVBh9bpVK\nhalTp+Kdd96BVCqFWCzGqFGjUFNTg8uXLyM5ORnDhg1DSEgIxGIxgoKCMGzYMCQlJemNd/nyZWRk\nZGDatGlwc3ODRCLBxIkTIRKJsGvXLgBASkoKQkNDMWDAAIjFYnh7eyMqKgobN25EbW2tQTGMhcUv\nERERkZHVXFgDyH4H1CUAhDv/lP1+p93IHB0dMXz4cFhZWQEAiouLsXr1ari5uaFz5864ePEi/P39\ntd7j7++PS5cuQaVS6cQ7c+YMzM3N0bZtW02bmZkZfHx8cObMGQDA6dOn9caUy+W4du2aQTGMhY83\nJiIiIjIiobIYUGbp71RmQ6gshsjCoV5y8fX1RVVVFfz8/JCYmIja2lrU1NTAzs5Oa5yDgwNqa2sh\nl8s1RfNdMpkMdnZ2EIlEWu329vb466+/tMbcG/NunyExjIU7v0RERETGVFEAqBX6+9QKoKKw3lLJ\nzMzE0aNH0aNHD4wcORLXrl174Ph7i9N/8rDjjRXjQVj8EhERERmTpQsgttXfJ7YFLJ3rNR1HR0dM\nmjQJrq6uSE9Ph5mZGeRyudaY4uJimJmZaXZr/65JkyYoKSmBIAha7XK5HE5OTgAAJycnvTEBwNnZ\n2aAYxmJw8fv3Mx+VlZU4efIk8vLyjJIUERER0bNCZOEASFvp75R6Gv3IQ3p6Onr37o3KykqtdrVa\nDVNTU73nbE+ePAlfX19YWFjoxAsMDERVVRXOnTunFevs2bMICgrSjNEX09nZGR4eHgbFMBaDit+T\nJ09i/PjxAIDq6mp88MEHiIuLw9SpU3Hs2DGjJkhERET0tDNtNw5wDATE9gBM7vzTMfBOu5EFBgZC\npVJh7ty5kMvlqKysRFJSEq5fv45+/fohKioK27dvx9GjR6FWq/HLL78gLS0N0dHRmhijR4/W3P2h\ndevWCA0NxaJFi5Cfnw+lUonPP/8cFhYWCA8P14w/cuQI9u7dqylq169fj+joaIhEIoNiGItBF7xt\n27YNUVFRAIBjx46hvLwc69atw+XLl5GamoqQkBBj5khERET0VBOZWsLMd8qdi98qCgFL53q7yM3R\n0RHJyclYtGgRevXqBRMTE7Rq1Qrx8fEICAhAQEAAFAoFZs2ahdu3b8Pd3R0ffvgh+vfvr4mRm5sL\nmUymeb1kyRLMmzcP4eHhqKqqQmBgINavXw+pVAoACAgIwNKlS7FixQpMmzYNTk5OiIiIQExMjMEx\njEUk3HvYQo/Ro0dj/fr1MDExwYoVK2Bvb4/IyEgIgoDo6Oh/fApIXaqvoxbu7u481nEProk2rocu\nrokurok2rocurok2d3f3hk6BnnEGHXswMzNDTU0Namtrce7cObzwwgsAgKqqKp2DykRERERETyqD\njj20adMGiYmJMDU1RW1tLXx8fAAABw8eRIsWLYyaIBERERFRXTFo5zc6OhoFBQW4evUqJk6cCDMz\nMygUCmzZsgVvvPGGsXMkIiIiIqoTBu38urq6YtasWVpttra2WLt2LSwtLY2SGBERERFRXTNo57ei\nogJbt27VvD58+DBmzJiBhIQEKJVKoyVHRERERFSXDCp+N2zYgLNnzwIAbt68iXXr1sHf3x9lZWVI\nTk42aoJERERERHXFoGMPp06dwsKFCwEAv/zyC/z9/TFy5EiUlpbi/fffN2qCRERERER1xaCdX5VK\nBUdHRwDA2bNn0bFjRwCAjY0NysrKjJcdEREREVEdMqj4dXR0xPXr13H79m1cuXIFAQEBAO48cEIi\nkRg1QSIiIiKiumLQsYd+/frhww8/BAB06tQJLi4uKC8vR1xcHB9tTERERERPDYOK30GDBqF169Yo\nLy+Hv78/AMDCwgLBwcEYMmSIURMkIiIiIqorBhW/ANC2bVsolUpcv34dAODm5oZXXnnFaIkRERER\nEdU1g4rfsrIyrFq1CqdOnYIgCAAAExMTdO3aFePGjYO5ublRkyQiIiIiqgsGFb9JSUkoLCxEbGws\nmjdvDkEQcP36daSlpWHbtm0YOXKksfMkIiIiInpsBhW/v//+O+bPnw8XFxdNW8uWLdG6dWssXLiQ\nxS8RERERPRUMutWZWq1GkyZNdNrd3NxQUlJS50kRERERERmDQcWvm5sbfvvtN53248ePa+0GExER\nERE9yQw69jBkyBAsW7YMHTt2RPPmzQEAOTk5+P333zFu3DijJkhEREREVFcMKn67dOkCqVSKffv2\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nIk7tfwDN6aMzrcrivgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "split_df_and_plot(df, 'learning_rate', learning_rates)\n", "split_df_and_plot(df, 'embed_size', embed_sizes)\n", "split_df_and_plot(df, 'state_size', state_sizes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Plots with Fixed Learning Rate" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9oAAALICAYAAACAfohjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtcVVX+//EXh4uihAqKxHjXpMnUDDMd84ZyM0zzls2k\n5qXCO2UqgtfRUDDS8EZO/dJQMxsdmyEhrcx0pkYtR79lo+Yt0EQUEQ4gt3N+f/jgjAiKyFGO9H4+\nHj4G9l5nrfXZzMznfM5eZ207s9lsRkRERERERESswlDVExARERERERGpTlRoi4iIiIiIiFiRCm0R\nERERERERK1KhLSIiIiIiImJFKrRFRERERERErEiFtoiIiIiIiIgVqdCWKuft7c3HH39cpXOYNWsW\nI0eOrNI5iIiI7VKuEhGRilChLQIsXLiQdevWVfU0ynXs2DF27Nhxz8dNTk4mJCSEP/zhD3Tp0oWQ\nkBCSk5Nv+ZqCggJiY2Np06YNy5cvL3X++++/Z+TIkXTq1IknnniCmTNnkp2dfbdCEBG57ylX3dqd\n5KoNGzbQt29fOnTogK+vL7GxsZhMpkr1KSICKrRF7itbt269529eCgoKeOmll3B1dSUhIYHPPvuM\nevXqMXbsWAoKCsp8zaVLlxgyZAgnTpzggQceKHU+OTmZMWPG0KZNG7766is+/fRT0tLSmDVr1t0O\nR0RE7rL7JVdt2rSJpUuXMm/ePA4cOMCSJUtYu3Yt8fHxd9yniEgxFdpiczZs2EC/fv147LHH6N69\nO0uWLKGwsNByfvfu3QwePBgfHx86d+7Mq6++Snp6uuW8t7c3a9euJSAggBdffNFy7B//+AeTJ0/G\nx8eHp556iri4OMtrwsLCeP755wH497//jbe3N//5z38YOnQojz32GAEBAezevdvS/syZM7zwwgu0\na9cOPz8/kpKSePrpp8u8c1uWlJQUvL29+eijj+jZsyfh4eEAHDp0iOHDh1vu8r700kuWT86nTp3K\n2rVr+fTTT2nbti0XL168ret1vW3bttG2bdsy/wUEBJT5mr1793LmzBlmzpyJm5sbrq6uzJgxg+Tk\n5BLX5HoZGRmMGDGCt99+Gycnp1Lnv/76a0wmE1OnTqVWrVp4eHgQERFBUlISaWlpt3UNRUSqknLV\n/Z+r8vPzmTZtGp06dcLe3t7yt/r222/vuE8REQuzSBVr3bq1efPmzWaz2Wz++OOPzZ06dTLv37/f\nXFRUZP7pp5/MPXv2NC9fvtxsNpvNqamp5jZt2pjXr19vLioqMl+4cMEcHBxsnj59eon+nn76afPx\n48fNJpPJcszf39+8f/9+c2Fhofmjjz4yt27d2nz06FGz2Ww2z5gxwzxs2DCz2Ww2f/vtt+bWrVub\nR48ebf7ll1/MeXl55hkzZpg7d+5s6e+FF14wDx061JyWlma+dOmSeezYseYOHTqYY2Njbyvm5ORk\nc+vWrc3PP/+8+ddffzWbTCZzXl6euVOnTuYlS5aYCwoKzJmZmeZRo0aZ//SnP1le98ILL5inTp1q\n+b2862UNb731ltnf37/UcX9/f/Obb75Z7uu7detW6rps2LDB3K5dO3NBQYHl2OXLl82tW7c279q1\nq9JzFhGxNuWq6p2rzGaz2WQymZ955hnz/PnzrdaniPx26Y622JT169fz3HPP0bFjRwwGAw8//DCj\nR4+2bEDj4eHBnj17GDZsGAaDgQYNGtCtWzcOHTpUop+nnnqKVq1aYWdnZznWu3dvOnbsiL29Pf36\n9QPg6NGjN53LiBEjaNy4MU5OTgQFBZGens6FCxe4ePEi+/btY+zYsdSvXx83NzfCw8Pv6PvFQUFB\neHp6Ymdnh5OTEzt37mTy5Mk4ODjwwAMP0Lt371KxVeR6WcPly5epU6dOqeP16tXj0qVLd9Rn9+7d\nsbOz480338RoNJKenk50dDROTk5cvny5slMWEbmrlKuqZ65auXIl586dY/To0VbrU0R+uxyqegIi\n1zt58iTHjx/n/ffftxwzm83AtSVeTk5OfPLJJ2zevJlz585RVFREUVERnp6eJfpp3Lhxqb6bNm1q\n+dnZ2RmAq1ev3nQuTZo0sfxcs2ZNS/usrKxSYzRv3py6devedpxljQHw1Vdf8f7773P69GkKCwsx\nmUw3XVoHt3e97qbr3xxWRKNGjYiLiyMmJoYePXrw4IMPEhISwq5du3Bw0P8tiYhtU66qXrmqqKiI\nxYsX8/e//501a9bQqFGjSvcpIqJ3tGJTatasyfjx4y3fV7vR3/72N6Kjo4mKisLf358aNWoQExPD\np59+WqJdWUnbYKjYAo6btS/ejdTR0bFC/ZXl+j7+/e9/M336dGbMmMHQoUOpXbs2mzZtYu7cuTd9\nfXnX60bbtm1j9uzZZZ7z8vLis88+K3Xc3d2djIyMUscvX75M/fr1b2vcsnTu3LnE3Yzs7Gxef/11\n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\n+Pr68uOPPzJs2DAAXFxcWLZsWYUL+nILbYPBwKVLl9i5c6dljXxubi5FRUUVGuh6np6e/Pzzz3Tu\n3Jm0tDRq1qx5yzcuIiIit6JcJSIi1UUtJwdiBrYjzZjH2YxcflfX2Wp3sovVrVuXVatWlXluw4YN\nlp8ff/xxpk2bZvm9uJAGSm1ktmTJknLH7d+/v+WRWtcrfoRX//79iYyMLPO1HTp04K9//Wup47fa\ndTw0NNSy0duNjh49etN5Tpo0iUmTJt30/O0ot9AePHgwM2bMoE6dOsyYMQO4dlH79Olzx4P6+fmx\natUq5s6di8lk4qWXXrrjvkRERJSrRESkumngUsPqBbbcO+UW2l26dKFLly4ljk2ZMqVSu68W7zAn\nIiJiDcpVIiIiYkvKXQN35MgRPvjgA8vPISEhTJ8+ncOHD9/1yYmIiNwO5SoRERGxJeUW2u+//z5P\nPvkk8L+dXGfNmlVi7b6IiEhVUq4SERERW1Ilu46LiIhYk3KViIiI2JJy72jfjZ1cRURErEm5SkRE\nRGxJlew6LiIiYk3KVSIiImJL7mjX8cmTJ+Pq6nrXJiUiIlIRylUiIiJiS8ottPPz80lISODw4cNc\nuXKFunXr8vjjjxMUFISDQ7kvFxERueuUq0RERKxj8+bNDB06tNx227dvp3v37ri4uFR6zOnTpxMY\nGIivr2+l+7peWFgYe/fuLTHH6Oho2rVrB8C2bduYP38+8+bNo3///pY2X3zxBbGxseTn51O3bl3m\nz59P69atKzR2ue8+3n33XbKzswkODqZ27dpkZWXx5ZdfkpqaytixYys0mIiIyN2gXCUiItVNtrGA\nzIx8XOs6UdvF8Z6MWVRURHR09G0V2rGxsTz++ONWKbSjo6Mr3cfNvPbaawwcOLDU8TVr1vD999/T\nvHnzEsdTU1MJCwvjww8/pFWrVmzYsIE5c+awadOmCo1bbqF9/Phx3nrrLezs7CzHfHx8eP311ys0\nkIiIyN2iXCUiItVFQb6JLxJTSEvNJSe7iFq17WnQ0JneQY1wdCp3L+vbUlhYyNy5czlw4AAmkwlv\nb28WL17M+PHjycrKIjAwkL/85S8UFBQQERFBRkYGhYWFTJkyheDgYGbOnMmpU6cYPnw4ixYtonXr\n1ixYsIDDhw9TWFjI+PHjGTRoUKlx9+3bx6JFi8jLy8NsNjN58mSCgoIYPnw4gwcPpkaNGixbtszS\n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\nuEiO7TAwuXjzuypD0cGzPfieTtxrkikkHJRgSx1Vq4n2Bx98QFBQUG1WQeSS4g09kp6oo7f0FnvD\nAxBRrBK5mDzVQ15TPNEj6+mh6OD5HnxPJu4il6paS7RPnz7NqVOn6NSpatPvi4icT+neYktREfY6\n3FvsDQ9ALlWKVSJSEzw5FL00T/XgezpxF7kU1do62vPnz+ehhx7iq6++IioqSsPxRKRmaA1KqQbF\nKhGpSWePJHL2l1SiW0cQHVdH1m4WEY+olR7trVu3EhcXR1RUVKU/k5iYWK1zlixAXx+oLXVXfWqP\n2lI3eXtbYmK854tkbcSq3/P2+11C7ahb6kM76kMbAGLiYnAEgQPP//64mOrN/fhvO7wpVkndVSuJ\n9p49e0hOTmbPnj2kpaXh6+tLWFgYHTp0qI3qiIiIlKNYJSIiIlVVK4n21KlTnX9///33iYqK0hcX\nERGpUxSrREREpKo0q4GIiIiIiIiIB9Xq8l4AI0eOrO0qiIiInJdilYiIiLhDPdoiIiIiIiIiHqRE\nW0RERERERMSDlGiLiIiIiIiIeJASbREREREREREPUqItIiIiIiIi4kFKtEVEREREREQ8SIm2iIiI\niIiIiAcp0RYRERERERHxICXaIiIiIiIiIh6kRFtERERERETEg5Roi4iIiIiIiHiQEm0RERERERER\nD1KiLSIiIiIiIuJBSrRFREREREREPEiJtoiIiIiIiIgHKdEWERERERER8SCf2jhpYWEhK1asICsr\nC5vNxvDhw+nSpUttVEVERMQlxSoRERGpqlpJtL/77jtat27N7bffTkpKCs8//7y+vIiISJ2iWCUi\nIiJVVSuJ9o033uj8e1paGmFhYbVRDRERkQopVomIiEhVmQzDMGrr5LNmzSItLY1p06YRGxtbW9UQ\nERGpkGKViIiIuKtWE22AX3/9leXLl7No0SJMJlNtVkVERMQlxSoRERFxR63MOn7s2DFSU1MBaNmy\nJXa7nXPnztVGVURERFxSrBIREZGqqpVE+8cff2TDhg0AZGZmUlBQQKNGjWqjKiIiIi4pVomIiEhV\n1crQcavVysqVK0lLS8NqtTJixAi6du16sashIiJSIcUqERERqapaf0dbREREREREpD6plaHjIiIi\nIiIiIvWVEm0RERERERERD/Kp7QpcDG+++SY///wzJpOJBx98kDZt2tR2lc7r4MGDvPTSSzRv3hyA\nFi1acNttt7F8+XIcDgchISFMmjQJX19ftm3bxsaNGzGZTPTv35++ffvWcu1/c/LkSRYtWsStt95K\nfHw8qamplW5DUVERr776KikpKZjNZiZOnEiTJk3qTFtWrFjBsWPHnBMj3XbbbXTu3Nkr2rJmzRoO\nHTqEw+Fg2LBhtG7d2mvvy+/bsnv3bq+8L4WFhaxYsYKsrCxsNhvDhw8nNjbWa++LeIY3xS5vj1v1\nJV7Vl1hVH+JUfYhP9SU2uWrHzp07ve5+iBcy6rmDBw8a8+fPNwzDMBISEowZM2bUco0u7IcffjBe\nfPHFMttWrFhh/N///Z9hGIbxzjvvGJ9++qmRn59vTJ482cjNzTUKCwuNJ554wsjOzq6NKpeTn59v\nPPvss8aqVauMTZs2GYbhXhu+/PJLY/Xq1YZhGMb3339vvPTSS3WqLcuXLzd2795d7ri63pYDBw4Y\n8+bNMwzDMM6dO2eMHz/ea++Lq7Z46335+uuvjXXr1hmGYRjJycnG5MmTvfa+iGd4W+zy5rhVX+JV\nfYlV9SFO1Zf4VF9ik6t2eOP9EO9T74eOHzhwgOuuuw6Ayy67jNzcXPLy8mq5Vu47ePCgc7bbrl27\nsn//fo4ePUrr1q0JDAzEz8+Ptm3b8tNPP9VyTYv5+voyffp0QkNDndvcacMPP/xAt27dAGjfvj2H\nDx+ulXaA67a44g1tufrqq5k6dSoADRs2pLCw0Gvvi6u2OByOcsd5Q1tuvPFGbr/9dgDS0tIICwvz\n2vsinlEfYpe3xK36Eq/qS6yqD3GqvsSn+hKbXLXDlbreDvE+9X7oeGZmJq1atXL+HBwcTGZmJoGB\ngbVYqws7deoUCxYsICcnh7vuuovCwkJ8fX2B39qQmZlJcHCw8zMl2+sCi8WCxWIps82dNpTebjab\nMZlMFBUV4eNz8f/JumoLwObNm9mwYQONGzdmzJgxXtEWs9mMv78/AF988QWdOnVi3759XnlfXLXF\nbDZ75X0pMWvWLNLS0pg2bRpz5871yvsinuGNsctb41Z9iVf1JVbVhzhV3+JTfYlNpduxYcMGr70f\n4j0uuX8hhhesZta0aVPuuusuunfvTlJSEs899xx2u722q1Wr6tp969WrF40aNaJly5asW7eOtWvX\n0rZt20p9ti60ZdeuXXzxxRfMmjWLyZMnV7mcutaWX375xavvy/PPP8+vv/7KsmXLqlWfutAW8ay6\nfk8Vt35Tl+6VN8eq+hCn6kt8qi+xqXQ7HnjgAa+9H+I96v3Q8dDQ0DJPyzMyMi44rKq2hYWFceON\nN2IymYiOjiYkJITc3FysVisA6enphIaGlmtbyfa6yt/fv9JtKL29qKgIwzDq1JPD9u3b07JlS6B4\n6NTJkye9pi3ff/89H374ITNmzCAwMNCr78vv2+Kt9+XYsWOkpqYC0LJlS+x2OwEBAV57X6T6vC12\n1be45c2/F0vz1t+J9SFO1Yf4VF9ik6t2tGjRwuvuh3ifep9od+zYkZ07dwLF/6OFhoYSEBBQy7U6\nv23btvHRRx8BxcMHs7Ky6N27t7MdO3fu5Nprr+WKK67gl19+ITc3l4KCAg4fPsxVV11Vm1U/r/bt\n21e6DaXv23fffUe7du1qs+rlvPjiiyQlJQHF7/I1b97cK9qSl5fHmjVrmDZtGkFBQYD33hdXbfHW\n+/Ljjz+yYcMGoPj/+YKCAq+9L+IZ3ha76lvcqi///3nj78T6EKfqS3yqL7HJVTtef/11r7sf4n1M\nxiUw/uGdd97h0KFDmEwmHnroIecTrLoqPz+fV155hby8PIqKihgxYgSXX345y5cvx2azERERwcSJ\nE/Hx8WHnzp189NFHmEwm4uPj6dmzZ21XHyj+Yvi3v/2NlJQULBYLYWFhTJ48mRUrVlSqDQ6Hg1Wr\nVnHmzBl8fX2ZOHEiERERdaYt8fHxrF+/Hj8/P/z9/Zk4cSKNGzeu8235/PPPWbt2LU2bNnVue/TR\nR1m1apXX3RdXbenduzeffvqp190Xq9XKypUrSUtLw2q1MmLECOdyNt52X8RzvCl2eXPcqi/xqr7E\nqvoQp+pLfKovsclVO/z9/XnnnXe86n6I97kkEm0RERERERGRi6XeDx0XERERERERuZiUaIuIiIiI\niIh4kBJtEREREREREQ9Soi0iIiIiIiLiQUq0RURERERERDxIq62L/I5hGGzatIkvv/ySoqIiioqK\niImJ4Q9/+AOtWrUCipcamTRpEldeeWWF5axYsYLo6GiGDx9e6XMfPHiQVatWsWzZsnL7jh07xpo1\na0hPT8cwDIKCghg1apSzDp9//jn9+/d3s7UiIuKNFKtEROo2Jdoiv/P3v/+dgwcPMmPGDEJDQ3E4\nHPz73/9m7ty5vPLKKwQHB1/0OhmGwYIFC3jkkUfo3LkzAN988w0LFy5k5cqV5Ofn89FHH+nLi4jI\n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\nixcTHBxMnz59zvsemye98MIL5OTk0LNnT+6//37uuecegoKCqvXO8sCBA7njjju4//776d+/PwkJ\nCbz66qu0adOGIUOGcOLECUaOHMnRo0e5+eabOXLkyAWvlydYLBZef/118vPz6du3L/3796eoqIjX\nX3/dORlMdnY2x48fd75zd+211/LSSy/x6quv0rlzZyZNmsSoUaMYM2aMs9zZs2czcOBAxo0bx3XX\nXcc333zD3/72N2cvjIhIXaVY5f2xys/Pj+jo6DJ/goODsVgsREdH4+fnx7/+9S/y8vJ47LHHyi0z\ntm7dOo/VXUTqJ5NR8s1YRNxSegIXm81Gp06deO655xg+fHgt10xERKSYYpWISO1Qj7ZIFYwfP57R\no0eTnp5OYWEhy5cvx8fHh5tuuqm2qyYiIgIoVomI1KaL0qN98uRJFi1axK233kp8fDypqaksX74c\nh8NBSEgIkyZN8sismCIXS1JSEv/7v//Lrl27sNvttG7dmqlTp9K9e3fGjRvHzp07z/v577//Xmtw\nitQhilNSHylWiYjUnhpPtAsKCliwYAHR0dHExsYSHx/Pq6++SqdOnejevTvvvvsuERERDBw4sCar\nISIi4pLilIiIiHhajQ8d9/X1Zfr06YSGhjq3HTx40Dl7Y9euXdm/f39NV0NERMQlxSkRERHxtBpf\nR9tisZQbdlRYWOgcghccHFztNR1FRESqSnFKREREPK3GE21PKVmb0VNiYmI8XmZtUDvqFrWjbqkP\n7agPbYDf2hETE1PbValRilWuqR11R31oA6gddU19a0d9j1VycdTKrOP+/v5YrVYA0tPTywzXExER\nqW2KUyIiIlIdtZJot2/f3jnT5c6dO7n22mtroxoiIiIuKU6JiIhIddT40PFjx47xt7/9jZSUFCwW\nCzt37mTy5MmsWLGCzz//nIiICG6++eaaroaIiIhLilMiIiLiaTWeaLdq1Ypnn3223PbZs2fX9KlF\nREQuSHFKREREPK1Who6LiIiIiIiIlHj11VcZMGBAbVfDY5Roi4iIiIiI1HMrV67E4XBU+vjdu3ez\nY8eOGqxRWRMnTmTLli0X7Xw1TYm2iIiIiIhIPXb48GGWLFniVqL91ltvOScGFfcp0RYREREREakH\nPvnkE4YOHUqnTp3o1q0bjz32GB999BF33nknAJ06deIvf/kLAFu3bmXEiBF06dKFG264galTp5Ke\n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\nS4bjRx3vPH7U6R7jvOBIkst4xzk5vDV5Nb1w9l9HVyayqQVBYMpxvNNkJrUg0KlEOz+qBclhpWds\nB0gOa01+PefjrWxqqy4vr95D9DV5O1xH21nZ1jwSDMcPmOKNArKtuZT/XxQI8o3A36sWeda0Uvv8\nvYIJ8nV+9MDuM2tLDEXPs6ZxNnM/u8+srdBQ9MpK3EVEpHor8xvDX//610o7aUBAANOmTau08kWq\nquK1ti9c/quYfa1tN+t0aw327c4mNdlKQb6Br5+J0HAvOnSt4XRZLh8qn3C+aAkuHAxFz0grWufb\niUQ7zVITw5TtcJ9h8iHNUsOpxNPViWxobS8oq+fWZHL6wUyapSaGuYx4zc7HezWorbo8w+xHRtRI\nzJYMAgtTKPAJI6+CS3plF5x3+L43QC42sgsT8OXGcpcX4BNKWGDjEolxsbDAxk73HFfGUHRXJ+4i\nInJtcP+3dhEp4XJrbTvD5UO9AW8fE126B5GXayM7y0aNILPzPdn/4+qh8oafH3l+tdjZ2dFQ9NkE\nOPlOdVE9yk5kneXqRLZSHsy4MF7xLDbv4CteMzsgsCmBeJFD6QdGAXgREFB66b/L6Xpd7AU9xhn4\newXbe4yd5eqh6JX5DrmIiFRvSrRFPIx/gJnowSFlrrXtbFkuHep9UdlX8nlw/VB5U35+UZLtaHKw\nzn8luiDXufpVwoMKVyeynv5gRqoXf/8G1PYJ41RhYql9tX3C8Pdv4HSZPl7+dG/wNHl5p8jNPUZA\nQJMKlQOuH4peGe+Qi4jIteHKviWLSKUJCfWmcXO/Kx4u3unWGtSN8sbXryiR8/UzUTfKm063Oj/U\n29WKe2QdqUiPbLpfJAW+jhPMAt9apPs6N8t68YMKRyryoKI4kXWkools8YOZ7tFB3NQhgO7RQUQP\nDqnQQxBXxyvVU+cmc2jgU4dAvDABgXjRwKcOnZuUXp6uPEy2fILPvknImdcJSvyYkDOvE3z2TUw2\nB0M1LqN4KLojFRmKXpy4O1LRd8hFRDzde++9V67jtmzZQlZW6VUtKmLq1Kl8+eWXLinrQpmZmUyZ\nMoWYmBj69+/PihUr7PsOHjzIsGHDiImJ4b777mP79u32fZ988gmDBg2if//+TJgwgczMTKfPre4J\nkWrOlUO9K4Mre2QvPTmYidSCGk7Pwu3Kd9Irc4RBSKi3S97hd2W8Uj15e9eiW4sX/9cDfZyAgMYV\n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\nXho2LuKB1FaJiIi7WJMTsZw7jXe96/EKr3N1zmm1snjx4nIl2i+99BIdOnRwSaK9ePHiKy7DkRdf\nfBEfHx+2bNlCTk4OgwcPplOnTtx2W9EEXW+88QbXX399qc9NmzaNHj16MHr0aHbv3s2GDRucTrTd\n8s3+xIkTrF27FoADBw7QuHHjq/J+toi7dehag7pR3vj5F80w7udvom6UNx261nBzzUTkYmqrRETE\nHWy5OST+9WnOTxpBwrTHOT95BIl/fRpbbo7LzmGxWJg5cyb9+/enX79+PPXUU2RlZTF69GgyMzOJ\niYkhLi6OY8eO8eCDDzJgwAD69evH5s2bAZg+fTrHjx9nxIgR7N27l4yMDJ599ln69+9Pnz59+M9/\n/uPwvN999x333nsvd955JwMGDGDr1q0AjBgxgg8//JBPP/2UmJgY+39t2rSxT0b6/fffM2TIEPr1\n68fw4cOJi4sDinqfBw0a5PB8/fr1Y+LEiZjNZoKCgrjhhhv49ddfL3ltzp07x+HDh+2Tknbt2pWV\nK1c6fY3d9o62YRhMnz4dX19fJkyY4I5qiFx13j4munQP0jraIlWA2ioREXGH5CWzyPv2G/vPtpQk\n8r79huQls6jzlxddco6dO3dy+vRp+1DplStXsn//fhYsWEB0dLR9+/jx4+nVqxfjxo1jz549jB07\nlv79+7Nw4UI2btzIW2+9RWRkJDNmzMBsNrN161bS0tK47777aNOmDS1atChx3kWLFjF9+nS6dOnC\niRMnWLVqFQMGDLDvL06wAfbs2cO0adO4++67ycrK4oknnmD58uXcdtttbN68mUmTJrFx40bq1q1r\nfwBwsW7dutn/nJWVxf79+xkzZox92+LFizl+/Di+vr7ExsbSp08ffvnlF66//nqWLVvGV199RZ06\ndZgxYwatWrVy6hq7JdE2m808+eST7ji1iEfwD1CCLeLp1FaJiMjVZk1OpODXnxzuK/j1J6zJiS4Z\nRh4WFsbvv//O559/zu23387kyZMBOH36dInj1q5di2EUzS/UsWNH8vPzSUxMLPUe+1dffcWrr76K\n2WwmLCyMfv368dlnn5VKtMPDw9m0aRPh4eE0bdqUZcuWOaxfeno6zz33HEuWLKFWrVps376dunXr\n2od8Dxo0iOeff77c878UFBTwzDPP0Lt3b9q3bw/AnXfeSffu3bnlllvYu3cv48aN44MPPiAjI4Oj\n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\nLZ17s0REJCCUq0REgp9GtEXaqa+v7zDdrr6+nmeffRaAxsZG7rrrLqZOnerZf+DAAUaNGuUZFbj9\n9tvZsmWL54vC2LFjPee74YYbKC4u5u677yYnJ8dzjpEjR3q+jPhisVhYtmwZBQUFbNu2jfz8fPr3\n788DDzzADTfc0OHYsrIyampqmDRpEgBXX3018fHxHDlyBID+/fszfPhwT5s+/PBD/98oEREJGOUq\nEZHgp0JbpJ34+HjOnDnj+blnz57k5uYCkJ+fj9Pp7HB8bW0tPXv29Pxss9mA1ulzbedrv6++vh6A\nwsJCtm/fjsPhwO12YxjGBdtms9m4//77uf/++6murmbXrl3k5uZ2+CIErV+4nE4nCxcu9GxzOBzU\n1dUBEBcX1yG+tu0iIhIalKtERIKfCm2RdoYPH05NTQ1Hjx5l8ODBFzw+ISGB4uJiz891dXVYLBZ6\n9erl+bn9vp49e1JVVcWmTZtYtWoVgwYN4rvvvmP+/PnnfR273U5FRYVn1dbExESmTZvGnj17OHHi\nhOf1AJKSkrDZbJ4vXe3t2rWL2traDm1q/2VGRESCn3KViEjw0z3aIu3ExsYyffp0NmzYwKlTpwBw\nu9188skn7NmzxzPtrk1GRgaHDh3i9OnTAHzwwQeMGTOGyMhIAP79739TV1eH2+1m3759jBw5ktra\nWnr06EFaWhoul4sdO3YArdP9fLHb7eTk5FBaWurZVlJSQmVlJenp6URGRtLY2IjL5aJ3794kJyez\nd+9eoHUkIzc313P+srIyjh49CsDevXsZOXKkGW+diIh0E+UqEZHgpxFtkR+YOnUqcXFxrFu3jubm\nZpqbm0lLS2PRokWMGTOmw7EpKSnMmTPHs4BLnz59eOyxxzz7x48fz7p16ygvLyc9PZ1JkyZhtVoZ\nO3Ys8+fPJzExkVmzZnH48GGWL1/O7NmzvbZp+PDhPPbYY2zevJmGhgbcbjeJiYksXLiQ3r17ExcX\nR1xcHI899hirV69mwYIFbN68mTfeeAOLxcK9995LTEwMACNGjODvf/87hw4dIiYmhl//+tdd92aK\niEiXUK4SEQluFuNibrgRkbCwa9cuCgsLWbZsWaCbIiIi4pVylYiEA00dFxERERERETGRCm0RERER\nERERE2nquIiIiIiIiIiJNKItIiIiIiIiYiIV2iIiIiIiIiImUqEtIiIiIiIiYiIV2iIiIiIiIiIm\nUqEtIiIiIiIiYqL/B5wp9Daxbm0EAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "inception_split(df, \"learning_rate\", learning_rates, \"state_size\", state_sizes)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Hyperparam Search on Dropout and Num Layers" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\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", " \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", "
dropout_probembed_sizeglobal_steplearning_ratelossnum_layersstate_sizevocab_size
00.23220.510.595644212840000
00.2322030.55.747638212840000
00.2324040.55.864061212840000
00.2326050.55.508001212840000
00.2328060.55.496625212840000
\n", "
" ], "text/plain": [ " dropout_prob embed_size global_step learning_rate loss \\\n", "0 0.2 32 2 0.5 10.595644 \n", "0 0.2 32 203 0.5 5.747638 \n", "0 0.2 32 404 0.5 5.864061 \n", "0 0.2 32 605 0.5 5.508001 \n", "0 0.2 32 806 0.5 5.496625 \n", "\n", " num_layers state_size vocab_size \n", "0 2 128 40000 \n", "0 2 128 40000 \n", "0 2 128 40000 \n", "0 2 128 40000 \n", "0 2 128 40000 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = BASE + 'cornell.csv'\n", "df = pd.read_csv(path, index_col=0)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0.20000000000000001, 0.5, 0.80000000000000004}\n", "{2, 4}\n" ] } ], "source": [ "dropout_probs = set(df['dropout_prob'])\n", "num_layers = set(df['num_layers'])\n", "print(dropout_probs)\n", "print(num_layers)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n+BAdOnQAALi6uiIrK0vtc+GJiIiIiJo6g5Z/tGrVCocOHUJwcDDS09ORmZmJwsJC2Nvb1/iaxv7k\nJH5Sk2bcF824L5pxX2rGvdGM+6IZ94Wo6TJoUu3n54dbt27h/fffR6tWrbSqp+bHlBse90Uz7otm\n3JeacW80475oxn3RjG80qKkwaFINACEhIcqvw8PDYWtra8BoiIiIiIjqzqA11ffu3cPatWsBAFeu\nXEHbtm1hYsJT/oiIiIjIuBi8ploQBCxYsAASiQTh4eGGDIeIiIiIqF4MmlSbmJhg7ty5hgyBiIiI\niEhnrLUgIiIiItIRk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakm\nIiIiItIRk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakmIiIiItIR\nk2oiIiIiIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdMakmIiIiItIRk2oiIiIi\nIh0xqSYiIiIi0hGTaiIiIiIiHTGpJiIiIiLSEZNqIiIiIiIdaZ1Ul5WVKb+uqKjAr7/+irS0NL0E\nRURERERkTLRKqn/99VfMnj0bAFBZWYmFCxdi1apVePvtt5GYmKjXAImIiIiImjqxNp3i4uLw6quv\nAgASExNRWlqKjRs34vbt29izZw969eqlzxiJiIiIiJo0re5UP3z4EAMGDAAAXLp0Cb1794alpSW6\ndOmC9PR0vQZIRERERNTUaZVUi8ViVFVVQaFQ4MaNG+jSpQsAQC6XQxAEvQZIRERERNTUaVX+0bFj\nR2zZsgWmpqZQKBR48cUXAQDHjx9Hy5Yt9RogEREREVFTp9Wd6tdeew2ZmZm4e/cu3njjDYjFYhQW\nFiI2NhaTJk3Sd4xERERERE2aVneqXVxcsHjxYpU2W1tbbNiwAebm5noJjIiIiIjIWGh1p7q8vBx7\n9+5Vfv/jjz8iIiICmzZtQnFxsd6CIyIiIiIyBlol1du2bcO1a9cAAA8ePMDGjRvh6+uLkpISbN++\nXa8BEhERERE1dVqVf1y6dAmfffYZAODMmTPw9fVFaGgoioqKMH/+fL0GSERERETU1Gl1p7qsrAwO\nDg4AgGvXrqF79+4AABsbG5SUlOgvOiIiIiIiI6BVUu3g4ICUlBSkp6fjzp076Nq1KwAgLS0NVlZW\n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\n0TAoHRydvzvewC2n5ajHVTrIVfr8/D4R3c7ECzG7Zew1HsMdB4nSF8s/iIguglKtypTeHU/pRXVK\nn1+fR0QgkHixZcAvpnwhJhFlDgbVREQjnJL1uGpscT3w/Gw5WbKdX1AbgR+JA2c/RAS1ibPYRETf\nhOUfREQjnNIlJ0rXjQ88v2kTyxHqccpyrK5wBO1iCOM12rjn2sUQusMRlMhyZCJKdwyqiYhGCaXq\ncdVaVBc7vyKzAS098hzDbtbjk6xeIIj4hZj6XtxptspzYCJKewyqiYgooXRcVGfN1uMSqwnvnotf\niHm1zZx250tEymFNNRERZZRYDbfBKKADIRiMAntGE1HSRkSmOhgMYuXKlVi0aBHmzZun9nCIiCiN\nsWc0EclhRATVf/3rX2E2y9Nwn4iIKJF0LG8hIvWoXv5x7tw5nD17FtOnT1d7KEREREREF0WQJElS\ncwBPP/007r33XuzduxfFxcUs/yAiIiKiUUfV8o9//vOfmDRpEoqLi4f8My0tLTKO6EKlpaWKHm+0\n4LwkxnlJjPMyOM5NYpyXxDgviZWWcoEpjQyqBtW1tbVob29HbW0tnE4n9Ho9LBYLrrzySjWHRURE\nREQ0LKoG1Q8++GD/n//85z+juLiYATURERERjTqqL1QkIiIiIhrtRkRLPQBYvHix2kMgIiIiIroo\nzFQTERERESWJQTURERERUZIYVBMRERERJYlBNRERERFRkhhUExEREREliUE1EREREVGSGFQTERER\nESVJkCRJUnsQRERERESjGTPVRERERERJYlBNRERERJQkBtVEREREREliUE1ERERElCQG1URERERE\nSWJQTURERESUJAbVRERERERJ0qk9gJHo5ZdfxsmTJyEIAu655x5MnDhR7SEpqq6uDuvXr0d5eTkA\nYNy4caiursbGjRshiiIKCgrw05/+FHq9Hvv27cNbb70FQRBw44034jvf+Y7Ko5dHU1MT1q5diwUL\nFmD+/Pno7Owc8nyEw2E8//zz6OjogEajwbJlyzBmzBi1TyklBs7Lpk2b0NjYiNzcXABAdXU1ZsyY\nkXHzsn37dnzxxRcQRRELFy7EpZdeyusF8fNy+PDhjL9eAoEANm3aBLfbjVAohEWLFmH8+PG8XohG\nI4kuUFdXJz399NOSJElSc3Oz9Oijj6o8IuUdO3ZMevbZZy94bNOmTdK///1vSZIk6dVXX5V2794t\n+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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nLdeZzWbLUo7CjM+MGTMICwvL98HJZDLh5uamZRQiUiJpKYXIHYSFhTFz5kwmTJhAYmIiXl5ebN++\nnbi4uHw3Yjnb448/joeHB/PmzcPV1ZUKFSqwadMmoqOjeeONNxg3bhzffvut5dpczz77LOPGjQPy\n78YAN3ZO2LNnDx9++CFRUVHUq1ePmJgYFi5ciMFgoE+fPnesrUWLFkycOJEBAwYQHh5O9erVycjI\nYPv27ezevZtevXrd8Vf2HTp0YOzYsYwbN46uXbvyl7/8hYYNG2IwGDh69CjLly8nPT2dMWPG0K1b\nN8vr3n//fV566SUGDBjAc889R4UKFTh69Cjfffcd1apVY8iQITaN792oUqUKixYt4ty5czRo0IDo\n6Gi++uorypUrx/PPPw/cWB5SuXJl1qxZQ6VKlahZsya7d+/m119/5YMPPuCtt95ixYoVlC9fPt8u\nELfj7u5O/fr1+e6770hKSuKJJ56w3PT33Xff4eHhYVmOUr9+ffr27ct3333HkCFDCAsLIysri02b\nNrFr1y5eeuklqzcu3knLli2ZNWsWffr0oVevXlSuXJnU1FQ2btxIdHQ0b7755l23KSJibwrGIncQ\nHBzM559/zpdffsm0adPw8PCgXbt2RERE0KNHjxK1nMLPz4/Zs2czadIkZs6ciZeXF+3atWP8+PEY\njUbWrVvHrl27MJlMeYJxt27d+OSTTwgMDKRp06b52q1WrRpLly7liy++YM2aNURGRuLl5UXz5s0Z\nOnSoZcuy26levTqLFy9m9uzZfP/99yQkJGAymahVqxajR4+2hMU76dOnD61atSIyMpIdO3awbt06\nMjMzqVy5Mt27d2fAgAH5dk1o1qwZ3333HTNmzGDu3LmW5Qy9e/dm6NCh+Z6SVxxcXV2ZM2cOn376\nKatWrSIzM5OQkBBGjRqFv78/cOOGxdmzZzN+/HgiIyNxd3enVatWLFy4kIoVK7JmzRp27tzJrFmz\n7ioYw40PA7Vq1WLlypV89tlnpKam4uPjQ/PmzXn11VfzLI94//33qV27NkuWLOGjjz7CaDTy0EMP\nMX78+EI/VrtZs2Z8++23zJ07l8jISK5cuYKrqytBQUFMmDAh37Z3IiIlgcF88+/OROSBtH//fsLD\nwxk9enSRHmwiNwQFBVGzZk1+/PFHZ5ciIiJ3QWuMRR5wWVlZTJo0CW9vb3r27OnsckRERJzGoUsp\n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\neWafL1++jJ+fn01tOIKCsYiIiEgJE+hdGp8yrsRbCcc+Hq5U8S5t1/6XLVtGamoq3bp1sxxLSUnh\n0KFDbNq0iRUrVuS5vnHjxmzdujXPsb179+Lq6mpZV+zq6sqBAwfo2LGj5Zp9+/bRrl07m9uwNy2l\nEBERESlhKni68Yh/WavnHvEva9fZYoCRI0fy888/s2rVKstXgwYNCA8PJyIigkOHDtGpUydiY2MB\nCA8P59y5c3z99dekp6cTFRXF9OnT6dWrF15eXnh5edGzZ0+mT5/OqVOnSEtL46uvviImJobw8HCb\n2nAEBWMRERGREmhc10d4rLYffmVcMRrAr4wrj9X2Y1zXR+zed7ly5fD398/z5erqiqenJxUqVCAt\nLY1Tp06RmZkJQGBgIHPmzGHdunU8+uij9O/fn7Zt2zJy5EhLm6NHj6Zly5b07duXFi1asHHjRubO\nnUuVKlVsbsPeDGaz2eyw3opB7icTRwgICHBof/cKjYt1GhfrNC4F09hYp3GxTuNiXUBAgLNLsLtL\nKdeJuZJGFe/Sdp8pftBpjbGIiIhICVbB002B2EG0lEJEREREBAVjERERERFAwVhEREREBFAwFhER\nEREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQE\nUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFY\nRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERER\nERFAwVhEREREBFAwFhEREREBwOTMznNycpgzZw7nzp3DZDLx8ssvU6VKFWeWJCIiIiIPKKfOGO/Z\ns4fU1FTGjx/PkCFDWLBggTPLEREREZEHmFOD8fnz53nooYcA8Pf359KlS+Tk5DizJBERERF5QDl1\nKUW1atVYt24dXbp0IS4ujosXL5KUlIS3t3eBrwkICHBghY7v716hcbFO42KdxqVgGhvrNC7WaVxE\n7Mupwbhx48YcPXqUDz74gGrVqtm0vjg2NtYBld0QEBDg0P7uFRoX6zQu1mlcCqaxsU7jYp3GxTp9\nWJDi5NRgDBAeHm7587BhwyhbtqwTqxERERGRB5VT1xifPn2aL7/8EoADBw5Qs2ZNjEbtICciIiIi\njuf0NcZms5lRo0bh6urKsGHDnFmOiIiIiDzAnBqMjUYjr732mjNLEBEREREB9OQ7ERERERFAwVhE\nREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMRERER\nEUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAF\nYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQHuIhin\npaVZ/nz9+nX27t1LbGysXYoSEREREXE0m4Lx3r17efXVVwHIyspi9OjRTJ06lbfffptdu3bZtUAR\nEREREUcw2XLR0qVLefHFFwHYtWsXqampREREcOzYMRYtWkTLli3tWaOIiIiIiN3ZNGN8/vx5Hnvs\nMQD27dtHq1at8PDwoGHDhsTFxdm1QBERERERR7ApGJtMJrKzs8nJyeHIkSM0bNgQgMzMTMxms10L\nFBERERFxBJuWUtSpU4d58+bh4uJCTk4O9evXB+Dnn3+matWqdi1QRERERMQRbJoxfumll7h48SIn\nT57k9ddfx2QykZSUxOLFi+nXr5+9axQRERERsTubZowrVarE3//+9zzHypYty+zZs3F3d7dLYSIi\nIiIijmTTjHF6ejpLliyxfL9582ZGjhzJnDlzSElJsVtxIiIiIiKOYlMw/vrrr/njjz8AiImJISIi\ngpCQEK5du0ZkZKRdCxQRERERcQSbllLs27ePTz/9FIAdO3YQEhJC3759SU5O5p133rFrgSIiIiIi\njmDTjHFaWho+Pj4A/PHHHzRt2hQALy8vrl27Zr/qREREREQcxKZg7OPjw9mzZ4mLi+PEiRM0atQI\ngNjYWMqUKWPXAkVEREREHMGmpRRPPfUU7733HgCPPvooFStWJDU1lalTp+px0CIiIiJyX7ApGHfp\n0oXatWuTmppKSEgIAG5ubrRo0YJnnnnGrgWKiIiIiDiCTcEY4OGHHyYlJYWzZ88C4O/vz7PPPmu3\nwkREREREHMmmYHzt2jW++OIL9u3bh9lsBsBoNNK6dWuGDBlCqVKl7FqkiIiIiIi92RSMv/nmGy5d\nusQbb7xBYGAgZrOZs2fPsmLFCpYuXUrfvn0L1Xl6ejozZszg2rVrZGZm8uyzz1pu7BMRERERcSSb\n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\n+Hjc3d3zHffw8LDsb1xYV65coVy5ckVqQ0RERESkqGwKxtWqVWPWrFnExMSQkZFBVlYW58+fZ+7c\nuVStWrVIBdSqVYvRo0cXqQ0RERERkaKyaf3CK6+8wqRJk3jrrbfyHC9btiyjRo2yS2EiIiIiIo5k\nUzCuVq0an3/+OcePHyc+Pp6srCx8fX2pW7cupUqVsneNIiIiIiJ2Z/MdbwaDgbp161K3bl171iMi\nIiIi4hQFBuPnn3/esmVbnz59btvI4sWLi7cqEREREREHKzAYDxo0yPLnV155BYPB4JCCRERERESc\nocBgfPOT6Nq3b++IWkREREREnKbAYPzll1/a1IDBYODVV18ttoJERERERJyhwGAcFxdnUwNaYiEi\nIiIi94MCg/HYsWNtauDo0aPFVoyIiIiIiLPY9OS7XCkpKSQmJlq+jh07xkcffWSv2kREREREHMam\nfYxPnz7N5MmTuXjxYr5z2tdYRERERO4HNs0Yf/3119StW5d33nkHFxcXRowYQY8ePahfvz6jR4+2\nd40iIiIiInZnUzA+c+YMgwcPplmzZhiNRpo0aUKfPn3o0KEDkZGR9q5RRERERMTubArGLi4uGI03\nLjWZTKSmpgLw6KOP8ttvv9mvOhERERERB7EpGNeuXZs5c+aQkZFB1apVWblyJenp6Rw+fFjbtYmI\niIjIfcGmm+/69+/P5MmTycnJoXv37nz22WesWrUKgGeeecauBYqIiIiIOIJNwTgwMJCpU6cC0KRJ\nEyZNmkRUVBSVKlXSrhQiIiIicl+47VKKjz76iH379uU7XqVKFdq2batQLCIiIiL3jdvOGOfk5DBh\nwgQqVqzIk08+SVhYGJ6eno6qTURERETEYW4bjP/+979z/vx5fv75Z1avXs3SpUtp3bo1nTp1ombN\nmo6qUURERETE7u64xrhy5cr079+f5557jl27dvHTTz8xcuRI6tSpQ8eOHWnVqhUmk01LlUVERERE\nSiybE63JZCI0NJTQ0FCio6PZunUrixYtYsGCBURERNizRhERERERu7NpH2NrcnJyyMnJKc5aRERE\nREScxuYZ46ysLH799Vd++uknjh49St26denXrx8tW7a0Z30iIiIiIg5xx2B8/vx5fvrpJ7Zu3cr1\n69dp06YNL730km6+ExEREZH7ym2D8Ycffsiff/5JhQoVePrpp7Vdm4iIiIjct24bjE0mE++88w5N\n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\nnT17Vo2Njbr11lv1gx/8QMnJyZI8O9lNnz5dFy9e1CeffCKbzaZ77rlHjzzyCFlnAOjF+AkOwKeq\nqiqdOHFCM2fO9AbFV0tKSlJWVpbPoFiS1q9fr9LSUj333HN6/fXXde+99+pXv/qVcnNzvc8pKCiQ\ny+XShg0btHbtWhUWFuo3v/mNJKmiokJr167V3Xffrddee00vvviizp8/r23btnVq/CkpKbLZbNq5\nc6cqKiq8j9tsNt19990aNGiQJkyYoIULF0qStm3bpqysLFVVVenZZ5/V6NGjtWXLFm3ZskXR0dH6\nxS9+0So7/u6772ry5Ml69dVXtXz5cu3bt0/79+/v1NgAAD0TgTEAn0pKSmQYhjdL2hUFBQXKycnR\nvHnzlJCQIIfDofvvv18pKSn68MMPvc+z2+168MEH1adPHw0aNEj333+/jh49KrfbrdjYWL388su6\n7777ZLfbFRMTo9tvv115eXmdGsPQoUP1wx/+UB9//LEWLVqk5cuX6+WXX9bhw4fV1NTU4df985//\nlMPh0Ny5cxUREaF+/frp0UcfVUlJiXJycrzPS09PV2ZmpsLDwzV27FiNHz9e//73v7s8VwCAnoNS\nCgA+tWSJ23aZeOqpp1RUVCRJcrvdys7O1uzZs1s9p7i4WJKUmpra6vGUlBSVlJR4/52UlNRq8d6Q\nIUPU2NioyspKxcbG6sMPP9R7772nsrIyud1uNTc3Kz4+vtPXMH36dE2bNk25ubnKzc3V559/rl//\n+teKj4/XT3/6UyUlJbX7mgsXLsjlcumRRx5p9bjdbldpaWmra7na4MGDdfz48U6PDQDQ8xAYA/Ap\nOTlZdrtdhYWFSk9P9z6+du1a79+feeYZn4vvGhsbJandgra2//ZVoiFJDodDBw4c0Pbt27VkyRJl\nZmYqIiJCO3fu1EcffdSl6wgPD9eYMWM0ZswYzZo1S06nUytXrtSf//xnLVmypN3zIyIiNHTo0FbX\n6Uvb6zYMo8PrAQD0DpRSAPApKipKkyZN0u7duzssPeiok8OQIUMkSf/5z39aPV5YWNiqNKOkpKRV\nRvrixYuKjIxU//79lZubq5SUFE2bNk0RERGSpDNnznR6/O+//7727dvX7vH4+HgNGzZMVVVVHY69\nuLhYtbW13scMw9ClS5daPe/ixYut/l1SUqKEhIROjw8A0PMQGAPo0Pz589XU1KTnn39eeXl53nKG\n/Px8bdmyRXl5eRo5cmS7r0tLS9OoUaO0Y8cOVVRUqKGhQXv37lVxcbG++c1vep/X2NioXbt2qaGh\nQSUlJdq3b5+mTp0qyVNm4XQ6VVpaqurqau3atUt1dXWqrq5WXV3ddcdus9n0u9/9Tu+88443CK6p\nqdH+/ft14sQJ3XXXXZI8XTYk6fz586qtrdW0adMUGRmpV199VZcvX1Z9fb3++Mc/asWKFaqpqfH+\n/6dOndKRI0fU1NSkkydP6vjx45oyZcqNTzYAwHI2g+adAK6hurpau3fv1pEjR1RWVia73a6EhARl\nZGRoxowZ3jrdAwcO6KWXXtLvf/97hYWFyeVy6bXXXtOpU6fU0NCg1NRUPfzww7rlllskeXa+c7lc\nuu222/T222+roaFB48aN08KFC9WvXz/V1dVp48aN+uyzzxQVFaWZM2cqMzNTq1atUn19vbZu3ap5\n8+Zp4cKFuueee3yO/dChQ/r73/+uwsJC1dTUyOFwaPjw4XrggQeUmZnpvb5nn31WhYWFmjlzpubN\nm6f8/Hxt375deXl5Cg8PV1pamubNm6cRI0ZI8rRry8zMVGVlpbdd23333aeHHnqIcgoA6MUIjAGg\nix5//HHdeeedevDBB60eCgDAjyilAAAAAERgDAAAAEiilAIAAACQRMYYAAAAkERgDAAAAEgiMAYA\nAAAkERgDAAAAkgiMAQAAAEnS/wNDyULxVehlcAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "split_df_and_plot(df, 'dropout_prob', dropout_probs)\n", "split_df_and_plot(df, 'num_layers', num_layers)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAHyCAYAAAB4ceQwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVGX7P/DPzLCDgCyKKGiK4pKau+a+IIhmmVr2fdJK\nLStSezTNrVxbzK0ETH20cnvysTT3sNIUNRXMzIXcMlBEtmETGNaZ3x/+mCRmGGY4M+fM8Hm/Xr1y\n5sy5z3UzynWuc9/nPjKNRqMBEREREREREYlKLnYARERERERERMQCnYiIiIiIiEgSWKATERERERER\nSQALdCIiIiIiIiIJYIFOREREREREJAEs0ImIiIiIiIgkgAU6SUpZWRmCg4OxZ88esUOxGuPHj8c7\n77wjdhhERHUC85TxmKeIiGqOBTqRiX7++WdcvXpV7DAs5sqVK3j55ZfRo0cP9OnTBzNmzEBWVpbe\nz5eVlSEqKgohISF44oknEBoaiu3bt9eqTSIiqjnmqepzypw5c9CmTRu0b9++0n/ffPONyW0SEdUW\nC3QiE0VGRiIhIUHsMCwiJycHkydPxuOPP46ffvoJe/fuRV5eHqZPn653n88++wy7d+9GZGQkfv31\nV8yaNQsffvghjh49anKbRERUc8xThnPK008/jcuXL1f6b+zYsbVqk4ioNligk6hu3ryJcePGoVOn\nTggLC8PJkycrbZ8zZw6mTp2KWbNmoVOnTrh79y4AYOfOnXjqqafwxBNPoE+fPli2bBmKi4sBAOfO\nnUNwcDBOnDiBkSNHon379ggJCcGZM2e07apUKnz44YcYMmQIOnTogNDQUOzYsUO7PTIyEv369asU\ny5o1azBo0CAAQL9+/XD16lUsWrQII0eOrFFfIyMjER4ejj179mDgwIFo3749xo0bh5SUFABAcnIy\ngoOD8b///Q8DBgzAvHnzAAD37t3DW2+9hT59+qBjx454/vnnce7cuUptazQaLF++HD179kTPnj0x\nf/58FBUV6Yxj3bp1VUYLKv6bOHGizn0OHjwIjUaDt99+G/Xq1YOPjw/eeecdxMXF4dq1azr3sbOz\nw9y5c9G6dWsoFAoMGTIELVu21H4PprRJRGRpzFO2m6cMYZ4iIjGwQCfRaDQaREREwNfXFydPnsT2\n7duxa9euKp+Lj49Hu3btEB8fjyZNmmDPnj1Yvnw55syZg/Pnz2PTpk04evQoPvroo0r7bdq0CdHR\n0Th37hwGDhyIN954A/n5+QCAxYsX48yZM9iwYQMuXLiAWbNm4YMPPsDhw4drFHtsbCwAYNGiRdi/\nf3+N+5ySkoL4+HgcOHAAx48fh0wmw8yZMyt9Zt++fdi5cyc++OADlJWVYeLEibC3t8eBAwdw7tw5\n9OjRA6+99hru3bun3ef48ePw8/PDiRMnsGXLFhw7dgyfffaZzhjefPPNKqMFFf998cUXOve5ePEi\n2rVrBzs7O+17wcHBcHR0xMWLF3XuM336dAwdOlT7uqSkBOnp6WjUqJHJbRIRWRLzlG3nKQC4fv06\nxo0bh65duyI0NBQbNmxAeXl5rdokIqoNFugkmsuXLyMpKQkRERFwc3ODj48P3nzzzSqfk8lkmDBh\nAuzs7CCTybB9+3aMGjUKvXv3hp2dHVq3bo3x48dj3759UKvV2v1efPFFBAQEwMXFBRERESguLkZs\nbCzy8/Oxb98+REREoEWLFrCzs8OQIUPQr18/fPfdd2btc1FREWbNmgU3Nzd4e3tj0qRJuHDhAjIz\nM7WfGTZsGPz8/CCTyXDy5EkkJSVhwYIFqF+/PpycnDB16lQ4OTlVOklr2LAhXnrpJTg6OiI4OBgj\nR47ETz/9JFjc2dnZ8PDwqPSeTCaDh4cHlEqlwf01Gg0WLlwIJycnPP/884K0SURkbsxTtp2nmjRp\ngiZNmuCDDz7AL7/8gtmzZ2P9+vXYvHmzyW0SEdUWC3QSzf379wE8TJAVWrZsWeVzjRs3hlz+91/V\nO3fuICgoqNJnWrRogcLCwkonEC1atND+2cPDA+7u7rh//z7u3r0LtVpd5VgtWrTAnTt3atcpA+rX\nrw8vLy/t64CAAAB//ywAIDAwUPvnpKQkeHl5wdvbW/uevb09AgMDtdMogao/t6ZNm1Zq05xkMlm1\n24uKivD222/j3Llz+OKLL+Dm5lbrNomILIF5yrbz1FtvvYXIyEi0aNECDg4OGDx4MJ577jmdsyRq\n2iYRUW3ZGf4IkXmUlJQAqJzkHh1ZqGBvb1/pdXFxMTQaTaX3Kl4/2lbFFLVHPyOXy7X3AP6zDbVa\nXW3C1RWbsf7ZRkUMj57YPdrfkpKSKnHqakdX3I6OjjpjWLduHT7//HOd27p166Zz+qC3tzcyMjKq\nxJ6bmwtfX1+dbQFAVlYWXnvtNdjb22PXrl3w8fGpdZtERJbCPGX7eeqfAgMDkZaWJmibRETG4Ag6\niabiXuSKxWcA4MaNGwb3a9asGa5fv17pvRs3bsDd3b1SAZiUlKT9c05ODvLy8tCoUSMEBgZCJpNV\naePmzZt47LHHADw8afjn4jWPtmeq3NxcZGdna1/fvXsXMplM+7P4p2bNmiE7Oxvp6ena90pKSnDn\nzh00b95c+95ff/1Vab/ExES9bZpyb1+nTp2QkJCA0tJS7XuXL19GcXExOnfurHOf/Px8TJo0CQEB\nAdiyZUul78bUNomILIl5ynbzVHl5OT755JMq95Lfvn0bTZs2NalNIiIhsEAn0XTo0AE+Pj74/PPP\nkZ+fj7S0NKxfv97gtLEXXngB+/btwy+//ILy8nJcuXIF27Ztw9ixYyvtu23bNiQnJ0OlUiE6Ohou\nLi7o27cvvLy8EBYWhqioKCQmJqK0tBSHDx/G6dOnMW7cOABA8+bNkZubixMnTqC8vBw///wzLly4\nUCkOZ2dn/PXXX8jNza1xnx0dHbFy5Urk5+dDqVRi8+bN6N69e6XphI/q378/GjVqhGXLliEvLw8F\nBQVYuXIl1Go1wsPDtZ+7e/cudu7ciZKSEiQkJGD//v0YNmxYjeMyZMSIEbC3t8fq1auRn5+P1NRU\nfPLJJxgwYIB2iub27dsxfvx47T6ffvopnJycsGLFCjg4OJjUJhGRmJinbDdPKRQK3LlzB++99x5u\n376N0tJS/PTTT/j222/xyiuv1LhNIiKhcYo7icbBwQEbN27EwoUL0adPHzRs2BBz587F2bNnq93v\nhRdeQGFhIZYtW4b79++jQYMGePHFFzFp0qRKn3vuuecQERGB27dvo1GjRtiwYQNcXV0BAMuWLcPy\n5cvxyiuvIDc3F82aNUNkZCT69+8PABg0aBDGjBmDWbNmQa1WIywsDBMnTsT27du17Y8fPx5btmzB\n/v37cerUqRr12dPTE506dcLIkSORkZGBDh06YMWKFXo/7+joiM2bN+Pjjz9GaGgo1Go1Hn/8cXz9\n9ddo0KCB9nPh4eH4888/0bdvX8hkMgwdOhSvvvpqjWKqiXr16uGLL77AsmXL0Lt3bzg6OmLw4MGY\nP3++9jPZ2dmVRm/++9//QiaToVOnTpXa8vf3x5EjR2rUJhGRmJinbDtPffTRR1i1ahVeeeUVZGVl\nwd/fH4sWLcKoUaNq3CYRkdBkGl03DhFZsXPnzmHChAn44YcftNPUpCAyMhLffPON9tE3RERUNzFP\nERGRPpziTkRERERERCQBFpnifufOHaxYsQLDhw9HWFgYMjMzERUVBbVaDU9PT0ydOrXKCqhE1iIt\nLQ1Dhgyp9jMjRoyAv7+/hSIiIlMwV5GtYp4iIrIeZp/iXlRUhOXLl8PPzw9NmzZFWFgY1q1bh06d\nOqFXr17473//Cx8fHwwdOtScYRAREenFXEVERERSYPYp7vb29pg7dy7q16+vfe/q1avo2rUrAKBr\n1664dOmSucMgIiLSi7mKiIiIpMDsU9wVCgUUCkWl94qLi7XTBN3d3ZGTk2PuMIiIiPRiriIiIiIp\n4CJxRERERERERBIgynPQnZycUFJSAgcHB2RlZVWaUqhPSkqKoDH4+/sL3qYY2A9pYT+khf2QFmtb\ngIq5Sjjsh7TYQj9soQ8A+yE11panyDaJMoLevn17nD17FgBw9uxZPPHEE2KEQUREpBdzFREREVma\n2UfQb9++ja1btyIjIwMKhQJnz57FtGnTEB0djZ9++gk+Pj7o37+/ucMgIiLSi7mKiIiIpMDsBXrz\n5s2xaNGiKu+/99575j40ERFRjTBXERERkRRwkTgiIiIiIiIymz179iA4OBhlZWVihyJ5LNCJiIiI\niIiIJIAFOhEREREREZEEsEAnIiIiIiKyEcHBwThw4ACmTZuGLl26oE+fPli/fr12+5w5c/DCCy9U\n2uedd97B+PHjAQDnzp1DcHAw4uLi8NRTT6FDhw6YMGEC0tPTsXjxYnTr1g29e/fGtm3bTI7x9u3b\neO2119CzZ0906dIF//rXv3D16lUAwNq1azFgwACo1epK+4wYMQKffPIJAODatWuYOHEievTogU6d\nOuHVV1/FX3/9pf3soEGDEBkZidGjRyM0NBQA8Msvv2Ds2LHo0qULunbtildeeQW3bt0yuQ/mwgKd\niIiIiIjIhkRFRWHChAmIi4vDtGnTsGbNGty4ccOoNrZt24YtW7bg6NGj+OuvvzBu3Dj06NEDZ86c\nwcyZM7F8+XJkZ2ebFN/06dPh4eGB48eP4/Tp02jSpAmmTp0KABgzZgzS0tJw+vRp7eevXbuGmzdv\nYvTo0cjKysJLL72EJ554AidOnMCJEyfg7e2NKVOmoLy8XLvP7t27MXfuXMTExKC0tBQREREYPXo0\n4uLicPz4cTz22GNYsGCBSfGbEwt0IiIiIiIiGzJ48GB07doVCoUCTz31FADg+vXrRrXx/PPPw8vL\nC76+vujcuTP8/f0RFhYGOzs7DBs2DKWlpbhz545J8X399ddYunQpnJyc4OTkhPDwcNy7dw8ZGRnw\n9/dHnz598O2332o/f+jQIXTq1AktWrTAgQMHYG9vj2nTpsHJyQnu7u6YN28e7t69i7i4OO0+7du3\nR9euXSGTyVBSUoLi4mI4OjpCoVDAzc0N7733Hnbu3GlS/OZk9sesERERERERkeU0bdpU+2dnZ2cA\nQFFRkVFtNG7cuFIb/v7+tW6zwm+//Ybo6GjcunULxcXF0Gg0AIDi4mIADy8OvP3228jOzkb9+vVx\n6NAhvPnmmwAeTo/PzMxE+/btK7Upl8uRnJysfR0QEKD9s6urK2bMmIH3338fGzZsQK9evRASEoIn\nn3zSpPjNiQU6ERERERGRDZHLjZso/c/7vXW1YWyb+vz111944403MH78eKxfvx6enp44efIkJk+e\nrP3MgAED4OnpiQMHDqBDhw7Izs7GsGHDAABOTk5o1aoV9u/fX+1x7O3tK72ePHkyxowZg9OnT+Pk\nyZOIiIjAoEGDsGrVKkH6JRROcSciIiIiIqojHB0dq4x8JyUlWez4CQkJKC0txZQpU+Dp6QkA+P33\n3yt9xs7ODqNHj8ahQ4dw4MABDBs2DK6urgCAZs2a4c6dO8jPz9d+XqPR4O7du9UeNysrC56enhg+\nfDg+/vhjrFu3DgcPHkROTo7APawdFuhERERERER1RPPmzXHz5k1cu3YNpaWl2LVrF+7du2ex41dM\nPf/1119RXFyM77//HvHx8QCA+/fvaz83ZswYXLp0Cd999x3GjBmjff+pp56Cs7Mzli5diuzsbKhU\nKnz22WcYM2ZMpaL9Ub/++isGDx6MU6dOoby8HCUlJbh48SJ8fHzg4eFhxt4ajwU6ERERERFRHTFm\nzBgMGDAA//d//4e+ffsiOTkZo0aNstjxO3TogNdffx3z5s1Dnz59EBsbi6ioKHTp0gWvvvqqdqG3\ngIAA9OrVCw0bNkTnzp21+7u5uWHTpk24f/8+Bg4ciH79+uH333/Hl19+CTc3N53H7NKlC+bMmYMP\nPvgAnTt3Rt++fREXF4f169dDJpNZpN81JdNU3JEvcSkpKYK25+/vL3ibYmA/pIX9kBb2Q1oeXVzG\nVjFX6cZ+SIst9MMW+gCwH1JTF/KUNdFoNBg5ciTGjRuHf/3rX2KHYzFcJI6IiIiIiIgko7S0FFFR\nUVCpVBg9erTY4VgUC3QiIiIiIiIySadOnVBWVqZ3e+fOnbFly5Yat3f+/Hm8/PLLaNWqFaKjo+Hk\n5CREmFaDBToRERERERGZ5LfffhO0va5du+LKlSuCtmlNuEgcERERERERkQSwQCciIiIiIiKSABbo\nRERERERERBIgyj3oarUa//nPf3D37l3Y2dnh1VdfRePGjcUIhYiISCfmKiIiIrI0UUbQz58/j8LC\nQixbtgyvv/46tm3bJkYYREREejFXERERkaWJUqDfv38fQUFBAAA/Pz9kZGRArVaLEQoREZFOzFVE\nRETCOXfuHEJCQsQOQ69du3Zh+PDhCAsLw6RJk5Camqrzc2fOnMGoUaMQGhqKV155pdLnvvrqKwwb\nNgyhoaGYP38+SkpKjI5DlCnugYGBOHToEIYPH47U1FSkp6cjLy8Pnp6eevfx9/cXPA5ztCkG9kNa\n2A9pYT/IVMxVwmI/pMUW+mELfQDYD9KtXJmBsvvJsGvUBApvX7HDsXmXLl3C2rVrsWfPHjRo0ADL\nly/HihUrsGrVqkqfKywsxIwZM7Bp0ya0a9cOW7duxcKFC7FhwwZcvHgRW7duxd69e1GvXj1Mnz4d\n27Ztw6RJk4yKRZQCvVOnTrh+/ToWLlyIwMDAGt3Tl5KSImgM/v7+grcpBvZDWtgPaWE/pMXaTt6Y\nq4TDfkiLLfTDFvoAsB9SI4U8pVYVQrliAUpuJECdkwV5fS84tGwL71nLIHd2EeQYycnJGDduHF57\n7TV88803yMnJwdy5cxEeHo7IyEikpqbigw8+AIBKr8ePH4++ffvi6NGjSEpKwtSpU5Gbm4v9+/dD\nLpdjw4YNCAgIqFEMKpUKc+fOxR9//IHS0lKEhobi3XffxY4dOxAbG4sNGzY8/Hmo1ejTpw82b96M\n+vXrY9GiRfjrr78AAPPmzUP//v21/QkPD0dCQgK2b9+ONWvWICYmBgDQsGFDrFixAg0bNsTs2bMR\nFhaGQYMGVYrHy8sLa9asQYMGDQA8fBb72rVrq8R99uxZBAQEoF27dgCA0aNH45NPPkF+fj5iYmIQ\nHh4Od3d37baoqCijC3TRVnEfN24cli5dildffRUFBQXajhAREUkFcxUREVmScsUCFJ2LhTo7E9Co\noc7KRNG5WChXLBD0ONnZ2ZDL5Thw4ADmzZuHTz/9tEb7xcfHY8eOHfjoo4+wYsUK+Pn5ISYmBkFB\nQdi9e3eNj//111+joKAAMTEx+O6777Bnzx6cP38eYWFhOHv2LLKzswEAFy5cgLu7O9q0aYN3330X\nrVu3xpEjR7Bx40bMnj1b+7mcnBy0adMG27dvx82bNxETE4ODBw/iyJEjCAkJwZkzZwAAn3zySZXi\nHACaNGmCbt26aV/HxsaiY8eOVT6XmJhY6SKEq6srPD09cefOHSQmJiIwMFC7LSAgALdv367xz6SC\nKAV6YmIi1q1bBwC4ePEiHnvsMcjlfOIbERFJB3MVERFZUrkyAyU3E3RuK7mZgHJlhmDHKisrw7PP\nPgsAaNeuXY1nQAwcOBB2dnZo1aoVVCoVQkNDAQCtWrVCenp6jY8/ceJErFu3DjKZDB4eHmjZsiWS\nk5Ph7e2Nrl274siRIwCAH3/8EeHh4SgsLMS5c+fw8ssvAwCaNm2KLl264MSJEwCA0tJS7f3t7u7u\nyMrKwoEDB5Cbm4vx48fjmWeeqXFse/fuxcmTJzF16tQq21QqFRwdHSu95+joiMLCQqhUKjg4OGjf\nd3JygkqlqvFxK4hyphEYGAiNRoO5c+fiu+++w4QJE8QIg4iISC/mKiIisqSy+8lQZ2fp3KbOyUJZ\n6j3BjqVQKODi8nDKvFwur/EiqK6urtr9H31tTBvAw4vgU6dOxdChQxEWFoYrV65o9x8+fDgOHjwI\nADh69CjCw8Px4MEDaDQajBs3DmFhYdp98vLytPG4ubkBeDilPTIyEjExMRgwYABee+013L9/v0Zx\n7dixA9HR0diyZQt8fave++/i4oLi4uJK7xUVFcHV1RXOzs6VFoVTqVTan7ExRLkHXS6XIyIiQoxD\nExER1QhzFRERWZJdoyaQ1/eCOiuzyja5pxfs/AyvhVJb/yy0c3NzzXKcJUuWoF27doiOjoZCocC4\nceO020JCQrBkyRKcOHECzs7OCAoKQllZGRQKBXbv3q29KFAhOTm5Svs9e/ZEz549UVhYiOXLl2Pl\nypVVFnz7pz179mDHjh3Yvn07GjZsqPMzzZs3x+HDh7WvHzx4gNzcXDRt2hTNmzdHUlKSdltSUpL2\naTDG4Fw9IiIiIiIikSm8feHQsq3ObQ4t21pkNfcGDRrgxo0bUKvVyMrKQmxsrFmOo1Qq0aZNGygU\nCpw+fRpJSUkoLCwEANSrVw99+/bF4sWLMWzYMACAnZ0d+vfvj507dwL4e5E5XSPjp06dwuLFi6FW\nq+Hi4oLWrVtDJpNVG09aWhpWr16NTZs26S3OAaBHjx5ISUnB+fPnATx8rNrAgQPh4uKCYcOG4dCh\nQ8jMzERZWRm2bt2K4cOHG/2zYYFOREREREQkAd6zlsGpRz/IvXwAuRxyLx849egH71nLLHL8sLAw\nuLi4YMiQIdoVz83hjTfewPLlyzFixAjExcXhrbfeQmRkJH799VcAD6e537t3D+Hh4dp9Fi1ahPj4\neISFhWHUqFEICAhAo0aNqrTdrVs3FBUVITQ0FMOHD8fhw4cxffp0AMDs2bNx7NixKvvs3bsXBQUF\nmDhxonYK/YgRIwA8fARbxUrsTk5OWL16NZYsWYKQkBBcvHgR77//PgCgffv2mDhxIv71r38hPDwc\nzZo1wwsvvGD0z0am0Wg0Ru8lAj66Rjf2Q1rYD2lhP6RFCo+vMTfmKt3YD2mxhX7YQh8A9kNqpJSn\nypUZKEu9Bzu/xnXyOeiXLl3CkiVL8O2334odisWJcg86ERERERER6abw9q2ThTnwcIX56OhojB8/\nXuxQRMECnYiIiIiIiGotIiICf/75p85t0dHRaNGiRbX7JyQkICIiAn369MHIkSPNEaLksUAnIiIi\nIiKiWouOjq7V/m3btsXPP/8sUDTWiYvEEREREREREUkAC3QiIiIiIiIiCWCBTkRERERERCQBLNCJ\niIiIiIiIJIAFOhEREREREZEEsEAnIiIiIiIiszp37hxCQkLEDsOg7du3Izg4WO/2Q4cOYcSIEQgN\nDcXUqVPx4MEDAIBGo8HKlSsRGhqKsLAwrFq1yqTjs0AnIiIiIiKSkIz8YvyWnIOM/GKxQ6lT0tPT\n8b///U/v9pSUFCxduhQbN27EkSNH0LhxY6xZswYAcPjwYcTFxeHAgQPYv38/4uLiEBMTY3QMLNCJ\niIiIiIgkoLCkDDP3XMKErfF4/esLmLA1HjP3XEJhSZlgx0hOTkafPn2wdetWPPXUU+jbty8OHz4M\nAIiMjMT8+fO1n3309fjx47Fx40Y8//zz6NmzJ3bs2IF169YhLCwM4eHhuHv3bo1jUKlUePvttxEa\nGopBgwZh+fLlAIAdO3ZgypQp2s+p1Wo8+eST+OOPP5CamorXX38doaGhCA0NxYkTJyr158MPP8SL\nL74IAFizZo32cxMmTEBaWhoAYPbs2Th27JjeuD744AO88cYbercfPXoUvXr1gr+/PwBgzJgx2iI8\nJiYGo0aNgoODAxwcHDBy5EgW6ERERERERNbqvYMJiP0zE5kFJVADyCwoQeyfmXjvYIKgx8nOzoZc\nLseBAwcwb948fPrppzXaLz4+Hjt27MBHH32EFStWwM/PDzExMQgKCsLu3btrfPyvv/4aBQUFiImJ\nwXfffYc9e/bg/PnzCAsLw9mzZ5GdnQ0AuHDhAtzd3dGmTRu8++67aN26NY4cOYKNGzdi9uzZ2s/l\n5OSgTZs22L59O27evImYmBgcPHgQR44cQUhICM6cOQMA+OSTTzBo0CCdMZ04cQL5+fkIDw/XG3di\nYiICAwO1rwMDA6FUKpGbm6tz2+3bt2v8M6nAAp2IiIiIiEhkGfnFSEjN07ktITVP0OnuZWVlePbZ\nZwEA7dq1Q0pKSo32GzhwIOzs7NCqVSuoVCqEhoYCAFq1aoX09PQaH3/ixIlYt24dZDIZPDw80LJl\nSyQnJ8Pb2xtdu3bFkSNHAAA//vgjwsPDUVhYiHPnzuHll18GADRt2hRdunTRjqKXlpZq7293d3dH\nVlYWDhw4gNzcXIwfPx7PPPNMtfEUFRVh+fLlWLhwYbWfU6lUcHBw0L52cHCATCaDSqWCSqWCo6Oj\ndpuTkxNUKlWNfyYVWKATERERERGJLDlHhayCEp3bsgpLcC/H+GJPH4VCARcXFwCAXC6HWq2u0X6u\nrq7a/R99bUwbwMOR6KlTp2Lo0KEICwvDlStXtPsPHz4cBw8eBPBwSnl4eDgePHgAjUaDcePGISws\nTLtPXl6eNh43NzcAQMOGDREZGYmYmBgMGDAAr732Gu7fv19tPNHR0XjqqacqjYDr4uLigpKSv7+j\n4uJiaDQauLi4wNnZGcXFf19EUalU2p+xMVigExERERERiayJpzO8XB10bvNycUBjT2ezx/DPQjs3\nN9csx1myZAlatmyJ77//HjExMWjdurV2W0hICK5cuYITJ07A2dkZQUFB8Pb2hkKhwO7duxETE4OY\nmBjExsZiwoQJOtvv2bMnNm7ciNOnT6NRo0ZYuXJltfEcO3YM27ZtQ+/evdG7d28AQO/evZGUlFTp\nc4899lil9xITE+Hr6wt3d3c0b9680rakpCQEBQUZ/bMRpUAvKirCypUrsXjxYixYsAAXL14UIwwi\nIiK9mKuIiMiSfN0c0dbPXee2tn7u8HVz1LlNSA0aNMCNGzegVquRlZWF2NhYsxxHqVSiTZs2UCgU\nOH36NJKSklBYWAgAqFevHvr27YvFixdj2LBhAAA7Ozv0798fO3fuBPBwdHru3Lk6R8ZPnTqFxYsX\nQ61Ww8V3/algAAAgAElEQVTFBa1bt4ZMJqs2nkOHDuGXX37B6dOncfr0aQDA6dOn0bRp00qfGzJk\nCM6cOaO9t/yrr77CiBEjAADDhg3Drl27UFhYiIKCAuzatQvDhw83+mcjSoF+/Phx+Pv7Y+HChZgx\nYwa++uorMcIgIiLSi7mKiIgsbemItujXwgc+rg6QywAfVwf0a+GDpSPaWuT4YWFhcHFxwZAhQzB7\n9myEhYWZ5ThvvPEGli9fjhEjRiAuLg5vvfUWIiMj8euvvwJ4OM393r17lRZsW7RoEeLj4xEWFoZR\no0YhICAAjRo1qtJ2t27dUFRUhNDQUAwfPhyHDx/G9OnTARhexV2XH3/8EXPnzgXwcPr8woULERER\ngaFDh0KlUmHq1KkAHv7s+vbti2eeeQbPPvsshg4dqndBuurINBqNxui9aun06dO4cuUKpkyZgrt3\n72Ljxo1YunRptfvUdOGCmvL39xe8TTGwH9LCfkgL+yEtFY8ksRbMVcJhP6TFFvphC30A2A+pkVKe\nysgvxr0cFRp7Oltk5FxqLl26hCVLluDbb78VOxSLE6VABx4+Yy41NRUFBQWYM2cOWrVqJUYYRERE\nejFXERERWVZZWRkiIiIQHh6Op59+WuxwLM7O0AcSEhJw/vx5TJgwAQkJCVi7di1kMhneeOMNdOjQ\nwaSDxsbGwsfHB/Pnz0diYiLWr1+Pjz/+uNp9OCqhG/shLeyHtLAf0mLOkQnmKmljP6TFFvphC30A\n2A+pkdIIurWKiIjAn3/+qXNbdHQ0WrRoUe3+CQkJiIiIQJ8+fTBy5EhzhCh5Bgv0L7/8EpMnTwYA\nbNmyBePGjUPLli2xdu1ak096rl+/jo4dOwIAmjVrhuzsbKjVasjlXFSeiIiMx1xFREQkvujo6Frt\n37ZtW/z8888CRWOdDJ5llJWVITg4GJmZmcjMzMSAAQPQuHFjlJWVmXxQPz8/3Lp1CwCQkZEBJycn\nnvAQEZHJmKuIiIjIFhgcQZfL5VAqlfjxxx/RpUsXAA+XtS8vLzf5oCEhIVi3bh0WLlwItVqNV199\n1eS2iIiImKuIiIjIFhgs0MeMGYN3330XHh4eePfddwEAq1atwpAhQ0w+qJOTE2bMmGHy/kRERI9i\nriIiIiJbYLBA79WrF3r16lXpvenTp6NevXpmC4qIiMgYzFVERERkCwzeTJeQkICtW7dq//z6669j\n9uzZuHTpktmDIyIiqgnmKiIiIrIFBgv0L7/8Ej169ADw98q4CxYswI4dO8weHBERUU0wVxEREZEt\nMDjFXdfKuBXvExERSQFzFREREdkCgyPo5lgZl4iISEjMVURERGQLRFnFnYiISEjMVURERGQLTFrF\nfdq0aXB3dzdbUERERMZgriIiIiJbYLBALykpwcGDB3Hp0iXk5ubC09MTnTt3xrBhw2BnZ3B3IiIi\ns2OuIiIiIltg8Kxl06ZNKCgowIgRI+Dq6ooHDx7g2LFjSEtLw+TJky0RIxERUbWYq4iIiMgWGCzQ\nb968idWrV0Mmk2nf69KlC9555x2zBkZERFRTzFVERERkCwyu4g4ApaWllV5zVVwiIpIa5ioiIiKy\ndgZH0Lt37473338f/fv3h6urK/Lz83Hy5En07NnTEvEREREZxFxFREREtsBggT5u3DgEBgbit99+\nQ15eHjw8PPD000/zpIeIiCSDuYqIiIhsgcECXSaToXfv3ujdu3el98+cOVPlkTZERERiYK4iIiIi\nW1Cje9B12bVrl5BxEBERCY65ioiIiKyJyQU6EREREREREQmHBToRERERERGRBOi9B/369evV7lhS\nUmLyQY8dO4bY2Fjt6z///BPbtm0zuT0iIqqbmKuIiIjIlugt0NeuXVvtjjKZzOSDDho0CIMGDQIA\nJCQk4JdffjG5LSIiqruYq4iIiMiW6C3Qo6OjLRLAt99+i2nTplnkWEREZFuYq4iIiMiWiHoP+q1b\nt+Dt7Q1PT08xwyAiItKLuYqIiIgsRabRaDRiHXzjxo3o3bs32rVrJ1YIRERE1WKuIiIiIkvRO8Xd\nEq5evYqJEyfW6LMpKSmCHtvf31/wNsXAfkgL+yEt7Ie0+Pv7ix2CSZirao/9kBZb6Ict9AFgP6TG\nWvMU2RbRprhnZWXByckJdnaiXiMgIiLSi7mKiIiILMngGceZM2ewc+dOZGZmQq1WV9r29ddfm3zg\nnJwceHh4mLw/ERFRBeYqIiIisgUGC/StW7fipZdewmOPPQa5XLgB9+bNm2PevHmCtUdERHUXcxUR\nERHZAoMFuqurK3r27GmJWIiIiEzCXEVERES2wOAww+DBg/HDDz+gpKTEEvEQEREZjbmKiIiIbIHB\nEfS9e/ciLy8PmzdvrjJtsDb39REREQmFuYqIiIhsgcECfdmyZZaIg4iIyGTMVURERGQLDBbovr6+\nyMzMxJUrV5CbmwsPDw906NABXl5eloiPiIjIIOYqIiIisgUG70GPjY3FrFmzcP78eaSkpCAuLg7v\nvPMO4uLiLBEfERGRQcxVREREZAsMjqDv378fK1asgI+Pj/a91NRUrFq1Ct27dzdrcERERDXBXEVE\nRES2wOAIellZWaUTHgDw8/NDWVmZ2YIiIiIyBnMVERER2QKDBbqvry/27dsHlUoFACgsLMS+ffvg\n6+tr9uCIiIhqgrmKiIiIbIHBKe5TpkzBxo0btY+pkclk6NixI6ZMmWL24IiIiGqCuYqIiIhsgcEC\n3cfHB/PmzUN5eTkePHgAd3f3Ks+YJSIiEhNzFREREdkCvQX6rl278Nxzz2H9+vWQyWQ6P8ORCSIi\nEhNzFREREdkSvQW6u7s7AMDb21vndn0nQkRERJbCXEVERES2RG+BHhYWBgBwcXHB8OHDq2zfunWr\n+aIiIiKqAeYqIiIisiV6C/Q7d+4gKSkJBw4cgIeHR6VtBQUF+OmnnzBhwgSzB0hERKQPcxURERHZ\nEr0FeklJCa5du4aCggIcPXq00jaFQoEXX3zR7MERERFVh7mKiIiIbIneAj0oKAhBQUFo1qwZQkJC\nqmy/ceOGWQMjIiIyhLmKiIiIbInBx6yFhITg+vXrSEtLg0ajAQAUFRVh165d2Lx5s9kDJCIiMoS5\nioiIiGyBwQJ927ZtOH78OAICAnD79m00bdoUqampeP7552t14JMnT2L//v2Qy+V4/vnn0blz51q1\nR0REdRdzFREREdkCgwV6XFwcIiMj4eLign//+99YunQpLl26hD/++MPkgz548ADffvstPv74Y+0I\nB096iIjIVMxVhikLS5GaXwo/N3t4u9iLHQ4RERHpIDf0AYVCARcXFwCAWq0GAHTo0AHx8fEmH/Ty\n5cto3749nJ2dUb9+fUyZMsXktoiIiJir9FOVqrHseDJmfp+I+T/ewcyYRCw7ngxVqbpW7SoLS3E1\nvRDKwlKBIiUiIiKZpuJmPT3WrFmD4uJizJo1CytXrkRgYCAee+wxbNmyBZ9//rlJB927dy/u3buH\n/Px8FBQUYOzYsWjfvr1JbdmqcmUGyu4nw65REyi8fcUOh4hI0pir9Ju55xJi/8ys8n6/Fj5Y9WwH\no9srLCnDewcTkJCah6yCEni5OqCtnzuWjmgLFweDE/OIiIioGgYzaUREBH744QcoFApMmDABX3zx\nBX777Te89NJLtTrwgwcPMGvWLGRkZGDx4sVYt24dZDKZ3s+npKTU6nj/5O/vL2ibQk0d1BSpoN60\nClnJ95Fabgc/RRm8mjSCfPJMyJycq3xe6H6Ipa71Q5majvv3MtCosS+8/RpYIDLj1LXvQ+psqR/m\nwlylm7KwFJdTsnVuu3wvG5dvJRmds5YdT0b8vXzt68yCEsT+mYlZ317A/AFNdO5jS3+H61I/pHxb\nRF37LqTOlvpBJDaDBbqDgwNGjBgBAGjUqBHmz59f64N6eHggODgYCoUCfn5+cHZ2Rl5eHjw8PGrd\ntqWpStVYdToFt5Qq5BSVw9NZgSAvZ8zs7Q9ne4N3EFRRsOlTfFreBrdahSDHwQ2eJfkIepCMtzd9\nCre35pqhB2RJhfkFWP3NWdyCO3LsXeB5KQlBuIwZY3vCxc1V7PCIAEj7pFwf5irdUvNLkaMq17kt\nt6gcafmlRn3HysJS3MpS6dx2U6mCstC49kiahD63ITIHa8xVRDWht0CPiIiodpQAAKKiokw6aMeO\nHREdHY2nn34aBQUFKCoqQr169UxqS2yrTqdUGknIVpUj/l4+Vp9O0TuSoI8mR4lPZe0Q79Pq7/Yc\nPRDv6IFPc+wxP0cJmae3YLFTzQmVBFZ/cxbxDo21r7Md6iEe9bD6m7NY8MpgwY9HZAxrPClnrqqe\nn5s9PJ0VyNZRpHs4KdDQzbjfL0IX/CQsoXJHTc9tmKtIDNaYq4iMobdAnzp1KgDg0qVLuHPnDvr2\n7QtXV1fk5eXh5MmTaNOmjckH9fLyQs+ePbUjHBMnToRcbn3/oJSFpbiVWahz201lodEjCVnJqbjl\n3FDntlvODZF1Lw3eLNBrRKgp5NokkFmAnGI1PB3lCPJxNSkJKFPTcQvuOrfdgjuUqelw8fYR7HhE\nxhLygqOlMFdVz9vFHkGeDohXVR31DqrvYHRRJXTBX5cJWdwKWbDUZJaEi72CBRKJxhpzFZEx9Bbo\nrVu3BgB8+eWX+PjjjyuNUPTs2RNz587FyJEjTT5wSEgIQkJCTN5fClLzS5FTVAbIqiajXFWZ0SMJ\n9128kOOgeyQo18ENqc5eYHlePaGnkK86eRfx9ytOVGTILtY8TAIn72L+oKZGtXX/XgZy7F10bsu1\nc0FqSia+S1AJdjyqO4Q40bfWqcvMVYa9nfBffFreCrfqNUGuvRs8Sv//rVPZN4BBxt065e1ijyAv\n50onxxWCvJ0l+XdEaswx+idkwVKTWRJ7EtJYIJHR6nKuIjKGwXvQ8/Ly8ODBA7i7/z3yV1BQgLy8\nPLMGZg381PnwLC1AtkPVKY8epQVoqM4HoLsg06WRnw881feRrai6j4e6BH5+LM8NqekU8ppQFpbi\nVrIS0PF93EzOgrLQ36gk0KixLzwvJen++1JWCEfvANy6kiLY8Ui6hBo5E/JE39qnLjNX6abJUcI5\n8Rrm5p5BloM70py90FCVBa+SPMCjPjQm3Do1s7e/9u9dblE5PJwUCPJ++PeODBN69E/ogsXQLAkH\nhYwFUh3BXEUkDoMF+pAhQ/D222+jbdu2cHFxQWFhIa5fv271IwpC8MrLQFDeHcT7tKuyLSjvDrwe\nuAJGTK/2drFHUBPvR0ZQH2mviRd/4RhQkynkxkx3v5+aiRy5k85tuXIHpKYq4d3cr8btefs1QBAu\nIx5VC/Qg5KGoXCPo8cyJ9x2aRuiRMyFP9K196jJzlR7pqUBeDgDAqyTvYWFe4UEukJEGGFmgO9vL\nsWBAEygLS5GWX4qGAv0eqAu/V8wx+id0wWJolkRxuYYFko1jriISl8ECffTo0ejRowf++OMP5Ofn\nw9XVFWPGjEGzZs0sEJ7ENfDD2/fW4FOg6tTBe98DvgOMbnJm3wDtPci5xWp4PHIPcm1I/cQn9W4K\nrly8Wqt7xmsyhdyYthsVZsGzJB/ZjlVXbPYoyYefSgbAuIJ5xtie2in4uXYu8CgrRBDyMGNsT6gS\nEwU/ntC4MEvtCHmSIvSJvrVPXWau0qOBH+DuCeTqeNRaPQ/AV/e6JzXh7SJMPrGW3yvKwlKkJefA\nrsj0AtQco3/mKFiqmyVRWFpuNQWS1M99pIq5ikhcegv0xMRENGvWDNevXwcABAYGarcVFxfj+vXr\nCA4ONn+EEibz9IZzYDPM/X1L1amDHbubtOK60CMTUj/xEfKecUNTyP38jbuH26uJH4JOnEa8joI5\nSJUGr8ZBRrUHAC5urljwymAoU9ORmpIJP/+m2osGzmY4XgVLr+xLVQl9kmKOE31rnLrMXFU9mac3\n0Kwl8Htc1Y3NWkriySBS/73yaB7NLSqHRy3yqDmKaXMULNWdizjby81WIElxSnVdw1xFJD69Bfq2\nbdvw3nvvYe3atTq3y2Qykx9dY0vkk2dCvWkVvBJvwuvBnYcjEm26Qz55Zq3aFWpkwlwnPkKtki7k\nPeOGppAbG6fM0xtva67i08zSqjMkFDcg8zR94SlvvwZV4jHH8Sy9sq+tXrkW4qRR6JMUc5zom2vq\nsjkxVxlWkaeQePPhtPZ6HkCzlrXOU0Iw5+8VKV6YNNfon7kKFn3nIkIfT8pTqq0JcxWRbdBboL/3\n3nsAgOjoaIsFY41kTs5QvLUAmhzlw3v5fBtKYkQCEP4xcICwI95C3zMOVD+F3BSuk9/G3E2rkHXj\nGNLK7dBQUQavJo3MdmIr9PEsvbKvrSVIIU8ahT5JMec0P6EuEFoCc5VhUs5T5vi9IvULk+Yopi1d\nsAh9PClPqbYGzFVEtkVvgb5hwwaDO0+ZMkXQYKyZzNPb6IV2zE3ox8ABwo54C33POFD9FHJTVJzY\n+uQo4WOBE1shj2fplX1rc9+h0PcJVrRn715cq3akPnLGaX7MVcaQYp4yx+8VqV+YNGcxbemCRYjj\nWcOU6kdjleI97cxVRLZFb4Hu5eVV7Y6PPmuWpEnox8AJPeIt9D3jj9I1hbw2LH1iK8TxLL2yrylJ\nW+hpjf9sz/uXVDzm6WCzI2ec5sdcZe2E/r1iTRcmOfr3kDVMqTbXPe1CLDzIXEVke/QW6GPHjq12\nx23btgkeDAlL6MfACT3iLfQ941SZpVf2NYXQ9wn+s73MghJkFpTY/MhZXT7RZ66yfkL+XrGGC5NU\nmTVMqRY6Vwm58CBzFZHtMfiYtczMTOzevRvp6elQq9UAgKKiIiiVSowfP97sAVItCPwYOHOMeAt9\nzzj9zdIr+xpL6Kv+HDmr25irrJeQv1fMfmGyuBwejpyeKySpT6k2xwi1tTwXnLmKSBwGC/SoqCg0\nbNgQffv2xddff43nnnsOZ86cwaRJkywRH9WC0I+BM8eId8U94/Jy4PLvCbW+Z5wqm9G1Plb/db3q\nBZCutbsAIkTSFvqqP0fO6jbmKusnxO8Vc1+YLHfygKIol//+BSblKdVC5xY+F5yIDDFYoGdnZ2PR\nokUAgH379mHw4MHo3r071q5di/nz55s7PqoloR8DZ64Rb78Af6gVtWqCdHD8ag3m/h5X9QJNwRng\nrQUmt6vJUQLpqUADP5MXsRP6qr81TOkn82GuogrmfOSYv78nUlJ0Px2FTCflKdVC5xY+F5yIDDFY\noMvlcmRnZ6N+/fqQyWTIz89HvXr1kJ6ebon4qJaEfryO0Kukk/locpQPn3sMwKsk72FhXiHxJjQ5\nSqP/LmiKVH8/TzkvB3D31D5PWebkbFRbQl/1l/qUfjIv5irLE+JCnTnw3631kuKUaqFzC58LTkSG\nGCzQR4wYgalTp2LLli3o0qULFi5cCF9fX7i5uVkiPhKI0KuQC71KOplBeurDIlqXB7kPL9gY+XdC\nvWkV8Hvc32/kZgO/x0G9aRUUJozIC33V/5/tebk6aFdxrw0pnjRSZcxVliPkhTpz4r9bEoqQuYrP\nBSciQwwW6IMHD0a3bt2gUCjwwgsvoGnTpsjLy0Pv3r0tER8RmaqB38MT59zsqtvqeQC+DY1q7tER\n+SpMHJEX+qr/P9vrGBSA0jylye2R9WCushyhL9QRSZ3QuYoLDxJRdfQW6AsXLsSAAQPQq1cvuLs/\nfPa1XC5Hnz59LBYcEZlO5ukNNGtZ+US6QrOWxk9JNcOIfAWhr/pXtOfr5oiUPMOfJ+vFXGVZ5rhQ\nR2QthMpVXHiQiKqj92GLffv2xfHjxzFlyhRERUXhypUrloyLiAQgnzwT6Ngd8KgPyOUP/9/RxEUC\nK0bkdTFhRJ5ICMxVFlaTC3VEVCPeLvZ4ookni3MiqkTvCPqQIUMwZMgQpKen49SpU9i8eTNKSkrQ\nr18/DBgwAA0bmn4yfvXqVaxevRoBAQEAgMDAQEycONHk9ohINyEXCRR8RJ5IAMxVFibwrTNERERU\nmcF70Bs0aIBnn30Wzz77LG7fvo1Tp07hww8/hKenJxYvXmzygdu2bYuZM0171BcRGUeoRQIrHtuH\nxJsPR8vqeWgXhyISE3OVZfBCHRERkXkZLNAfpVartf9pNBpzxUREEiX0Y/uIzIG5yrzMdaFOqo9t\nIyIisiSDBXp6ejpOnjyJ2NhYlJWVoV+/fpg/fz78/PxqdeDk5GQsX74c+fn5GDt2LDp06FCr9ojI\ncoR+bB9PzKm2mKssR+gLddby2DYiIiJLkGn0DC/88MMPOHnyJJKSktC9e3f0798fjz/+OGQyWa0P\nmpWVhWvXrqFXr15IS0vD4sWLERkZCTs7owb0icjKqVWFUK5YgJIbCVDnZEFe3wsOLdvCe9YyyJ1d\nxA6vzipXZqDsfjLsGjWBwttX7HCqxVxl/TKWzEDRudgq7zv16Aff91eLEBEREZF49J5lnDp1CgMH\nDkSvXr3g7CzsFWwvLy88+eSTAAA/Pz94enoiKysLDRo00LtPSkqKoDH4+/sL3qYY2A9pYT+MUx61\nrNK9rOqsTBSdi8W9pe8I8jzluvJ9CDUDwdwjmf7+wj/jl7nKOujrhyZHCfW1yzr3Kbp2GfcSLktq\nVo2tfx/WxBb6ALAfUmOOPEVkLL0F+pIlS8x20JMnTyI7OxsjR45ETk4OcnNz4eXlZbbjEZH08HnK\ntSd0Qa3etKry4l+52cDvcVBvWiXIBRNzYK6ycjV5bBt/DxARUR0iyjy9rl274rPPPsP58+dRVlaG\nyZMnc8ogUV1jxhPzihHlckfbfraskAU1L5hUxVxlAXxsm6RxfRAiIssT5UzD2dkZc+bMEePQRCQV\nZjgx/+eIcmp9b6gDmktusSkhTnoFL6g5klkFc5X5mfOxbXWxuLSW212IiEg/DgUQkSjMcWL+zxFl\ndVYmkJUpmSnagp70Cl1QcySTRCL0Y9vqYnHJ212IiGyHXOwAiKjukk+eCXTsDnjUB+Tyh//v2N2k\nE/OajCibSpOjhObG1Vq1ATxy0pubDWg0lU56jVZRUOtiQkGtvWCiSy1HMomqU/HYNvmC1ZC/8yHk\nC1ZD8dYCk4tpQf+dWQkh+2zO36VERGQYR9CJSDSCPk/ZDFO0hRyVEnpKujlmIAg9kklkDJmnd61v\no7CmtRQEm47O212IiGwKC3QiEp0QJ+bmmKIt6DRPM5z0Cl1QC3rBhEgMZl58sjgrDRq5nbTu7xbx\ndpe6eJ8/EZG5sUAnIpsg9Iiy4KNSZriAYK6CWpALJkRiMPPik+l5uYC7h7Tu7xa4zzX5XVoX7/Mn\n6eEFIrJVvAediGzGP+9pl3v5mHxPe41GpYxgznu8ZZ7ekLVsyxMUqvPM8e+s8v3dasnd322OPhta\nH6Qu3udP0qEpUqE8ahnUy2ZAvXIe1MtmoDxqGTRFKrFDIxIER9CJyGb8c0TZ7/GOSCsuNa0xM4zE\n8R5vIvMT8t+ZtdzfbcnbXazpPn+SFqFGvPmUAbJ1LNCJyOZUTNFWePsCKSmmtyHwImy8x5vI/CS9\n+KSZHmdo0dtduIgcGUnKC64SSRGnuBMR6SHkY+AexSnpROYnyL8zK3ucoUV+twj8MyHbJ+gtEQLf\nfkYkRRxBJyLSgyPeRHUbH2dYlTl+JmS7rGHBVSKpYYFORGQAVzUnqrv4OMOqzHWRgatyS4sg34fA\nt0TwAhHVBSzQiYiIiPR4tKD20ZQjU6ao848zFPoiAx/bJi2Cfh9ccJXIaCzQiYiIiAyQeXrD0d8f\nMhMXnrRFQl1kMNeq3FIfkdfkKFGclQaN3E5S8Qn5fXDBVSLjsUAnIiIiIlGYY1Vuc43IC1XwPxpf\nel4u4O4hmRkD5vg+zDXibc2zUIiqwwKdiIiIiMRhhse2CT0iL3TBL+kZA2b4PjjiTWQcFuhERERE\nJA6B71E2xwiwkAW15GcMmHGVdI54E9UMn4NORERERKIQ/NnwAj8nuyYFtZjxAcI+Z1zw74OIjMYC\nnYiIiIhEI588E+jYHfCoD8jlD//fsbtp9yhXjADrYsoIsNAFtcDxCX4BAQJ/H0RkNFGnuJeUlGDm\nzJkYPXo0BgwYIGYoREREOjFXEZmXkPcoC75quMBTvgWPj/eME9kcUUfQd+/eDTc3NzFDICIiqhZz\nFZFlyDy9IWvZttbFoJAjwOaY8i3pGQOPEOr7ICLjiDaCfu/ePSQnJ6NTp05ihUBERFQt5ioi6yP0\nCLDQjwl7ND4fTTkyZQrpzBggItGJVqBv3boVkyZNwvHjx8UKgYiIqFrMVUTWS6hVw8015Vvm6Q1H\nf3/IUlJq1Y65njNOROKQaTQajaUPeuLECWRmZmL06NHYtWsXGjRowPv6iIhIUpiriMialCszUJZ6\nD3Z+jaHw9hU7HCIykSgj6BcuXEB6ejouXLgApVIJe3t7eHl5oUOHDnr3Sanl1cV/8vf3F7xNMbAf\n0sJ+SAv7IS3+/v5ih2AU5irhsB/SYgv9sIU+AGboR/0GQHEpYOGfjS19H0RiE6VA//e//639c8Wo\nRHUnPERERJbGXEVERESWxuegExEREREREUmAqM9BB4DnnntO7BCIiIiqxVxFRERElsARdCIiIiIi\nIiIJYIFOREREREREJAEs0ImIiIiIiIgkgAU6ERERERERkQSwQCciIiIiIiKSABboRERERERERBLA\nAp2IiIiIiIhIAligExEREREREUkAC3QiIiIiIiIiCWCBTkRERERERCQBLNCJiIiIiIiIJIAFOhER\nEREREZEEsEAnIiIiIiIikgAW6EREREREREQSwAKdiIiIiIiISAJYoBMRERERERFJAAt0IiIiIiIi\nIglggU5EREREREQkAXZiHLS4uBjR0dHIzc1FaWkpRo8ejS5duogRChERkU7MVURERGRpohTov/76\nK1q0aIGnn34aGRkZWLZsGU96iIhIUpiriIiIyNJEKdCffPJJ7Z+VSiW8vLzECIOIiEgv5ioiIiKy\nNAtXbbIAACAASURBVJlGo9GIdfAFCxZAqVRizpw5aNq0qVhhEBER6cVcRURERJYiaoEOAImJiYiK\nisKKFSsgk8nEDIWIiEgn5ioiIiKyBFFWcb99+zYyMzMBAM2aNUN5eTny8vLECIWIiEgn5ioiIiKy\nNFEK9ISEBBw8eBAAkJOTg6KiItSrV0+MUIiIiHRiriIiIiJLE2WKe0lJCT7//HMolUqUlJRgzJgx\n6Nq1q6XDICIi0ou5ioiIiCxN9HvQiYiIiIiIiEikKe5EREREREREVBkLdCIiIiIiIiIJsBM7ADF8\n9dVXuHnzJmQyGV5++WUEBQWJHZJeV69exerVqxEQEAAACAwMxMiRIxEVFQW1Wg1PT09MnToV9vb2\nOHnyJA4fPgyZTIYhQ4Zg0KBBIkf/0J07d7BixQoMHz4cYWFhyMzMrHH8ZWVlWLduHTIyMiCXy/Hm\nm2+iYcOGovchOjoat2/f1i4YNXLkSHTu3FnSfQCA7du3448//oBarcYzzzyDFi1aWN13oasf58+f\nt7rvo7i4GNHR0cjNzUVpaSlGjx6Npk2bWt33oasfZ8+etbrvQ2qsKU8B1p+rbCFP6eoHc5W0+mFt\nuYp5Slr9oDpEU8dcvXpV89FHH2k0Go3m7t27mnnz5okcUfWuXLmiWblyZaX3oqOjNb/88otGo9Fo\nduzYoTly5IhGpVJppk2bpikoKNAUFxdrZsyYoXnw4IEYIVeiUqk0ixYt0qxfv17z/fffazQa4+L/\n+eefNf/5z380Go1Gc/HiRc3q1asl0YeoqCjN+fPnq3xOqn3QaDSay5cvaz788EONRqPR5OXlaV5/\n/XWr+y709cMav4/Tp09r9u7dq9FoNJr09HTNtGnTrPL70NUPa/w+pMTa8pRGY925yhbylL5+WOO/\nReYq6fSDeUpa/aC6o85Ncb98+TK6desGAGjSpAkKCgpQWFgoclTGuXr1qnYl4a5du+LSpUu4desW\nWrRoARcXFzg4OCA4OBjXrl0TOVLA3t4ec+fORf369bXvGRP/lStX0L17dwBA+/btcf36dUn0QRcp\n9wEA2rZti3//+98AAFdXVxQXF1vdd6GvH2q1usrnpN6PJ598Ek8//TQAQKlUwsvLyyq/D1390EXq\n/ZASW8hTgPXkKlvIU/r6oYvU+8FcJZ1+ME9Jqx9Ud9S5Ke45OTlo3ry59rW7uztycnLg4uIiYlTV\nS05OxvLly5Gfn4+xY8eiuLgY9vb2AP6OPycnB+7u7tp9Kt4Xm0KhgEKhqPSeMfE/+r5cLodMJkNZ\nWRns7Cz3V1dXHwAgJiYGBw8ehIeHByZOnCjpPlQc28nJCQBw7NgxdOrUCb///rtVfRf6+iGXy63u\n+6iwYMECKJVKzJkzB0uXLrW670NXPw4ePGi134cUWGOeAqw3V9lCngKYq6yhH9aaq5inpNUPsn11\n/m+WRuJPmWvUqBHGjh2LXr16IS0tDYsXL0Z5ebnYYYlGKt9Xv379UK9ePTRr1gx79+7FN998g+Dg\n4BrtK3Yf4uPjcezYMSxYsADTpk0zuR0p9ePPP/+02u9j2bJlSExMRGRkZK1ikVI/XnrpJav9PqTI\nGn4mzFV/k9L3xVwlrX5Ya65inqpM7H6Q7atzU9zr169f6Wp9dna2welgYvLy8sKTTz4JmUyG/9fe\nnUdHXd/7H39NFsi+B0LKEgirShBUEAEJChWVgrcg0HMKVlRQKCAiLSKIKLVCwAsmgSDSa1kuVK1X\nkOJPCxiNliCoCAQkSEDQANkTsi8zvz9SpkQSEsJM5jvJ83EOh8x3+Xzfn/lOMvOezxYWFqaAgAAV\nFRWpvLxckpSTk6PAwMCr6nV5uxF5eHg0OP4rt1dWVspisRjiG8vevXsrIiJCUnUXr7NnzzpFHQ4d\nOqT33ntPCxYskJeXl9Pei5/XwxnvR1pamrKysiRJERERqqqqkqenp9Pdj9rq0bFjR6e7H0bibO9T\nUvN7r3LWv40/54x/GyXeq4xSD96njFUPtBwtLkHv06ePkpOTJVX/wgYGBsrT09PBUdUtKSlJO3bs\nkFTd7TE/P1/R0dHWOiQnJ+vWW29Vt27ddOrUKRUVFam0tFQnTpxQr169HBl6nXr37t3g+K+8X199\n9ZVuvvlmR4ZutWLFCl28eFFS9VjFDh06GL4OxcXF2rx5s+bPny8fHx9JznkvaquHM96PY8eOaefO\nnZKqf7dLS0ud8n7UVo833njD6e6HkTjb+5TU/N6rnPF3sTbO+LeR9yrj1IP3KWPVAy2HydIC+2ls\n2bJFx48fl8lk0mOPPWb9Bs2ISkpKtHr1ahUXF6uyslLjxo1T586dFRcXp4qKCoWEhGj69Olyc3NT\ncnKyduzYIZPJpJEjR2rIkCGODl9paWnauHGjMjMz5erqqqCgIM2aNUvx8fENit9sNishIUHnz5+X\nu7u7pk+frpCQEIfXYeTIkdq+fbtatWolDw8PTZ8+Xf7+/oatgyTt3r1b77zzjtq1a2fdNmPGDCUk\nJDjNvairHtHR0froo4+c6n6Ul5dr7dq1ys7OVnl5ucaNG2ddSsiZ7kdt9fDw8NCWLVuc6n4YjTO9\nT0nO/V7VHN6n6qoH71XGqoezvVfxPmWseqDlaJEJOgAAAAAARtPiurgDAAAAAGBEJOgAAAAAABgA\nCToAAAAAAAZAgg4AAAAAgAGQoAMAAAAAYABujg4AMBqLxaIPP/xQn3zyiSorK1VZWanw8HBNmDBB\nXbp0kVS95MvMmTPVs2fPOsuJj49XWFiYxo4d2+Brp6SkKCEhQbGxsVftS0tL0+bNm5WTkyOLxSIf\nHx9NmjTJGsPu3bs1fPjw66wtAMDZ8D4FAM0XCTrwM1u3blVKSooWLFigwMBAmc1m7dmzRy+//LJW\nr14tPz+/Jo/JYrFo2bJlmjZtmvr16ydJ2r9/v5YvX661a9eqpKREO3bs4IMPALQAvE8BQPNFgg5c\nobCwULt27VJMTIwCAwMlSS4uLhoxYoQGDx4sT0/Pq87Zt2+f3n33XVVVVSkwMFDTpk1TWFiYJCkn\nJ0eLFy9WZmamOnfurJkzZ8rDw0OpqanasGGDysrKZDKZ9OijjyoqKqrOuC5duqTc3Fx169bNum3A\ngAHq2rWrWrdurblz5yo7O1tPP/20VqxYoQsXLmj9+vXKy8uTm5ubpk+frsjISCUmJmrfvn3y8fFR\namqqWrVqpWeffVbt2rWz8TMJALAH3qcAoHljDDpwhdTUVIWEhNT6QaC2Dz1ZWVlat26d5s2bp1Wr\nVqlfv35av369df+hQ4c0d+5cxcXFqbCwUHv37pUkrVu3TqNHj9aqVav00EMP1TinNr6+voqMjNSS\nJUu0d+9eZWRkSJKCg4MlSU899ZRCQkK0atUqubi4KCYmRkOHDtXq1av1xBNPaPny5aqqqpIkHT58\nWPfdd59iY2N1xx13aPPmzY17sgAATY73KQBo3mhBB65QVFRUo2tgUVGRnn/+eUlSaWmp7r//fo0Z\nM8a6//Dhw7r55putLRH33nuvNm/ebP2Q0bdvX2t5AwYMUGpqqh544AHFxMRYy+jVq5f1g0xdTCaT\nFi1apJ07d2rXrl1KSEhQ+/btNWHCBA0YMKDGsenp6crPz9ewYcMkST179pSfn59OnDghSWrfvr26\nd+9ujWnPnj3X/0QBAByC9ykAaN5I0IEr+Pn5KTc31/rY29tbq1atkiQlJCSorKysxvEFBQXy9va2\nPvby8pJU3dXvcnlX7isqKpIkJSUl6cMPP1RJSYnMZrMsFku9sXl5eWn8+PEaP3688vLylJiYqFWr\nVtX4ECVVf1grKyvTnDlzrNtKSkpUWFgoSfLx8alRv8vbAQDGx/sUADRvJOjAFbp37678/HydPn1a\nnTt3rvd4f39/paamWh8XFhbKZDLJ19fX+vjKfd7e3srJydG6dev0yiuvKCIiQufPn9fs2bOveZ3s\n7GxlZmZaZ8INCAjQQw89pH379unHH3+0Xk+SAgMD5eXlZf3AdqXExEQVFBTUiOnKD0IAAGPjfQoA\nmjfGoANX8PT01NixYxUXF6cLFy5Iksxms7744gvt27fP2kXwsqioKB0/flwXL16UJP3zn/9Unz59\n5OrqKkn65ptvVFhYKLPZrAMHDqhXr14qKChQ69atFR4erqqqKu3evVtSddfEumRnZysmJkZpaWnW\nbd9//72ysrIUGRkpV1dXlZaWqqqqSqGhoQoKClJycrKk6taTVatWWctPT0/X6dOnJUnJycnq1auX\nLZ46AEAT4H0KAJo3WtCBnxkzZox8fHy0cuVKVVRUqKKiQuHh4XrmmWfUp0+fGscGBwdr2rRp1slt\n2rRpo6lTp1r333bbbVq5cqUyMjIUGRmpYcOGyd3dXX379tXs2bMVEBCgSZMm6bvvvtPixYs1efLk\nWmPq3r27pk6dqvXr16u4uFhms1kBAQGaM2eOQkND5ePjIx8fH02dOlXLli3T008/rfXr12vbtm0y\nmUwaNWqUPDw8JEk9evTQP/7xDx0/flweHh76wx/+YL8nEwBgc7xPAUDzZbI0ZFARgGYhMTFRSUlJ\nWrRokaNDAQDgKrxPAWjp6OIOAAAAAIABkKADAAAAAGAAdHEHAAAAAMAAaEEHAAAAAMAASNABAAAA\nADAAEnQAAAAAAAyABB0AAAAAAAMgQQcAAAAAwABI0AEAAAAAMAASdAAAAAAADIAEHQAAAAAAAyBB\nBwAAAADAAEjQAQAAAAAwABJ0GEplZaV69Oih9957z9GhOI1Jkybp2WefdXQYAAAAAG4QCTrQSJ98\n8olSUlIcHUaTOXr0qH73u99pwIABGjx4sJ555hnl5OTUeXxhYaFeeuklRUdHq2/fvho5cqTefPPN\nGsd88cUXmjhxom6//XYNGzZML7zwgkpKSuxdFQAAAMCQSNCBRoqNjdWxY8ccHUaTyMvL0+OPP65b\nbrlFu3fv1vvvv6+CggLNnj27znOWLFmi/fv366233tLBgwf14osvKjY2Vn//+98lSWfOnNGTTz6p\nBx98UElJSdq4caOOHj2ql156qamqBQAAABgKCToc6uTJk5o4caK1hTUpKanG/vnz52vmzJmaN2+e\n+vbtq3PnzkmStm3bpl/96le69dZbNXjwYC1dulRlZWWSpP3796tHjx769NNPNXr0aPXu3VsjRozQ\nvn37rOWWlJTolVde0fDhwxUVFaX77rtPW7Zsse6PjY3V3XffXSOW//7v/9Y999wjSbr77ruVkpKi\nF198UaNHj25QXWNjY/XAAw/ovffe07Bhw9S7d29NnDhR6enpkqQff/xRPXr00N/+9jdFR0drwYIF\nkqSffvpJv//97zV48GD16dNHEyZM0P79+2uUbbFYtGzZMt15552688479fzzz6u0tLTWONasWaPe\nvXvX+m/KlCm1nrNz505ZLBY9/fTT8vX1VUhIiJ599ll9+eWX+u6772o95+jRo4qOjlZERIRcXV11\n5513qkePHjp8+LAk6W9/+5u6dOmiSZMmydPTUx06dND06dO1Y8eOa7bMAwAAAM0VCTocxmKxaMaM\nGQoNDVVSUpI2b96st99++6rjDhw4oJtvvlkHDhxQ+/bt9d5772nZsmWaP3++Dh48qDfffFN79uzR\nn//85xrnvfnmm4qPj9f+/fs1bNgwPfXUUyosLJRU3bq7b98+rVu3Tl9//bXmzZunP/3pT9q1a1eD\nYv/ss88kSS+++KJ27NjR4Dqnp6frwIED+uCDD5SYmCiTyaS5c+fWOGb79u3atm2b/vSnP6myslJT\npkyRu7u7PvjgA+3fv18DBgzQ1KlT9dNPP1nPSUxMVFhYmD799FP99a9/1d69e7V69epaY5g+fbqO\nHDlS67+//OUvtZ5z6NAh3XzzzXJzc7Nu69Gjh1q3bq1Dhw7Ves59992nPXv26NSpUzKbzTpw4IBO\nnjypX/7yl9Yyo6KiapwTFRWlysrKFjV0AAAAALiMBB0Oc+TIEf3www+aMWOGfHx8FBISounTp191\nnMlk0uTJk+Xm5iaTyaTNmzfrv/7rvzRo0CC5ubmpZ8+emjRpkrZv3y6z2Ww977e//a06dOggLy8v\nzZgxQ2VlZfrss89UWFio7du3a8aMGYqMjJSbm5uGDx+uu+++W//3f/9n1zqXlpZq3rx58vHxUXBw\nsB577DF9/fXXysrKsh5z//33KywsTCaTSUlJSfrhhx+0cOFCBQYGysPDQzNnzpSHh0eNLxPatm2r\nRx55RK1bt1aPHj00evRo7d6922Zx5+bmyt/fv8Y2k8kkf39/ZWdn13rO7NmzFRUVpQceeEA33XST\nHn30Uc2ePVuDBg2SJOXk5FxVZmBgoCTVWSYAAADQnJGgw2HOnz8vSWrfvr11W7du3a467he/+IVc\nXP7zUj179qy6du1a45jIyEgVFxfXSHQjIyOtP/v7+8vPz0/nz5/XuXPnZDabr7pWZGSkzp49e2OV\nqkdgYKCCgoKsjzt06CDpP8+FJHXs2NH68w8//KCgoCAFBwdbt7m7u6tjx47W7v7S1c9bp06dapRp\nTyaTqdbtL7/8sk6cOKEPPvhA3377rdavX6+1a9c26EuQusoEAAAAmjO3+g8B7KO8vFxSzWTsyhbw\ny9zd3Ws8Lisrk8ViqbHt8uMry6qqqrrqGBcXF+tY9Z+XYTabr5kY1hbb9fp5GZdjuPILiCvrW15e\nflWctZVTW9ytW7euNYY1a9Zo7dq1te674447au3mHhwcrMzMzKtiz8/PV2ho6FXHl5SUaOvWrVq5\ncqW6d+8uSRo4cKB+9atfWXtAhISEKC8vr8Z5ubm5klRrmQAAAEBzRws6HKZdu3aSZJ0kTZJSU1Pr\nPS8iIkInTpyosS01NVV+fn4KCQmxbvvhhx+sP+fl5amgoEDt2rVTx44dZTKZrirj5MmT6ty5s6Tq\n5Pbnk6xdWV5j5efnW5NQSTp37pxMJpP1ufi5iIgI5ebmKiMjw7qtvLxcZ8+eVZcuXazbTp8+XeO8\nM2fO1FlmY8ag9+3bV8eOHVNFRYV125EjR1RWVqZ+/fpddbzZbJbFYrnqi4TKykrrFw59+/bVt99+\nW2P/V199pVatWql37961xgEAAAA0ZyTocJioqCiFhIRo7dq1Kiws1MWLF5WQkFBv9+bf/OY32r59\nu/71r3+pqqpKR48e1aZNm/Twww/XOHfTpk368ccfVVJSovj4eHl5eWnIkCEKCgrSyJEjFRcXpzNn\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "inception_split(df, \"dropout_prob\", dropout_probs, \"num_layers\", num_layers)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n8UfbKz26devG0aNHqzsMERGRUqmvEhERkbqi2qfTu7i44OLiUuxYXl6ebUqin58f6enp1R2GiIhI\nqdRXiYiISF2h98SLiIiIiIiI1BG1sju9p6cnZrMZd3d3UlNTi01fLM217/p0hPDwcIeXWRvUDuei\ndjgXtcO5hIeH13YIlaK+ynHUDueidjiP+tAGqF/tEKkLamUk/rbbbmPfvn0A7Nu3j9tvv702whAR\nESmV+ioRERFxRtU+En/69GlWrVrF5cuXcXFxYd++fUyZMoVly5bx+eefExISQu/evas7DBERkVKp\nrxIREZG6otqT+NatW/PHP/6xxPHZs2dXd9UiIiIVor5KRERE6gptbCciIiIiIlIPFRQUEBkZyYYN\nG2o7lDphzJgxPPvss7UdRrmUxIuIiIiIiEit+c9//sOPP/5Y22HUGUriRUREREREpNYsWbKEY8eO\n1XYYdYaSeBERERERkXrgp59+IjY2ls6dOxMdHc3u3btt52bOnMnkyZOZMWMGnTt35ty5cwCsXbuW\n3/zmN9x+++3ceeedzJs3j7y8PAD2799PZGQkO3fuZOjQodx2220MGDCAvXv32srNycnhL3/5C/37\n96djx44MHDiQf/zjH7bzS5Ys4e677y4W56JFi+jXrx8Ad999Nz/++CN//OMfGTp0aIXauWTJEu67\n7z42bNhA3759ue2224iNjbW96vD8+fNERkbywQcf0KdPH55//nkALly4wNNPP82dd95Jp06deOCB\nB9i/f3+xsq1WK/Pnz6dHjx706NGDF154gdzc3ArFVVOUxIuIiIiIiNRxVquVSZMmERoayu7du/n7\n3//Ohx9+WOyagwcP0qFDBw4ePEizZs3YsGED8+fPZ+bMmRw6dIh33nmHL774gr/+9a/F7nvnnXdY\ntmwZ+/fvp2/fvjz11FNkZmYC8Kc//Ym9e/fy1ltvcfjwYWbMmMFLL73Etm3bKhT3rl27APjjH//I\npk2bKtzehIQEDh48yObNm9mxYwcGg4Hp06cXu2bjxo2sXbuWl156iYKCAh599FHc3NzYvHkz+/fv\nJyoqit/97ndcuHDBds+OHTsICwtj586drFy5ki+//JK//e1vFY6rJiiJFxERERERqeO+//574uPj\nmTRpEr6+voSEhDBx4sRi1xgMBsaOHYurqysGg4G///3vjBgxgl69euHq6srNN9/MmDFj2LhxIxaL\nxXbfww8/TPPmzfH29mbSpEnk5eWxa9cuMjMz2bhxI5MmTaJNmza4urrSv39/7r77bj7++ONqbW9u\nbi4zZszA19eX4OBgHnvsMQ4fPkxycrLtmkGDBhEWFobBYGD37t3Ex8cza9YsAgMD8fT0ZPLkyXh6\nehZ74HDTTTcxbtw4PDw8iIyMZOjQoXz++efV2pbKUhIvIiIiIiJSx128eBGAZs2a2Y61a9eu2DVN\nmzbFaPxfCnj27Fnatm1b7Jo2bdqQnZ1dLBlu06aN7Wd/f3/8/Py4ePEi586dw2KxlKinTZs2nD17\n9sYbVYbAwECCgoJsn5s3bw787/cAEBERYfs5Pj6eoKAggoODbcfc3NyIiIiwLS2Akr+zFi1aFCvT\nGSiJFxERERERqePMZjNwdbS9yLWj6XA1ab1WXl4eVqu12LGiz9eWU1hYWOIao9FoWzt/fRkWi6XY\n/de7Pq6quL6MohiufUhxbXvNZnOJOO2VYy9uDw+PG4rV0ZTEi4iIiIiI1HFNmjQBsG3uBnDy5Mky\n72nZsiUnTpwoduzkyZP4+fkREhJiOxYfH2/7OT09nYyMDJo0aUJERAQGg6FEGT/99BOtWrUCribA\n128Md215VWUymUhLS7N9PnfuHAaDwfZ7uF7Lli1JS0vj0qVLtmNms5mzZ8/SunVr27Fffvml2H1n\nzpwptczaoiReRERERESkjuvYsSMhISG88cYbZGZmkpSUxJtvvlnmiPiDDz7Ixo0b+frrryksLOSH\nH35g9erVjB49uth9q1ev5vz58+Tk5LBs2TK8vb256667CAoKIjo6mqVLl3LmzBny8/PZtm0be/bs\nITY2FoDWrVtjMpnYuXMnhYWF/Oc//+Hw4cPF4vDy8uKXX37BZDJVuL0eHh689tprZGZmkpKSwrvv\nvssdd9xRbIr9tXr37k2TJk2YN28eGRkZZGVl8dprr2GxWLjvvvts1507d461a9diNps5duwYmzZt\nYtCgQRWOqya41nYAIiIiIiIicmPc3d1ZsWIFc+bM4c477+Smm27iueeeY9++faXe8+CDD5Kdnc28\nefO4ePEijRs35uGHH+axxx4rdt3999/PpEmTOH36NE2aNOGtt97Cx8cHgHnz5jF//nzGjx+PyWSi\nZcuWLFmyhN69ewPQr18/YmJimDFjBhaLhejoaB599FH+/ve/28ofM2YMK1euZNOmTXz11VcVam9A\n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\nRzRy5Ej97Gc/0/jx401+JwEAg4FxCgDAmnighyNHjqioqCjph4VkH4waGxv12GOP6ec//7k2b96s\n2bNna/v27YnnDx06pLKyMlVUVCgYDGr//v2SpMcee0xLly7V5s2btXz58l4/k0xOTo5KS0u1fv16\n7d+/X/X19ZKkwsJCSdJPfvITFRUVafPmzXK73SovL9fXvvY1bdmyRT/60Y/08MMPKxaLSZLefvtt\nXXvttdq6davmzp2rHTt29O/NAgAMOcYpAAAz8UAPoVCoVxliKBTSvffeK0lqb2/Xt771LS1btizx\n/Ntvv63LLrssMaPxjW98Qzt27Eh8EJk1a1bieldeeaWOHDmib3/72yovL09cY/r06YkPO2fjcrl0\n3333affu3dqzZ48qKys1YcIE3XTTTbryyit7fe/x48fV0tKiRYsWSZIuueQSjR49Wh988IEkacKE\nCZo2bVqiTS+88ELqbxQAwBKMUwAAknigh9GjR6u5uTnx9ahRo7R582ZJUmVlpSKRSK/vb21t1ahR\noxJfZ2dnS+oqK+y+Xs/nQqGQJKmqqkrPPfecwuGw4vG4DMM4b9uys7N144036sYbb1QgENCBAwe0\nefPmXh+0pK4PdJFIRGvWrEk8Fg6HFQwGJUk+n69XfN2PAwDsj3EKAEASD/Qwbdo0tbS06OOPP9bk\nyZPP+/25ubk6cuRI4utgMCiXy6WcnJzE1z2fGzVqlJqamvTYY49pw4YNmjRpkk6cOKE777zznK/j\n9/vV0NCQ2OE3Ly9Py5cv18GDB3Xs2LHE60lSfn6+srOzEx/qejpw4IBaW1t7tannhyUAgL0xTgEA\nWBMP9OD1erVixQpVVFTo5MmTkqR4PK6XX35ZBw8eTJQjdpsxY4YOHz6suro6SdLevXs1c+ZMZWRk\nSJLefPNNBYNBxeNxvfrqq5o+fbpaW1uVlZWlkpISxWIx7du3T1JXGeTZ+P1+lZeXq7a2NvHY0aNH\n1djYqNLSUmVkZKi9vV2xWExjxoxRQUGBqqurJXXNwmzevDlx/ePHj+vjjz+WJFVXV2v69OlmvHUA\ngCHAOAUAYCYeOM2yZcvk8/m0ceNGRaNRRaNRlZSU6O6779bMmTN7fW9hYaHuuOOOxIY8Y8eO1e23\n3554/oorrtDGjRtVX1+v0tJSLVq0SJmZmZo1a5buvPNO5eXl6eabb9b777+v+++/X9/73veStmna\ntGm6/fbbtX37drW1tSkejysvL09r1qzRmDFj5PP55PP5dPvtt+uhhx7SXXfdpe3bt+sPf/iDXC6X\nvvvd78rj8UiSLr74Yj377LM6fPiwPB6PfvGLXwzemwkAMB3jFACkN5fRl0VOAIaFAwcOqKqqSvfd\nd5/VTQEA4AyMUwBwfpTTAwAAAADgECTxAAAAAAA4BOX0AAAAAAA4BDPxAAAAAAA4BEk8AAAAAAAO\nQRIPAAAAAIBDkMQDAAAAAOAQJPEAAAAAADgESTwAAAAAAA7x/xg9TY5T6kT8AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "inception_split(df, \"num_layers\", num_layers, \"dropout_prob\", dropout_probs)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Loss Functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I've been scratching my head a lot lately thinking about how to implement sampled softmax loss without having to split tensors across time, an operation that destroys any gain in runtime efficiency offered by negative sampling. Let's start by working through how tensorflow samples classes by default: __log-uniform (Zipfian) base distribution__:\n", "\n", "$$\n", "\\text{Prob(c)} = \\dfrac{\\log(c+2) - \\log(c + 1)}{\\log(\\text{vocab size} + 1)}\n", "$$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nSdoiIiIiGuAfgoSaV5R6tmAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "%matplotlib inline\n", "vocab_size = 40000\n", "x_axis = np.arange(vocab_size)\n", "zipfian = (np.log(x_axis + 2) - np.log(x_axis + 1)) / np.log(vocab_size + 1)\n", "plt.figure(figsize=(10, 6))\n", "plt.semilogy(x_axis, zipfian)\n", "plt.title('Log-Uniform Zipfian Sampling Distribution.')\n", "plt.xlabel('Word ID (in order of decreasing freq.)')\n", "plt.ylabel('Sampling probability')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "batch_size = 64\n", "num_samples = 512\n", "samples = [np.random.choice(x_axis, p=zipfian) for _ in range(num_samples)]\n", "plt.hist(samples)\n", "plt.title('Histogram of %d Sampled Values' % num_samples)\n", "plt.xlabel('Sampled Word ID')\n", "plt.ylabel('Counts')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Candidate Sampling - TensorFlow\n", "\n", "[[Link]](https://www.tensorflow.org/extras/candidate_sampling.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### What is Candidate Sampling\n", "\n", "__Goal__: Learn a compatibility function $F(x, y)$ which says something about the compatibility of a class $y$ with a context $x$. \n", "\n", "__Candidate sampling__: for each training example $(x_i, y_i^{\\text{true}})$, only need to evaluate $F(x, y)$ *for a small set of classes* $\\{C_i\\} \\subset \\{L\\}$, where $\\{L\\}$ is the set of all possible classes (vocab size number of elements). \n", "\n", "We represent $F(x, y)$ as a *layer that is trained by back-prop from/within the loss function*." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### From Scratch: tf.nn.sampled_softmax_loss\n", "\n", "My version of tensorflow's op, customized with DynamicBot in mind. \n", "\n", "Here is a subset of the source code with all the irrelevant parts removed, with the aim of understanding the implementation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "def sampled_softmax_loss(output_projection, labels, state_outputs, num_sampled, vocab_size, sess=None):\n", " \"\"\"\n", " Args:\n", " output_projection: (tuple) returned by any Decoder.get_projections_tensors()\n", " - output_projection[0] == w tensor. [state_size, vocab_size]\n", " - output_projection[1] == b tensor. [vocab_size]\n", " labels: 2D Integer tensor. [batch_size, None]\n", " state_outputs: 3D float Tensor [batch_size, None, state_size].\n", " - In this project, usually is the decoder batch output sequence (NOT projected).\n", " - N.B.: Assumption is that 'None' here is always the same 'None' in labels (target sequence length).\n", " num_sampled: number of classes out of vocab_size possible to use.\n", " vocab_size: total number of classes.\n", " \"\"\"\n", "```\n", "\n", "First step: unpack output projection tuple and reshape for convenience. \n", "* Possible optimization: Don't do reshapes. They seem to be slow for sparse stuff. \n", "* SparseTensors may be useful here. Look into later. \n", "\n", "```python\n", " # Extract transpose weights, now shape is [vocab_size, state_size].\n", " # Use tf.reshape which is dynamic as opposed to static (i.e. slow) tf.transpose.\n", " weights = tf.reshape(output_projection[0], [vocab_size, -1])\n", " state_size = tf.shape(weights)[-1]\n", " biases = output_projection[1]\n", "```\n", "\n", "__Shape check__:\n", "* weights: [vocab size, state size]\n", "* biases: [vocab size]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, enter our implementation of what tensorflow has named as ```_compute_sampled_logits```. \n", "* The values passed in ```name_scope``` are for graph visualization reasons. Not important.\n", "\n", "```python\n", "\n", " with tf.name_scope(\"compute_sampled_logits\", [weights, biases, state_outputs, labels]):\n", " # Smush tensors so we can use them with tensorflow methods.\n", " # Question: Docs suggest we should reshape to [-1, 1] so I'm keeping.\n", " # but original code had it as just [-1].\n", " labels = tf.cast(labels, tf.int64)\n", " labels_flat = tf.reshape(labels, [-1, 1])\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Sampling__: Returns 3-tuple:\n", "1. sampled_candidates: [num_sampled] tensor\n", "2. true_expected_count shape = [batch_size $\\times$ None, 1] tensor\n", " * Entries associated 1-to-1 with smushed labels.\n", "3. sampled_expected_count shape = [num_sampled] tensor\n", " * Entries associated 1-to-1 with sampled_candidates.\n", " \n", "```python\n", " # Sample the negative labels.\n", " sampled_values = tf.nn.log_uniform_candidate_sampler(\n", " true_classes=labels_flat, num_true=1, num_sampled=num_sampled,\n", " unique=True, range_max=vocab_size)\n", " S_i, Q_true, Q_samp = (tf.stop_gradient(s) for s in sampled_values)\n", "```\n", "\n", "__What's going on here__: \n", "* NOTE: Remember we are inside a single time slice/step right now!!!\n", "* ```S_i```: (int64) tensor of shape [num samples], using naming convention of article. The subset of the vocabulary we'll be using henceforth for *all examples in the current batch*. \n", "* ```Q_true```: (float) tensor of shape [batch size, 1]. The probability of sampling the true class. Period. Literally the value $Q(y \\mid x)$ for each training example out of ```batch_size``` total. \n", "* ```Q_samp```: (float) tensor of shape [num samples]. The value of $Q(y_{samp} \\mid \\text{log uniform})$ for all $y_{samp}$ in the tensor ```sampled```. That's it. *Independent of, and not associated with, batch size*. \n", "\n", "__Epiphany__: Just realized something. The reason we should *not* do the suggestion from stackoverlow is because for a given sampled sentence, *it would force all sampled words in that sentence to be from the same subset of size num samples*. We would get pretty terrible sentences, especially when the next word is likely to be rare given the previous word. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "\n", " # Casting this back to actually be flat.\n", " batch_times_none = tf.shape(labels_flat)[0]\n", " labels_flat = tf.reshape(labels, [-1])\n", " # Get concatenated 1D tensor of shape [batch_size * None + num_samples],\n", " C_i = tf.concat([labels_flat, S_i], 0)\n", "\n", " # The embedding_lookup here should be thought of as embedding\n", " # the integer label and sampled IDs in the state space.\n", " # all_w has shape [batch_size * None + num_samples, state_size]\n", " # all_b has shape [batch_size * None + num_samples]\n", " all_w = tf.nn.embedding_lookup(weights, C_i, partition_strategy='div')\n", " all_b = tf.nn.embedding_lookup(biases, C_i)\n", " \n", " true_w = tf.slice(all_w, begin=[0, 0], size=[batch_times_none, state_size])\n", " true_b = tf.slice(all_b, begin=[0], size=[batch_times_none])\n", " \n", " sampled_w = tf.slice(all_w, begin=[batch_times_none, 0], size=[num_sampled, state_size])\n", " sampled_b = tf.slice(all_b, begin=[batch_times_none], size=[num_sampled])\n", "\n", " state_outputs = tf.reshape(state_outputs, [batch_times_none, state_size])\n", " state_outputs = tf.cast(state_outputs, tf.float32)\n", " \n", " true_logits = tf.reduce_sum(tf.multiply(state_outputs, true_w), 1)\n", " true_logits += true_b - tf.log(Q_true)\n", "```\n", "\n", "Question: how are we not done here? \n", "* Answer 1: because we haven't softmaxed yet...\n", "* Answer 2: Ohhhhhhh. It's because true logits only gives us the log probabilities *for the target ys*. It's important to remember we are basically building a smaller network output over num samples (+1) space instead of vocab space. So far, we just have the +1 part. Now we need the num samples part. And yes, technically the num samples argument should clarify that it ends up using num samples +1.\n", "\n", "I see now that remove accidental hits defaults to True because it's probably easier than dealing with " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", " # Matmul shapes [batch_times_none, state_size] * [state_size, num_sampled].\n", " sampled_logits = tf.matmul(state_outputs, sampled_w, transpose_b=True) + sampled_b\n", " # NO. BOO.\n", " #sampled_logits += _sparse_to_dense(sampled_logits, tf.expand_dims(labels_flat, -1), sampled, num_sampled) \n", " sampled_logits -= tf.log(Q_samp)\n", "\n", " # Construct output logits and labels. The true labels/logits start at col 0.\n", " # shape(out_logits) == [batch_times_none, 1 + num_sampled]. I'M SURE.\n", " out_logits = tf.concat([true_logits, sampled_logits], 1)\n", " # true_logits is a float tensor, ones_like(true_logits) is a float tensor of ones.\n", " out_labels = tf.concat([tf.ones_like(true_logits), tf.zeros_like(sampled_logits)], 1)\n", "\n", " return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=out_labels, logits=out_logits))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/DataVizUtils.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Visualization Utilities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Because I should probably start standardizing my data exploration." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import sys\n", "import os\n", "import pandas as pd\n", "from nltk import word_tokenize\n", "from collections import Counter\n", "from itertools import chain\n", "import matplotlib.pyplot as plt, mpld3\n", "%matplotlib inline\n", "import re\n", "\n", "sys.path.append('..')\n", "from imp import reload\n", "from data import reddit_preprocessor, DataHelper\n", "from data.reddit_preprocessor import *\n", "import json\n", "from pprint import pprint\n", "from jupyterthemes import jtplot\n", "\n", "jtplot.style('onedork', ticks=True, fscale=1.5)\n", "jtplot.figsize(x=11., y=8.)\n", "DATA_ROOT = '/home/brandon/Datasets/test_data'\n", "FROM = os.path.join(DATA_ROOT, 'train_from.txt')\n", "TO = os.path.join(DATA_ROOT, 'train_to.txt')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "COL_NAMES = ['inp_sentence', 'resp_sentence']\n", "\n", "def make_dataframe(data_dir):\n", " \"\"\"\n", " data_dir: contains train_from.txt, train_to.txt\n", " \"\"\"\n", " from_lines = []\n", " to_lines = []\n", " with open(os.path.join(data_dir, 'train_from.txt'), 'r') as from_file:\n", " with open(os.path.join(data_dir, 'train_to.txt'), 'r') as to_file:\n", " from_line = from_file.readline()\n", " to_line = to_file.readline()\n", " while from_line and to_line:\n", " from_lines.append(from_line.strip())\n", " to_lines.append(to_line.strip())\n", " from_line = from_file.readline()\n", " to_line = to_file.readline()\n", " df = pd.DataFrame(np.stack((from_lines, to_lines), 1),\n", " columns=COL_NAMES) \n", " return df\n", " \n", "def word_tokenize(df):\n", " word_freq = {}\n", " \n", " # I know. I KNOW.\n", " sentences = np.squeeze(list(((map(\n", " DataHelper.word_tokenizer, \n", " list(np.expand_dims(df[COL_NAMES[0]].values, 1)))))))\n", " \n", " word_freq['from'] = Counter(chain.from_iterable(sentences))\n", " # Stop judging me.\n", " sentences = np.squeeze(list(((map(\n", " DataHelper.word_tokenizer, \n", " list(np.expand_dims(df[COL_NAMES[1]].values, 1)))))))\n", " word_freq['to'] = Counter(chain.from_iterable(sentences))\n", " \n", " return word_freq\n", "\n", "def plot_freq_dist(word_freq, n):\n", " words_dict = {}\n", " for dist in word_freq:\n", " most_comm = word_freq[dist].most_common(n)\n", " words, counts = zip(*most_comm)\n", " words_dict[dist] = words\n", " counts_series = pd.Series.from_array(counts)\n", "\n", " plt.figure(figsize=(8, 5))\n", " ax = counts_series.plot(kind='bar')\n", "\n", " ax.set_title('Frequency Distribution: ' + dist)\n", " ax.set_ylabel('Counts')\n", " ax.set_xlabel('Words')\n", " ax.set_xticklabels(words_dict[dist])\n", "\n", " from_words = set(words_dict['from'])\n", " to_words = set(words_dict['to'])\n", " common_words = from_words.intersection(to_words)\n", " common_word_freqs = [\n", " [word_freq['from'][w] for w in common_words],\n", " [word_freq['to'][w] for w in common_words]]\n", " \n", " ind = np.arange(len(common_words))\n", " plt.figure(figsize=(8, 5))\n", " p1 = plt.bar(ind, common_word_freqs[0], width=0.5, color='b')\n", " p2 = plt.bar(ind, common_word_freqs[1], width=0.5, color='r')\n", " plt.xticks(ind, common_words)\n", " plt.legend((p1[0], p2[0]), ('From', 'To'))\n", " return common_words" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pd.set_option('display.max_colwidth', 10000)\n", "df = make_dataframe(DATA_ROOT)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "pd.set_option('display.max_colwidth', 10000)\n", "df.head(len(df.index))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "scrolled": true }, "outputs": [], "source": [ "word_freq = word_tokenize(df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "common_words = plot_freq_dist(word_freq, 5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "common_words" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# From TensorBoard to JSON to Matplotlib" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "import numpy as np\n", "import pandas as pd\n", "import yaml\n", "import re\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "from jupyterthemes import jtplot\n", "from scipy.interpolate import spline\n", "jtplot.style('onedork', ticks=True, fscale=1.5)\n", "jtplot.figsize(x=11., y=8.)\n", "pd.set_option('display.max_colwidth', 1000)\n", "\n", "# --------------------------------------------------------\n", "# Globals\n", "# --------------------------------------------------------\n", "SEQ = os.getenv('SEQ')\n", "STATIC = os.getenv('STATIC')\n", "\n", "BASE_DIR = os.path.join(os.getcwd(), 'individual_tb_plots')\n", "ACC_DIR = os.path.join(BASE_DIR, 'accuracy')\n", "TRAIN_DIR = os.path.join(BASE_DIR, 'train')\n", "VALID_DIR = os.path.join(BASE_DIR, 'valid')\n", "COL_NAMES = ['wall_time', 'iteration']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Format the dictionary configuration dictionaries" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'BasicDeepGRU': {'dataset_params': {'config_path': 'configs/cornell.yml'},\n", " 'model_params': {'attention_size': None,\n", " 'base_cell': 'GRUCell',\n", " 'batch_size': 256,\n", " 'encoder.class': 'BasicEncoder',\n", " 'num_layers': 3}},\n", " 'BasicGRU': {'dataset_params': {'config_path': 'configs/cornellBasic.yml'},\n", " 'model_params': {'attention_size': None,\n", " 'base_cell': 'GRUCell',\n", " 'batch_size': 256,\n", " 'encoder.class': 'BasicEncoder',\n", " 'num_layers': 1}},\n", " 'BasicLSTM': {'dataset_params': {'config_path': 'configs/example_cornell.yml'},\n", " 'model_params': {'base_cell': 'LSTMCell',\n", " 'batch_size': 256,\n", " 'encoder.class': 'BasicEncoder',\n", " 'num_layers': 1}},\n", " 'BidiGRU': {'dataset_params': {'config_path': 'configs/cornellBasicBidi.yml'},\n", " 'model_params': {'attention_size': None,\n", " 'base_cell': 'GRUCell',\n", " 'batch_size': 256,\n", " 'encoder.class': 'BidirectionalEncoder',\n", " 'num_layers': 1}},\n", " 'BidiLSTM': {'dataset_params': {'config_path': 'configs/example_cornell.yml'},\n", " 'model_params': {'base_cell': 'LSTMCell',\n", " 'batch_size': 128,\n", " 'encoder.class': 'BidirectionalEncoder',\n", " 'num_layers': 1}}}\n", "{'basic': 'BasicGRU',\n", " 'basicBidi': 'BidiGRU',\n", " 'basicDeep': 'BasicDeepGRU',\n", " 'basicLSTM': 'BasicLSTM',\n", " 'bidiLSTM': 'BidiLSTM'}\n" ] } ], "source": [ "from copy import deepcopy\n", "\n", "omfg = {}\n", "configs = {}\n", "run_keys = set()\n", "for fname in os.listdir(ACC_DIR):\n", " name = re.search(r'(?:-)(\\w+)(?:-)', fname).group(0)[1:-1]\n", " run_keys.add(name)\n", "run_keys = list(run_keys)\n", "\n", "\n", "for k in run_keys:\n", " fname = os.path.join(SEQ, 'out/cornell', k, 'config.yml')\n", " with open(fname, 'r') as config_file:\n", " configs[k] = yaml.load(config_file)\n", "\n", "def filtered_configs(configs):\n", " _configs = [(k, deepcopy(configs[k])) for k in configs]\n", " # Remove dataset name (assuming they're all cornell)\n", " _configs = list(filter(lambda c: c[1].pop('dataset'), _configs))\n", " # Remove model name (all are DynamicBot)\n", " _configs = list(filter(lambda c: c[1].pop('model'), _configs))\n", " # misc.\n", " _configs = list(filter(lambda c: c[1]['model_params'].pop('ckpt_dir'), _configs))\n", "\n", " for k in ['model_params', 'dataset_params']:\n", " kk_list = list(_configs[0][1][k])\n", " for kk in kk_list:\n", " vals = set()\n", " for conf in _configs:\n", " conf = conf[1]\n", " vals.add(conf[k].get(kk))\n", " if len(vals) == 1 and 'attention' not in kk:\n", " # Remove items that are all the same.\n", " _wtf = list(filter(lambda c: c[1][k].pop(kk), _configs))\n", " if _wtf: _configs = _wtf\n", " return {k: v for k, v in _configs}\n", " \n", "def renamed(name):\n", " _omfg = name\n", " if 'idi' in name:\n", " name = name.replace('basic', '')\n", " name = name.replace('bidi', 'Bidi')\n", " name = name.replace('basic', 'Basic')\n", " if 'LSTM' not in name:\n", " name += 'GRU'\n", " omfg[_omfg] = name\n", " return name\n", "\n", "f_configs = filtered_configs(configs)\n", "f_configs = {renamed(n): v for n, v in f_configs.items()}\n", "pprint(f_configs)\n", "pprint(omfg)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df_acc = {}\n", "df_train = {}\n", "df_valid = {}\n", "\n", "for k in run_keys:\n", " fname = 'run-'+k+'-tag-evaluation_accuracy.json'\n", " df_acc[omfg[k]] = pd.read_json(os.path.join(ACC_DIR, fname))\n", " \n", " fname = 'run-'+k+'-tag-evaluation_loss_train.json'\n", " df_train[omfg[k]] = pd.read_json(os.path.join(TRAIN_DIR, fname))\n", " \n", " fname = 'run-'+k+'-tag-evaluation_loss_valid.json'\n", " df_valid[omfg[k]] = pd.read_json(os.path.join(VALID_DIR, fname))\n", "\n", " df_acc[omfg[k]].columns = COL_NAMES + ['accuracy']\n", " df_train[omfg[k]].columns = COL_NAMES + ['training loss']\n", " df_valid[omfg[k]].columns = COL_NAMES + ['validation loss']" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "run_keys = list(f_configs.keys())\n", "def plot_df(df, y_name, run_key, n_points=25, use_spline=True, plot_perp=False):\n", " \"\"\"Assuming df is from tensorboard json . . . \"\"\"\n", " if plot_perp:\n", " df = df.loc[2:]\n", " df[y_name] = np.exp(df[y_name])\n", " \n", " if use_spline:\n", " iters = df.iteration\n", " iters_new = np.linspace(iters.min(), iters.max(), n_points)\n", " smooth_y = spline(iters, df[y_name], iters_new)\n", " plt.plot(iters_new, smooth_y, label=run_key)\n", " else:\n", " plt.plot(df['iteration'], df[y_name], label=run_key)\n", " \n", " plt.title(y_name.title())\n", " plt.ylabel(y_name)\n", " if y_name == 'accuracy':\n", " plt.ylim([0., 1.])\n", " plt.yticks(list(np.arange(\n", " 0., float(plt.yticks()[0][-1])+0.1, step=0.1)))\n", " leg_kwargs = dict(fontsize='x-small',\n", " loc='upper left')\n", " else:\n", " plt.yticks(list(np.arange(\n", " 0., float(plt.yticks()[0][-1])+1., step=1.)))\n", " leg_kwargs = dict(fontsize='small',\n", " loc='upper right')\n", " plt.xlim([0., 1.0e4])\n", " plt.xlabel('Iteration')\n", " plt.legend(**leg_kwargs)\n", "\n", "def plot_runs(df_dict, y_name, n_points=25, \n", " use_spline=True, plot_perp=False,\n", " figsize=(10,7)):\n", " \"\"\"Calls plot_df for each key in the df_dict.\"\"\"\n", " fig = plt.figure(figsize=figsize)\n", " for k in run_keys:\n", " plot_df(deepcopy(df_dict[k]), y_name, k, \n", " n_points=n_points,\n", " use_spline=use_spline,\n", " plot_perp=plot_perp)\n", " return fig" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:1742: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", " warnings.warn(\"This figure includes Axes that are not \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\ndI2xo7KC7qlp9ZYlmEym4Hra/LwcJk+dhWEYwSS9sqI8WPeH97rdNcHPbPP61cTFxfOjh57gb3/9\nPdXVLgBqql1YkzrXe0+RdQl1TV291k7bCvyQu4KagIHdGwdAz8T2NYUvIiLSngUCAQzDhMkw0aVL\nMukZffjw3dfYvXMr58+dJiY2Nlg3tUdPJk+dRXbWebZs+IJX//xbIiLMpKX3CmnTVlpCctfQ3QiW\nPfRjRo+ddM04EhKTSEvP4MypEwCUlRYTF5+Iraw0+GfshKn0zOiDvawUv9+HxWINXvP5fMxZcGcw\nsbRao4PLGKD24bjLhbU7UJ08cYSw8HDGjJtcLw5zZGRw+cS1bFj7GRFmM7PmLgqWXS4qoFv3VAxT\naKqYmppOaWkxHo/num22Fkp0f8jjwGGEB/fS7RHXwvGIiIjINVksVqJjYomOiSWxU2cWLroHk8ng\n7JlMqqur8fv9DB46krj4BAYOHsb0utNSw8LC8Hg9TJs5j+EjxxKfkMjgYaOIiDBTVBi6hemJ44ew\nWKOZNW8xiZ06M3rsJHpm9OXihXPBOldiiItPoG//QSxf8QSXsi9y7kztzgz7vtnJkGEjGTNuMgmJ\nSUyaOovRYydSWnIZt7uGo4f2s2DxPaT17EWX5K7cec8DxMTEBdcWAyxeuowuyV0ZMGgYYydM5cC+\nr4HaWd/1X65i9vzFzJm/hK7dU4lPSGTo8NE88bNnMQyDkrqZ5atxOir5+qstjBg9nq7dap8+PHP6\nBIZhsPSeB0ju2p3ETkkMHTGG6bMXsG93/d0dWistXfgBI+Cn3Iig0l37209qtH4XEBERaa3uW/5Y\n8Ge3201hfg4r33sjuN50/ZpVTJ0xl5lz76C0pJiN6z7nzrrkrSA/lzWr/8mU6XNYuOReyu02Vq/6\nkLLS4pCZ35rqaj764E3mLbyLcROmYCsrZdVH72IrKyE2rnZG7L/88r8B4PV6KC+3c/rkMfbs3BZs\nIy8nmy8/+4ipM+YyZ8ESykpLWPXR34NJ9eYNq5m7YCn3LX8Mk8lE9sXzfP7JByHv9cL5szzyxDO4\na2rYtmktpzKPBa9lHj9MWVkJk6bMZPmKnxAVZaHcXsaZk8fZt+crnE7HdT/H/Xt3MWrMBOYvupu/\nv/lXPG437731CrPnLeahx35GRIQZW1kJ2zat4ejh/TcyVC3CmDB9cYf7bj6l1yAMw0Tehavvfzcp\n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\nhBBCCCG80v8D6fPvPrxMDVYAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\niIiI3BvTjOALdNDcUcctz2UikUe/4t2wT3RXlK+l4oODHNq/m0sXzvObX/6UcCTMgqeXDHXXRERE\nRGQYG9aJbk5uHtnZuVys6plQPhQKUX3pAlOmFg1hz0RERERkuBvWNbq57jwAPJ7GhPaWZg/Timbd\n0zlSUlJJSU1NaLNYLJgYpMTmZpQkFZsIXHFOYorxyKA4Jz/FWB6SYZ3oOp3RSbYDgcR52AIBH07n\nHZZH7KO4ZBkrytcltL3+29cJBh7tXX8iIiIi8mgN60Q3cfLCRObdF0wBoOKDg5w9fSKhLTV7NCYG\n3gdcZUceD90jA4pz8lKMRwbFOfkpxiPEqHGP/C2HdaLr90XXgHc4nfj9PevBOxyuhO3BeL1deL2J\ny9S5MvPjSxCKiIiISHIa1tlec6w2NzsnN6E9OycXT9PAc7aJiIiIiMAwT3Q9TY20tjYzfcaceJvV\nZmPK1Olcu3J5CHsmIiIiIsPdsC5dADh8YA/rNz1PwO+j9uYNSpaUYrXaOH7s0FB3TURERESGsWGf\n6H547DAOh5PiRcsoWVpO3a0afvX//p3Ojvah7pqIiIiIDGPDPtEFOHLwfY4cfH+ouyEiIiIij5Fh\nXaMrIiIiIvKglOiKiIiISFJSoisiIiIiSemxqNH9pFms0Y89dvLMIe6JPEzdi4KY+WOGuCfysCjG\nI4PinPwU45HBsFgwHvEY6wgd0TUxDAPDMO5+qDzGTGx2u+Kc1BTjkUFxTn6K8UhhGAYpKamP7P1G\n5IhuV3MdX/nr/8q//O//iaepcai7Iw9JrjtPcU5yivHIoDgnP8V4ZOgdZ6+365G85wgd0RURERGR\nZKdEV0RERESSkhJdEREREUlKSnRFREREJClZxxdM//5Qd2IohEJBrl+tJhQKDnVX5CFSnJOfYjwy\nKM7JTzEeGR51nI2S0s3mI3knEREREZFHSKULIiIiIpKUlOiKiIiISFJSoisiIiIiSUmJroiIiIgk\nJSW6IiIiIpKUlOiKiIiISFJSoisiIiIiSUmJroiIiIgkJdtQd+BRW1C8hJKlZaRnZFBXW8O727dw\nu652qLsld2CxWlmybCVzn1xAekYWzZ5GDu3fxfmzpwCw2mysWruZWbOfxGa3c+nCeXZs/z3erq74\nOTKzslm36XkKJhUSDAT46MMP2P/+TkyzZ62UiQVTWLXuGfJHjaa1pZkDe3dy7szJR/55Rzq7w8Ff\n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\nzu4d26i7dROIzsJUtmoDKalpmKZJ2ar1TJg4mbd+/2u6ek1HNxCjpHTziCrfXrysnOJFy3ClpFJ3\nq4ad7/yB+tgvUoaXBU8vYcPmFwbc19XVyav/+H3sDgdrNzzLjFnzME2T6ktV7Ny+ha5eK6XkuvNY\nv+nTjJ84GZ+3i1MfHWPfnh0JBexTphaxau1mct15tDR7tKTkEPrat75D5bnT8RF8xTh5zJ1fzJJl\n5WTn5NLsaWLfnh1UnT8NKM7JwG63U7Z6I7NmP4nD6aKp8TaHD+ym8pxinAxWlK9l4aJlCUsAGxYL\nK1dvZO78Ymw2GzeuXWHH9i0JFx1p6Rms3/Q8U6YWEQoGqTx3mvd2bE0oORgzbgLrNj7H6CfG0tHe\nzrEj+znWZ7rJuU8uZFnZGjIysmhsqGfPe9ELqLsZcYmuiIiIiIwMI6ZGV0RERERGFiW6IiIiIpKU\nlOiKiIiISFJSoisiIiIiSUmJroiIiIgkJSW6IiIiIpKUlOiKiDyAufOL+e73/4m584vjbalpadjt\n9iHpj8PhJDU1Lb69onwt3/3+P5GVnTMk/RERGQ6U6IqIfAKmTC3iy9/4O1J7LV/6qDwxZhxf/sZ/\nIW/U6Hhb5fkzbPndr+66apCISDKz3f0QERG5m3HjJ5KSkjok750/egwZmVkJbQ31t2iovzUk/RER\nGS40oisiIiIiSUkjuiIiH9Mzz7/EvFit7te/9V2uXb3ML3/+LwDk5Y+ibNVGCiYXYrVaqbtVy4G9\nO7ly+UL89S9/4SuEQiHqam/w9OIVBINB/vP//isNt+uYMWsexYuWMuqJsdjtdtrb2jh/7hT7dr9D\nOBxmRflaVpSvA+CVL3yVlhYP//zqP8Tbf/Tq39Pa0gxASkoqpavWM71oNimpabS2eDj1UQVHDr6P\naUZXg19RvpYly1fy7//8A9Zs+BQTC6YQiUS4WHWOXe9uxevtepS/WhGRj0WJrojIx3Si4ghOp5Oi\nmXPZ+c4WGm7XA5A/6gn+7C++RmdHO4f27yYcDjN77nxeevmLbPntf3L+7Mn4OSZMnEROTi67d2wj\nKyeXxoZ6nlywiM3PvsiFyrPsee9trFYrRTPnsmRZOQB7dm6j8vwZ0tMzeap4MQf37eJW7Y0B++hy\npfC5L36drOxcTlQcpqmpgcmF01m5ZhOjnxjL79/4ZfxYw7Dw8he+zI1rV9i9Yxtjxo1n/oIS7HY7\nb77+Hw/vFyki8glToisi8jHdrLnG7fpbFM2cy4XKs/ER1HWbnqerq5Of/eurBINBACqOHuTlz3+Z\ntRufo6ryDJFwGIjOmvCH3/2K2ps9iWrJklJqblzljdd+Hm87fuwwX//mdyicWsSendtoqL9FTc01\nnipezJXqC1y/Wj1gHxcvL8edN4o3Xvs5FyrPAvDhscOs3/RpFi5ayumTx7l8sRIAq9XK+TMn2bXj\nLQBOHIeMjCymz5iDzW4nFPssIiLDnWp0RUQegpSUVAomFXL5YiU2u52U1FRSUlNxuVxUnT9DenoG\nY8dOiB8fDAaora1JOMdPfvwDfv3Lnya0paWl4/N5sTsc99Wf6UWzaWyojye53Q7sey++v7feo80A\n9XW1WK3WIbvhTkTkQWhEV0TkIcjOdQPwdMlyni5ZPuAxmVnZEBvA9XZ1QaxOtlskEmHM2AnMmjMf\nd94ocnPdpKVnANDS4rmv/mRl51J9qapfe2dHO15vF5l95tvt6upM2A6HQwBYLBofEZHHhxJdEZGH\nwGJEE8KKowf7jaJ2a7hdF/85Ykb67V+38TmKS5ZTd6uGmzeuc+bUcWpuXGP9puejSfJ9MIzB9hnx\nRLab2SfpFhF5HCnRFRF5CLpHXCORCFerLybsy8sfRVZ27qC1rplZ2RSXLOf0yeNsffO1hH3do7r3\no7WlGXdefr/2tPQMXK4U2ltb7/ucIiLDnb6DEhH5BEQi0RFQIzZ02tnRTu3NG8ybX0x6Rmb8OIvF\nwubnPsMLn/ncoGUA3bWwjQ31Ce2F02bgducnvNaMRBLeeyAXq86Rlz+a6TMSa3GXLF8Z3X/h3F0/\no4jI40YjuiIin4CuruhSu4uXlnP5UiUXq86xc/sW/vTzX+Yv/uqbHD92GK+3k9lz5jNufAF73nt7\n0DlpGxvqaW1pZumKVdhsNtraWhk7bgLz5hcTDAZxOJy93jtaT7ugeAlp6RmcO/1Rv/MdOrCbollz\nef6PX+HDisN4mhqYNHkaM2bNpfLc6QHrd0VEHndKdEVEPgHnznzEjJlzmfdUMRMnTeFi1Tlu1lzj\nFz/7EaXl6yhZWorFYsXTdJutb77G6ZPHBz1fOBzm17/8KWvWf4rikuUYhkGzp4md2/+AxWph3cbn\neWLMOOpu3eRq9UXOnfmIaUWzmDRlGlXnz/Q7n8/r5Rc/+T+UrtrArDnzcblctDR72LXjLY4e3vew\nfi0iIkPKKCndrDsORERERCTpqEZXRERERJKSEl0RERERSUpKdEVEREQkKSnRFREREZGkpERXRERE\nRJKSEl0RERERSUpKdEVEREQkKSnRFREREZGkpERXRERERJLS/wforQjp9slZCAAAAABJRU5ErkJg\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jtplot.style('onedork', ticks=True, context='talk', fscale=1.5)\n", "acc_fig = plot_runs(df_acc, 'accuracy')\n", "train_fig = plot_runs(df_train, 'training loss')\n", "valid_fig = plot_runs(df_valid, 'validation loss')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": true }, "outputs": [], "source": [ "html_dir = os.path.join(STATIC, 'assets/plots')\n", "for fname, fig in {'accuracy': acc_fig, 'training': train_fig, 'validation': valid_fig}.items():\n", " with open(os.path.join(html_dir, fname+'.json'), 'w') as f:\n", " mpld3.save_json(fig, f)\n", "\n", "with open(os.path.join(html_dir, 'configs.json'), 'w') as f:\n", " json.dump(f_configs, f)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['training.json', 'configs.json', 'accuracy.json', 'validation.json']" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "os.listdir(html_dir)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/home/brandon/Documents/DeepChatModels/webpage/deepchat/static/assets/plots'" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "html_dir" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/README.md ================================================ ## Data Processing ### Overview of initial pre-processing Our initial method of processing the raw reddit data uses the pandas(pd) library. We start by reading in our different files into a DataFrame(df) and remove extraneous data. After this we are ready to start cleaning up our data. #### Initial Clean The initial clean consists of 1. Remove commments that are deleted. 2. Document whether a comment is a root comment. 3. Replace digits, contractions, links. 4. Remove large comments. After the initial clean, we generate a word frequency dictionary by tokenizing our comments and tracking the word usage. This word frequency is used to provide a 'validity' score for our comments. #### Validity score The validity score relies on the word frequncy dictionary and the pyEnchant library. At this point the validity is a function of indpendent word usage only. We keep a penalty score which increases for words that are not in the pyEnchant english dictionary. The penalty is the inverse of the number of occurences of the specific word in all of the processed comments. ### Drawbacks of method This method is not very efficient. Specifically the computation of sentence scores is time consuming. The order of operations is being explored and the ability to save progress needs to be added. ### Further Analysis A natural question that arises is how much data should be used to generate the word dictionaries. Due to the size of the files, we will probably need to modularize this as much as possible. ## Using sqlite ================================================ FILE: notebooks/RedditPipelineAndVisualization.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Reddit Preprocessing in Stages\n", "\n", "This notebook is essentially the `reddit_preprocessor.py` file in the data package, but split into disjoint steps. This is useful for both development and visualization, e.g. you can save the data at each stage of the processing pipeline and resume later, rather than requiring a restart from beginning." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "import sys\n", "sys.path.append('..')\n", "from imp import reload\n", "\n", "from data import reddit_preprocessor, DataHelper\n", "from data.reddit_preprocessor import *\n", "\n", "import json\n", "import pandas as pd\n", "from pprint import pprint" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using logfile: /tmp/data_helper_1xuld5d\n", "Hi, I'm a DataHelper. For now, I help with the reddit dataset.\n", "At any prompt, press ENTER if you want the default value.\n", "Username (default='brandon'): \n", "Hello, brandon, I've set your data root to /home/brandon/Datasets/reddit\n", "Years to process (default='2007,2008,2009'): \n", "These are the files I found:\n", "['/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-11',\n", " '/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-12',\n", " '/home/brandon/Datasets/reddit/raw_data/2007/RC_2007-10',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-12',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-07',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-08',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-03',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-06',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-05',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-09',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-01',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-11',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-10',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-02',\n", " '/home/brandon/Datasets/reddit/raw_data/2008/RC_2008-04',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-01',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-03',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-10',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-05',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-02',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-12',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-06',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-08',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-11',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-07',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-04',\n", " '/home/brandon/Datasets/reddit/raw_data/2009/RC_2009-09']\n", "\n", "Maximum memory to use (in GiB) (default='2.00'): 10.\n" ] } ], "source": [ "data_helper = DataHelper()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Playing with the Raw Data\n", "Use data helper to load the uncompressed data into a pandas DataFrame." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading year: 2008\n", "Returning data from file:\n", " /home/brandon/Datasets/reddit/raw_data/2008/RC_2008-11\n", "Loading year: 2009\n", "Returning data from file:\n", " /home/brandon/Datasets/reddit/raw_data/2009/RC_2009-08\n", "Loading year: 2010\n", "Returning data from file:\n", " /home/brandon/Datasets/reddit/raw_data/2010/RC_2010-03\n", "Done!\n" ] } ], "source": [ "data = {}\n", "years = list(range(2008, 2010 + 1))\n", "for year in range(2008, 2010 + 1):\n", " print('Loading year:', year)\n", " data[str(year)] = data_helper.load_random(year=year)\n", "print('Done!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remove entries with the comment as \"deleted\"." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "years = list(range(2008, 2010 + 1))\n", "for year in years:\n", " df = data[str(year)]\n", " data[str(year)] = df.loc[df.body != '[deleted]'].reset_index(drop=True)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(-1.0, 15.0), (-1.0, 15.0), (0.0, 13.0)]\n" ] } ], "source": [ "jtplot.style('onedork', ticks=True, fscale=1.5)\n", "jtplot.figsize(x=11., y=8.)\n", "\n", "# Plot the inner 90 of data for 'score'. \n", "years = ['2008', '2009', '2010']\n", "score_ranges = [tuple(data[y].score.quantile([0.05, .95])) for y in years]\n", "print(score_ranges)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "from jupyterthemes import jtplot\n", "jtplot.style('monokai')\n", "# set \"context\" (paper, notebook, talk, or poster)\n", "# & font scale (scalar applied to labels, legend, etc.)\n", "jtplot.style(ticks=True, grid=False)\n", "jtplot.figsize(x=10, y=8)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loading year: 2008\n", "Loading year: 2009\n", "Loading year: 2010\n" ] } ], "source": [ "# [Optional] cut down size of data.\n", "percent_keep = 0.9\n", "for year in range(2008, 2010 + 1):\n", " print('Loading year:', year)\n", " num_keep = int(percent_keep * len(data[str(year)].index))\n", " data[str(year)] = data[str(year)].loc[:num_keep]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['archived', 'author', 'author_flair_css_class', 'author_flair_text',\n", " 'body', 'controversiality', 'created_utc', 'distinguished', 'downs',\n", " 'edited', 'gilded', 'id', 'link_id', 'name', 'parent_id',\n", " 'removal_reason', 'retrieved_on', 'score', 'score_hidden', 'subreddit',\n", " 'subreddit_id', 'ups'],\n", " dtype='object')" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_small.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization: Comment Scores" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(-1.0, 15.0), (-1.0, 15.0), (0.0, 13.0)]\n", "sr: [-1.0, 15.0]\n", "nb: 17\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:1742: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.\n", " warnings.warn(\"This figure includes Axes that are not \"\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwIAAAIqCAYAAACXNP1XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd0VPe99/vPzEgz6p1eBaKYjpCEQEhUiWobTBw7dlyS\n2Kkn5Zw8Zz2nPOu5Wc+9J7n3tDjnnFSfxE7cbZwYg+lFIBBF9CZAQgUhIYQqqjPSzNw/JMYMKiCN\nxBjm/VorAX67ffdX47Xmo71/exvmpq12CgAAAIBPMXq7AAAAAAAPHkEAAAAA8EEEAQAAAMAHEQQA\nAAAAH0QQAAAAAHwQQQAAAADwQaaRYyb+xNtFAPBtZrNFc5JSlLHqSS1JX62UtGWaOHmqZDCovLzM\n2+V5XURklFpamu+5nsUSoNRF6Vq+ep2WpK9RcspCxU2cIpPRpBvlpQ+gUu/w9/fXd374d7peWqJb\nt2qVuihdX335O/LzN6uoIK/Lbf7hJ/+i8IgoXb54/gFX23ff/dHfa+LkaTp76pgk6fmXv63URenK\nOXzggdVw9zFT0pYqKTlVuedPP7AaAPQfrggA8Kqo6EH62jd/oMXLVqriRrn27d6m/Xu3q62tTase\n/5KeWPest0v0qpS0pXr2hVfvuZ7ZYtGL3/ie4hPn6UreRe3a9qkO7NulVptVKx9fr3VPf/UBVOsd\nqYsyVHHjuq6VFLmNJyWnatDgId4p6gE4uH+3dm371Ks1HD2cpVGjYzV+wmSv1gGgb/y8XQAA32Xy\n89PTX3lZgUHB+sPv/kM3b1x3LTt6aL+Wr1qnOUnzVVZ6VceOHPRipd4zdtwEGY33/p1NQlKKBg0e\nqt//9jXduP75b//v7OO4uEkqyL80kOU+cBGRUUpMTtXbb/y60zKTyaQVa9brrT/8yguVDbzurnY8\nSK02m3KOHFD6iid0Jf+S5OQdpcDDhCsCALxmTuJ8RccM1q7tm9xCwG27d2xSc3OT4hPmeaG6h8uI\nUWPU1NToFgJuO3o4S5I0ctSYB13WgEtIStGtulqVXivutOzyxfMaNTpWM2cneqEy33H6ZI4iIqM1\nYeJj3i4FQC9xRQCA10yZNlNWa4sunD3Z5fK2tja9+fp/qq6uxm181OhYLViUrhEjR0uSykpLlJW5\nQyXFha51vvujv1f+5VzdKC9TcsoihYVF6GZFubZv+Ytu1dUqY+WTGhc3STarVWdOH9O+Pdtdv838\nh5/8i/bs/EwGg0HxifMUFBSssmtXtWXTBhkMBmWsXKuRo2PV1Nigo4f3d7paMX1WghLnLlDMoMGy\nWa3Kz7uovbu2qLGhXpIUHhGp7/3oH/Tpn99TdMwgTZ+VoKCgYN0ov67MXVtUXHTFdQ4REVGumrIy\ndygrc2eXvbJZrQoKCtbkKdN18cJZt2U11ZX6f//vv5PDbncbHz5ilBYsStfIUWPlcDhUdu2q9u7a\nopsV5b3udeGVPBkMBk2dPlvNzY36/W9+ruamJo0YOUZpizM0vGP70mtXtW/PNl0vLXFtHxAQqGUr\nntCY2PEKDg5V/a065Z4/rax9O2Vva+vyfCXJz89PM2Yn6vTJnC6X79u7XcNGjNTi9NW6fOm8mpua\nut2XJA0aPFRpS5ZrzNjxMpn8VHGjTIcO7HWbR/D8y99WW1ubystKlJicqtbWVr37x98qY9Va2WxW\nnTp+VGmLMxQdM0g11VXavWOzrl0t0tKMNZo8dYYcDocu5Z7Vrm2fqu2Oc5udkKyZsxMVHTNYJpNJ\ndbU1On0yR4cPZnZb7/Mvf1vhEZH61Ws/c32munPnZydm0GAtXLJSY2LHy2Qyqfx6mQ7s26nCK5fd\nthk7boLSFmdo8JDhamyoV3bW7i733VB/S6XXijUnKUV5ly702GMAXyxMFgbgNctXP6Wy0hKd6eaL\nnCS1NDfJecftBhMmTdEzX31FTqdTOYezdLW4QGNi45Q4d4EqbpSpuuqmJCkxOVUxg4ZobGycTuQc\nUklxgSY9Nk0TJ03VlGkz1djYoJPHDysoKFgzZyeqtqZKFR1XJVIXZSh60GANGjREOUcO6OaNck2Z\nPltjYuMUnzhPZaUlOnvquKJjBmtW/FwVF15xhZUFC9OVsfJJlVwt1Mljh1VdXanpM+do2ox4nTtz\nQm2trQoICFRScqqGDhupyKgYHTuarZLiQsVNfEwzZifo5LHDamtrVV1tjQYPGSZJ2rL5YxUXFaip\nsaHLPlmtLZo2Y7amTJulcXGTFRwcIrvDrob6W5Lk1kOp/Qv+8y9/W37+/jp25KCKCvM0YdIUzZ6T\nrNzzp2VtaelVr0eMHC2DwahDWXtUXVWpgvxLGjtugp578VW1tDTr2JEDulZSrDFjxytpXqquFhXo\nVl2tJOnpr3xNo8eO04mcQ8o9f1oOh0OJyQsUHByi/Mu53X42Ro8dr9lzkrV/zzbV1la7xseMHa8x\nY8fr8MG9ullxQzNmJSgoKER5lz7/Qp+6KEM3ystcX/KHDR+pF77+PQUHBSvnyEFdyb+oocNGKGle\nmpoaG3W9rD24zJiVoBEjRys8PFIH9u1SXV2NLpw7pemzEjRo8FBNnjJDZ04dU/7lXI2Lm6RpM+I1\nNjZO/mazjudky+l0aubsRNntDl0tLpAkLVyyXEvS16iwIE+nTxxRydUiDRo8VNNnzlFjY4Oul11z\n9dna0uKaLDxjVoICAgKVc/iAHHa7KisrdCn3nNv/hgwZLrPZrMw921R/q06DBg/Vi9/4nvw7fu6F\nV/I0ZOgwJc9fpKrKm6q8eUNSewh45vlvqNVm05HsfaqtrVbqouUKDQ1Ta2trpwnKkZFRmjZjto5k\n75PD4ej2Zwbgi4UrAgC8IigoWCaTyfVF9X4YjEYtX7VO9fV1euN3v5DNapUknTx+WK9+98davnqd\nruRddH0RCQ0N03//+ueu33AHBAZpXsoiXTh3Sp9seEeSdP7MCf31//w/ih0/UWdPH3cdKyAgSG/8\n9hdq7PjiHRUdo8emzlT2gT3K3LVVklRUmKfv/ODvFDt+oq4WFygiMkoLFi5TdtYeZe7e6trXhXMn\n9fVv/UgpqUu1a/umO05IeuN3v1Bra6skqa62Ruue/qomPTZNp04c1eWL55WYnCo/f3+dP3Oix94U\nFeTps083KH3FExoxcrTrN/jNzU26eP6M9mfucF2RkKQlGWvU3NyoN377CzU3t/+m/EreRX3ze3+r\n+MT5yty9tVe99vPz14b33/z852kwaOWa9SorLdHbb/zaFUSOHz2ob3z7r5W+8kn94bevKSg4WLHj\nJ2r3js06kr1PknT6xFEZDFJEZHSP5zxqdKwkuQJcV3LPn9bM2YmaMWuOzpzMUcnVwi7Xy1i1Vk6n\nQ2+8/h+qv1UnSTpx7JBe/Pr3tCRjtS6cP+W6omA2W/Tpn99T2R1XNSQpNDRcH777B1d4sTvsWrH6\nKRmMJr3/dvschpPHDmvU6FjFjp+oA/t2ymg0ak5Sis6fPanNn3zg2tepE0f0o7/9vzQubpJO5Bzq\nsQ+S1Nra2ukzMnf+QkVGRWv7Z39R2bWrrvNsamrUH377mutzd+zoQT3/0reUvvJJXbp4Tg67XYuX\nrVRDwy398ff/5frZF13J0/Mvf1tNTY2djl9xo1wmk59GjBzjuqIF4IuPOQIAvMLhbP8CeT8TYW8b\nOmyEwsIjdPxotuvLiSRZW1p0/Gi2wsIiNGz4KNd4TXWV220ut3+DfSn3nGustbVVTY0NCgkNcztW\naUmRKwTcue3lO7atrWn/LXRIaKgkaeLkaTIajcq7dEGBQUGu/zU01Kv8epni7rqH+srli64vY5J0\no+NRqcEh7rXcrzMnc/Rf//5P2vTJB8o9f1pNTY0KDAzS7IRkvfrdHys6ZrAkKSg4WCNGjtb5s6dc\nIaD9HCv1xu9+ocMH9vah15VuoW7o0OGKjIrW5YvnFRAY6OqFn7+/8i7nauiwEQoJDZO1pUVWa4vi\nE+dp0mPT5e/vL0n6bONHeu9Pv+vxfCMio2SzWbv8Ynqn7Vv+orY2u1asearLz1twcIhGjByjc2dO\nuEKAJNnb2nQkO1P+/mbFjpvoGm9ttams47f0d2ptbW2fMNuhuqpSknT54jm39epqq12fGYfDoV/8\n6//R1k0fu60TFBQsq9Uqs9nS47l1J3b8RC1etlJnTx/X8ZxsSVJgYJDGjB2vK3kX5efv7/qZBAQE\n6FLuOYWEhGr48FEKCg7WsOGjdOHsKbeffXHRFddn9G61NVWSpPDIqD7VC8A7uCIAwCtampvV1tam\noOCQ+97m9v3yVZU3Oy2rvFkhSQqPiHBNHG286zaa27+9vvv2GofTIYPB4DbW3bZ3jt/+LbfB0P7l\nMjKq/TfYL73yV13W33bX/e5NTe7HsNvblxuN7rX0htXafuvI2VPHJINBo0aNVUraUo2Lm6Rlyx/X\nB+/8XuHhkZKkmo4vqne6/UVvbMQESfff67t7ersXSzPWaGnGmi5rDQ+PVEP9LW3d/LFWPf601j/z\notraWnW1qEAXc8/q7OnjPc4RCAwKktXa0mM/pPZAeOjAHqUtXq658xfq0IG97nVEtPejusdzjXSN\nNTc1dfl0nObmRjnvuC3G4Wifk9H58+Z0+7zZ7XbFTXhMEydPVVT0IEVFxygwMKj9+IbefxYio2K0\n9kvP62bFDW3dtME1HtHxM0mcu0CJcxd0uW1YeITrc1jT8eX+TlWVFa75HneydgSGoKDgXtcLwHsI\nAgC8pvRasYYOGyGD0ej2BepOC5csV0RktHZt36SevhPd/mJlv2NCbHf3Kjt170cc9uU+Z2NHIPjw\n3T90+tLfZR399KjFkNAwJcxNUUHeJdd95x0HUMnVQn3wzu/1jW//tUaOHiup/RYrqec+9LrXd53L\n7XC0b882lXbclnK3qsr2L9kXzp5SQf4lTZw8TXETHtPYcXEaFzdJcxLn683X/8PtOHdyOp2u49zL\noQN7NXX6bKWkLdP5uyen93CyXZ9r15+N7j9vPfvSsy9p4qSpKikuUGlJkU4eP6yS4gI999K37rFl\nZ2azRV969iVJ0scf/NHtc3j783ns6MFuX6R2s6JcoWHhkiR/P/9Oy+8OzHePMz8AeLgQBAB4zaXc\nsxozdrymTJvV5T3wfn5+mhk/V0aDQc1NjaqtbZ+QGx0zSHl3PQ4/OmaQJLkmoHrD7Qmrt27VqeKu\nWyjGT5gsa8u9f3vdFwaDQfMXLFFwcKh7EOjgdDpVVVmh4I6rL7d7FNnFPfiLl61SS0uz6z7vvva6\nruNnZbNZOz3vftjwkQoIDFJrW6v8zWYNGTpclRU3dOZkjs6czJHRZNKS9NVKSk5V7PiJ3U4Ybmxo\nUGBgYLc13Mlut2v7lk/03Ivf1PJV67qs9fatU709V0+MGhOriZOm6sC+ndq/d4dr3GA0KjAw2HX7\n2f164qmvKGbQYH347hudtr39+XQ4HJ1+JjGDBis8Ikptra2qq62W0+lQZHRMp/13N28jMKj9Csbd\nV9IAfLExRwCA15w8fkS1tdVamrGm0xtgDQaDVqxZr5CQUB06mCmHw6Hysmuqr6/TnMT5Mls+v3fa\nbLEoPnGe6uvrdL2L5+g/KPmX2x+dOH/BYrfxwUOH6+mvvKzE5K5vx+iJ09H5tqW71d+q09XiAk2d\nPltjYsd3Wh4eEanY8RN1ueOpOQ31t3SjvExTps9y62P7y7nan9bjaa+vl5Wovr5OCXMXyN9sdtt+\n3dMvaM3aL8vhcLQ/xebr39PM+CTXOg673fU+hJ6umtyqq5HJ5KfgkNAe+3NbUUGezp89qQmTpriN\nNzbUq6y0RFNnzHb9NlySjCaTkualqa2tVYUFl+/eXb8IDGy/leb203pumx0/V2azuVdzaNIWL9fE\nyVOVlblTV/Iudlp++zxnzEpwmxNjNBq1+skv66kvvyij0ajmpiZdLS7UtBnxrvAoSSNGjtGw4SO7\nPHZYR99u3fWoXwBfbFwRAOA19rY2ffz+H/WVF17Vy6/+UOfPntD10msKDArS5CkzNHTYCOWeP60j\nh/ZLav9N5s6tG7X2S1/V1775Q50+cVSSNDM+SaGhYfrzh2959c2mNytuKOdwlhKTUxUYFKzLF88p\nMDBICUkpslqt2r93e6/32dTUqNFjxylpXpquXS3s9KSa2z7b+KFe+Pr39JUXvqlLuWdVUlyo1lZb\n+2MoZyWoqalR+3Zvc62/a9unevaFV/S1V3+gUyeOyul0KmFuilpaWlzBy5Ne37n917/1I50+cVRt\nba2aFT9X4RER2vjxe3J2vLvganGBFi5ZobDwCFXcuK6wsAglzE1R5c0bKuzh7blFhflKW7xcw0eM\ndns0aE92bd+k8RMmKyDA/UrCzq0b9dxL39LXXv2Bjuccks3Womkz4jVs+Cjt2PLJgF3NKS0pUktL\ns5Ytf0Jh4ZFqaWnuuEo2U62trfc9WXj8hMlKSVuiyps3dLOiXFOmz3K7baqxoV5FBXmu8/z6N3+o\n4zmH1NzcqKnTZmnEyDHau2uLa/L47u2b9MLXv6uXXvm+judky9/frKR5qd0+vnb4yDGy2azd3gYG\n4IuJIADAq26Ul+m/f/NzJSWnavyEyXps6kwZDEZV3LiuzZ98oDMdz0y/7eKFs3r/rdeVsnCZFixM\nl8Nhb3/Z18aPun005IO0c9unqqq8qdkJyVqasUbWlhaVXC3Uvj3bu5x4ey+HDmZq8JBhWrxspc6c\nPNZtEKiprtLrv/xXJacs0vgJkzUubpKMRpNu1dXo5LHDOnRgr9vE2uKiK3rnzd8qbXGGUhelq621\nVVeLC7Vn52eux4x62uvb289PW6qUtKVyOp26WXFDH733ptvtPhvef1OpC9MVN2mKZs+Zq5bmZl28\ncFb7927v9BK0O5WWFKu5uUmjxsTedxBobKjXvt3btHy1++1BpdeK9ac//FJpizM0d36ajEajbpSX\n6aP33rzvffdFY2ODPnznD1qcvkopaUtlt9tVXXVTn2x4R8NHjHZdobnXLTfDR4ySwWBUzKAhWv/M\nS52WFxddUVFB3ufnuej2eZpUXVWhTX953+3xueXXS/X2G7/W4mWrlLooXS3NzcrK3KFhw0e55prc\nadTosSoqzO/x5wXgi8cwN2219359BgCAB5Ytf1yTpkzXL3/+U2+X4rMio2L0nR/8T3303hu8WRh4\nyDBHAADw0Dp6OEshIWEaGxvn7VJ81vSZc1RVWUEIAB5CBAEAwEPrVl2tThw7pHl3TdDGg3F78vid\nb9IG8PAgCAAAHmr7dm9TdMxgjRoT6+1SfE5ScppKrha6va0bwMPD63ME4hPmae78hQoJDVV52TVt\n37qx0/O3bzOZTPof//BPMplMbuMXzp3SJxve6fWxjUajLEFhsrdZvfmgEQAAAMAjBoNk8rPI2nTr\nvl/u59WnBk2flaCMVU9q/94dqrhxXUnz0vTcC6/qd7/8VzU1NXZaP3rQEJlMJn303ptqbKx3jTd3\nse79sASFKWZY51elAwAAAA+jyutX1dxwfy9B9GoQSF2UrmNHDio7a4+k9pe9fOeHf6f4xHk6sG9X\np/UHDxkmq7Wl3x7lZm+zSWpvWFur1W2ZwWCUJShE1qYGObt5nTy6R//6jt55hv55hv55hv71Hb3z\nDP3zzKPQPz9/i2KGjXZ9v72vbQawnh5FRsUoIiLK7SkDbW1tKsi/rHFxk7oOAoOHdnr7oiduv7Gy\nrdWqVmuz2zKD0SQ/s0WtthY5HTwXubfoX9/RO8/QP8/QP8/Qv76jd56hf555lPrX0xvZ7+a1IBAV\nHSNJqq6udBuvranu9Pr32wYNGSaDwaivvvxtDR85Ws1NTTp6OEtHsvd5VIvBYJTB6D7vwNDxWndD\nL17vjs/Rv76jd56hf56hf56hf31H7zxD/zzzKPTvzreJ3y+vBQGLJUCSZLO535Jjs7XIYun6leqD\nhwyVv79Zu7dv0v7MHRo/4TEtXrZKRqNRhw7s7fF4qYvSlboow22sqqpKW7ZtkSUoRH7dvMY9ICj0\nfk8JXaB/fUfvPEP/PEP/PEP/+o7eeYb+eeZh7p/Jz7/X23hvjoCh488url50d0Vj44Z31dTUoMqb\nFZKkq0UFspgtmrdgsY5k7+txhnRW5k5lZe50G/O3BGro6AmyNjWo1dbiXp7RqICgULU01ct5nzOv\n8Tn613f0zjP0zzP0zzP0r+/onWfon2cehf75mwOk6CG92sZrQcDa0v7F22yxyGr9/Eu42Rzg9u87\nXS0u6DR2Jf+S4hPnKTwiUjXVVX2qxel0dHs/mNPR/TLcG/3rO3rnGfrnGfrnGfrXd/TOM/TPMw9z\n//oyydlrN0LVdMwNiIiMchuPiIxSddXNTusHBAZqZnySwsIj3Mb9/duzTHNT0wBVCgAAADx6vBYE\nqqsqVVdXo4mTp7nGTH5+Ghc3UcWFVzqt73A4tHLNU5o5O8ltfNJj01Vx47paWpo7bQMAAACga159\nj8ChA3u1fNVa2awtKist0dx5aTKZ/HQ8J1uSNGTocNntbaq8WSGb1apjR7M1b8Ei2WxW3Sgv02NT\nZ2jylOn68N03vHkaAAAAwEPHq0HgRM4hmc0WJSSlaO78RSq/fk3vvfW6Ghva3xq8/tmXVFdbo3fe\n/I0kac+OzWpualJ8wjyFhoWpqvKmPv7gLV3Ju+jN0wAAAAAeOl4NApJ0+GCmDh/M7HLZr177mdu/\nHQ6HDu7fpYP7O79sDAAAAMD9e3jfmgAAAACgzwgCAAAAgA8iCAAAAAA+yOtzBAAAAIAvAqPRpOQF\nizV9ZrxCQsNVU12p7Kzdyj1/RlL7o+6XpK/WlKkz5efvr/zLudqx9RO391mFhUcoY9VajRk7Xq02\nm06dOKKszJ1yOp2udcZPmKyFS5YrKnqQbtXV6nD2Pp05mfPAz5cgAAAAgH7lSPhHrx7feOyf+rTd\n4mUrNXN2gvbv3aGbFeWaMPExrXv6Bdntb+ryxfNauWa9xk+YrN3bN8lut2tJ+mo99eUXXU+4NJlM\n+soLr8pqbdHGj99VZFSMFi9bKadTysrcIUkaPmKUnv7Kyzp35qT27NyiUaNjtebJL6utrVUXzp7q\ntx7cD4IAAAAAfJ7JZFJ8QrL27tqinMNZkqSigjxFRsVo7rw0Vdwo1/SZ8drw/p+Ud+m8JKmqskKv\nfOdvNGpMrEqKCzV1RrzCIyL1y5//VI2NDe07djq1cOkKHTq4V22trZo2I1636uq0eeOHktOpooI8\nDRk6XPFzkh94EGCOAAAAAHyexWLR6ZM5upKX6zZeVXVT4RFRGhs7Xg6HQwX5n7+/quLGddXWVGtc\n3CRJ0tjYOJVdu/p5CJB06eI5mc0WjRodK0ky+fmrtdUm3XGrUHNzkwICgwby9LpEEAAAAIDPa2pq\n0o6tG1VdVfn5oMGg8XGTVFVZ0XE/f53sdrvbdrU1VYqOHiRJiooepOrqKrflt261bxMVHSNJOnMy\nR5FRMUpISpHFEqBxcZP02NSZOn/25MCeYBe4NQgAAADowoK0pYoZNES7tm/SpMnTZLNZO61jtVll\ntgRIar+q0Gkdp1OtrTZZOtYpvVasQwf2KmPVWmWsWitJunjhjA4d2DuwJ9MFrggAAAAAd0mcu0Bp\ni5frSPY+FeRfkgxye/KPm9vjBoPbLT/uq7SPL1yyQvNTlygrc6fefuPX2rntU8WOn6ilyx8fiNPo\nEVcEAAAAgDssXLJcKWnLdPLYYe3esVmSZG1pkdli6bSuxWxRc3NT9+sYDPL3N8tqbZHRaFTSvDQd\nO3LA9RShq8UFam21acXqp5RzOEu36moH9uTuQBCAz/q3iM7/MXflx7WdLwMCAIBH0/JV6zQnab4O\nZ+/Tno4QIEnV1ZUKCwuX0WiUw+FwjUdERqv0WrEkqaa6UhGR0W77CwsLl8lkUnVVpQKDguXv76/S\na1fd1iktKZLRaHS9V+BB4dYgAAAAQNL8BYs1J2m+9u3Z5hYCJKmoIF9+fv4aP2Gya2zwkGGKiIxS\nceGVjnXyNGLkGAUHh7jWuT23oKz0qpqaGtXS0qyRo8a47XvYiNGSpLra6oE6tS5xRQAAAAA+LzQ0\nTAsWLlXJ1SIVFuRp+MjRrmUOu13l10uVe/601qx9Rru3b1Jrq02L01er5GqhigrzJUnnz51SysJl\neuarrygrc6ciIiO1eNkqHcneL5u1/Q6D7Kw9WrR0hWw2m4oL8zV4yDClLs7Q+bMnVXPXE4cGGkEA\nAAAAPi92XJxMJj+NGj1WL7/yfbdlTU2Neu2ff6LNGz9U+oontGzFE3I6nSrIv6SdWze61mtrbdX7\nb72u5avWae2XnldLc5OOZO/T/r07XOscPpipVptNCckLlJyySHW11TqSvc8rTw0iCAAAAKBfGY/9\nk7dL6LUzp0/oyMG9cjrs3a7TarNpy6cbtOXTDd2uU11Vqffeer3HYx3PydbxnOw+19pfmCMAAAAA\n+CCCAAAAAOCDCAIAAACADyIIAAAAAD6IIAAAAAD4IIIAAAAA4IMIAgAAAIAPIggAAAAAPoggAAAA\nAPggggAAAADgg/y8XQAAAAAeLWu+W+vV42/+VUSftjMaTUpesFjTZ8YrJDRcNdWVys7ardzzZyRJ\nJj8/LUlfrSlTZ8rP31/5l3O1Y+snam5qcu0jLDxCGavWaszY8Wq12XTqxBFlZe6U0+l0rZM0L00J\nSSkKDglVxY0y7duzXUUFeZ6ddF/O94EfEQAAAPgCWrxspZJTFup4ziFteP9NXS26onVPv6CJk6dK\nklauWa8p02Zp947N2vLpBo0cNVZPfflF1/Ymk0lfeeFVhYSEauPH7+rQwUwlpyzSgoXprnUSkxdo\n2fLHlX/5gj567w3lX87Vl559WWNixz/w8+WKAAAAAHyeyWRSfEKy9u7aopzDWZKkooI8RUbFaO68\nNFXcKNf0mfHa8P6flHfpvCSpqrJCr3znbzRqTKxKigs1dUa8wiMi9cuf/1SNjQ3tO3Y6tXDpCh06\nuFdtra1KSV2qM6eOacfWja5j+PubtSR9jd743S8e6DlzRQAAAAA+z2Kx6PTJHF3Jy3Ubr6q6qfCI\nKI2NHS/SSwaBAAAgAElEQVSHw6GC/IuuZRU3rqu2plrj4iZJksbGxqns2tXPQ4CkSxfPyWy2aNTo\nWAUGBSkoOEQF+ZfcjlFytVDDho9UYGDQAJ5hZwQBAAAA+Lympibt2LpR1VWVnw8aDBofN0lVlRWK\nih6kW3V1stvtbtvV1lQpOnqQJCkqepCqq6vclt+61b5NVHSMWpqb1dbWqrBw9zkMEZFRkqSwiMgB\nOLPuEQQAAACALixIW6qYQUN05NB+WSwBstmsndax2qwyWwIktV9V6LSO06nWVpsslgA5nU5dOHda\n8xYsVtzEx2SxBGhsbJyS5y+SJJn9zQN9Sm6YIwAAAADcJXHuAqUtXq4j2ftUkH9Jkx6b5vbkHze3\nxw2Gz//eaZX28Z3bNspsNuvLz31dklRXW6MD+3Zq9ZNfVmurrd/PoycEAQAAAOAOC5csV0raMp08\ndli7d2yWJFlbWmS2WDqtazFb1Nzc1P06BoP8/c2yWltc6/z5w7cUEBio4OBQVVfd1Oix4yRJLS0t\nA3hWnREEAAAAgA7LV63TnKT5Opy9T3s6QoAkVVdXKiwsXEajUQ6HwzUeERmt0mvFkqSa6kpFREa7\n7S8sLFwmk8k192DCpCmqq6tVRXmZWpqbJUmDhwyX1dqi2trqgT49N8wRAAAAACTNX7BYc5Lma9+e\nbW4hQJKKCvLl5+ev8RMmu8YGDxmmiMgoFRde6VgnTyNGjlFwcIhrnUmTp8lms6qs9KokKSEpRSmp\nS1zLTX5+mhWfpCt5F7u9rWigcEUAAAAAPi80NEwLFi5VydUiFRbkafjI0a5lDrtd5ddLlXv+tNas\nfUa7t29Sa6tNi9NXq+RqoYoK8yVJ58+dUsrCZXrmq68oK3OnIiIjtXjZKh3J3i+btX0S8Yljh7Xu\n6a8qOWWRysuuKWlemsLCI/TnD9964OdMEAAAAEC/2vyriHuv9AUTOy5OJpOfRo0eq5df+b7bsqam\nRr32zz/R5o0fKn3FE1q24gk5nU4V5F/Szo4Xg0lSW2ur3n/rdS1ftU5rv/S8WpqbdCR7n/bv3eFa\n51LuWe3ctlFJ89IUHByi66UlevePv1VVZcUDO9fbCAIAAADweWdOn9CRg3vldNi7XafVZtOWTzdo\ny6cbul2nuqpS7731eo/HOn40W8ePZve51v7CHAEAAADABxEEAAAAAB9EEAAAAAB8EEEAAAAA8EEE\nAQAAAMAHEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAf5OftAgAAAPBo+bcIi1eP\n/+Naa5+2MxpNSl6wWNNnxiskNFw11ZXKztqt3PNnJEkmPz8tSV+tKVNnys/fX/mXc7Vj6ydqbmrq\ntC+D0aiXX/krnTl1TMePZrstGzRkmDJWPKFhI0apqalRRw/t17EjB/tUsye4IgAAAABIWrxspZJT\nFup4ziFteP9NXS26onVPv6CJk6dKklauWa8p02Zp947N2vLpBo0cNVZPffnFTvsxGI1a8+SXNWz4\nqE7LgoKD9dwLr6qtrU1/+ehtnTt9XOkrntCMWQkDfn5344oAAAAAfJ7JZFJ8QrL27tqinMNZkqSi\ngjxFRsVo7rw0Vdwo1/SZ8drw/p+Ud+m8JKmqskKvfOdvNGpMrEqKCyVJ0TGDtfLx9Ro0eGiXx0lI\nSpHT6dSG99+U3W7XlbyLMpstSlm4TGdOHXswJ9uBKwIAAADweRaLRadP5uhKXq7beFXVTYVHRGls\n7Hg5HA4V5F90Lau4cV21NdUaFzfJNbZizVNyOhx68/X/6PI4Y2InqODKZdntdtfY5YvnFRkZrajo\nmH4+q55xRQAAAAA+r6mpSTu2bpTT8fkXdBkMGh83SVWVFYqKHqRbdXVuX+AlqbamStHRg1z/3v7Z\nn1V5s6Lb40RHx6gg/5LbWE1NlSQpKnqQqqsq++Fs7g9XBAAAAIAuLEhbqphBQ3Tk0H5ZLAGy2TpP\nQrbarDJbAlz/7ikESJLZEiCbrcVt7PZ+zZYHO8maIAAAAADcJXHuAqUtXq4j2fvaf4NvkJxOZ9cr\ndzfeBYNBUner3/9u+gW3BgEAAAB3WLhkuVLSlunkscPavWOzJMna0tLlb+wtZouamzs/PrQ7Xe3H\nbG7/t9Xa0tUmA4YgAAAAAHRYvmqd5iTN1+HsfdrTEQIkqbq6UmFh4TIajXI4HK7xiMholV4rvu/9\nV1dXKiIyym0sMjK6fVnVTQ+r7x1uDQIAAAAkzV+wWHOS5mvfnm1uIUCSigry5efnr/ETJrvGBg8Z\npojIKBUXXrnvYxQV5Gvc+Eky+X3++/iJk6eqrq5GNdVVnp9EL3BFAAAAAD4vNDRMCxYuVcnVIhUW\n5Gn4yNGuZQ67XeXXS5V7/rTWrH1Gu7dvUmurTYvTV6vkaqGKCvPv+zjHc7KVMDdFzzz3dR05tF/D\nR4xWYvICbd308UCcVo8IAgAAAOhXP67t/HSdL7rYcXEymfw0avRYvfzK992WNTU16rV//ok2b/xQ\n6Sue0LIVT8jpdKog/5J2bt3Yq+M0NtTrvbdeV8bKJ7X+mRfVUF+vXds26dSJo/15OveFIAAAAACf\nd+b0CR05uNf9PQJ3abXZtOXTDdry6Yb72udPf/K3XY5fLy3RH//7v/pUZ39ijgAAAADggwgCAAAA\ngA/i1iA8NBwJ/3hf6xmP/dMAVwIAAPDw44oAAAAA4IMIAgAAAIAPIggAAAAAPoggAAAAAPggggAA\nAADggwgCAAAAgA8iCAAAAAA+iCAAAAAA+CCCAAAAAOCDCAIAAACADyIIAAAAAD6IIAAAAAD4IIIA\nAAAA4IP8vF0A0N/WfLf2/lZ8d8jAFgIAAPAFxhUBAAAAwAd5/YpAfMI8zZ2/UCGhoSovu6btWzeq\norzsntsZDAa99Mr3dauuRn/+8K0HUCkAAADw6PDqFYHpsxKUsepJnT55VH/56G3ZHQ4998KrCgoK\nvue2icmpGj5i1AOoEgAAAHj0eDUIpC5K17EjB5WdtUf5l3P14Tu/l91hV3zivB63i4iMUuqidDXU\n33pAlQIAAACPFq8FgcioGEVERCnv0gXXWFtbmwryL2tc3KQet135+Jd05mSOqqpuDnSZAAAAwCPJ\na0EgKjpGklRdXek2XltTrajoQd1uN2N2oqKiY5S5Z9uA1gcAAAA8yrw2WdhiCZAk2WxWt3GbrUUW\ni6XLbYKDQ7Q0Y402/eV9tdps/VaLwWCUwWhyHzMa3f5E7zxK/bv7szHwx3t0eucN9M8z9M8z9K/v\n6J1n6J9nHoX+GQy9r917Tw0ydPzp7LzI2cWYJGWsWqviwnzlX87t9eFSF6UrdVGG21hVVZW2bNsi\nS1CI/Mxdh4+AoNBeHwuf68/+NfTbnnonMCTcK8fls+cZ+ucZ+ucZ+td39M4z9M8zD3P/TH7+vd7G\na0HA2tIiSTJbLLJaW1zjZnOA279vmzh5qmLHT9Trv/q3z1Nbx/8bjEY5HY4ej5eVuVNZmTvdxvwt\ngRo6eoKsTQ1qtbkf02A0KiAoVC1N9ffcNzp7lPrX3FD3QI/3KPXOG+ifZ+ifZ+hf39E7z9A/zzwK\n/fM3B0jRvXtZqteCQE3H3ICIyCjV3/r8i1ZEZJSqu5gEPHHyNAUEBOr7f/O/Oi37+//9/+mXr/1U\ndbU1farF6XTI6bB3vczR/TLc26PQP2/V/yj0zpvon2fon2foX9/RO8/QP888zP1zOnsfYLwWBKqr\nKlVXV6OJk6eppLhQkmTy89O4uIk6fSKn0/pZmTt07OhBt7GVa9bL2tKsPbu2qJ5HiQIAAAD3zatv\nFj50YK+Wr1orm7VFZaUlmjsvTSaTn47nZEuShgwdLru9TZU3K1RXW9PpN/42m1UtLc0qL7vmjfIB\nAACAh5ZXg8CJnEMymy1KSErR3PmLVH79mt5763U1NtRLktY/+5Lqamv0zpu/8WaZAAAAwCPHq0FA\nkg4fzNThg5ldLvvVaz/rcVsCAgAAANA3D+/DUgEAAAD0GUEAAAAA8EEEAQAAAMAHEQQAAAAAH0QQ\nAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAfRBAAAAAAfBBBAAAAAPBBBAEAAADABxEEAAAAAB9E\nEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAf\nRBAAAAAAfBBBAAAAAPBBBAEAAADABxEEAAAAAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQAAAAA\nH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAfRBAAAAAAfBBBAAAAAPBBBAEAAADABxEEAAAA\nAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAA\nAAAfRBAAAAAAfBBBAAAAAPBBBAEAAADABxEEAAAAAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQA\nAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAfRBAAAAAAfBBBAAAAAPBBBAEAAADABxEE\nAAAAAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcR\nBAAAAAAfRBAAAAAAfBBBAAAAAPBBBAEAAADABxEEAAAAAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAH\nEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAfRBAAAAAAfJCftwuIT5inufMXKiQ0\nVOVl17R960ZVlJd1u/7shGQlJacqLDxCNyvKlbl7m4oK8h5gxQAAAMDDz6tXBKbPSlDGqid1+uRR\n/eWjt2V3OPTcC68qKCi4y/Vnzk7U8lXrdPb0cX307huquHFdzzz/dQ0eOvwBVw4AAAA83LwaBFIX\npevYkYPKztqj/Mu5+vCd38vusCs+cV6X68+dv1BnTuUoO2uPigrzteXTDbpVV6dZ8UkPuHIAAADg\n4ea1IBAZFaOIiCjlXbrgGmtra1NB/mWNi5vU5TYff/BHZWXudBtzOOzy8/P6HU4AAADAQ8Vr36Cj\nomMkSdXVlW7jtTXVmjBpSpfbVFXedP09OCRUSfPSFBkVrc82fuRRLQaDUQajyX3MaHT7E73zKPXv\n7s/GwB/v0emdN9A/z9A/z9C/vqN3nqF/nnkU+mcw9L52rwUBiyVAkmSzWd3GbbYWWSyWHred9Nh0\nrX/mRUnSiZxDunat+J7HS12UrtRFGW5jVVVV2rJtiyxBIfIzd33MgKDQe+4b3evP/jX02556JzAk\n3CvH5bPnGfrnGfrnGfrXd/TOM/TPMw9z/0x+/r3exnv31Bg6/nR2XuTsYuxO5dev6e03fq1hI0Yp\nbXGGHE6Hdmz5pMdtsjJ3drqtyN8SqKGjJ8ja1KBWW4t7eUajAoJC1dJUL6fDca+zwV0epf41N9Q9\n0OM9Sr3zBvrnGfrnGfrXd/TOM/TPM49C//zNAVL0kF5t47UgYG1p/+JttlhktX7+JdxsDnD7d1fq\namtUV1ujq8UFMplMSlucoczdW2WzWnvcrjtOp0NOh73rZY7ul+HeHoX+eav+R6F33kT/PEP/PEP/\n+o7eeYb+eeZh7p/T2fsA47UboWo65gZEREa5jUdERqm66man9U1+fpoyfVan9StuXJfRaFJwcMjA\nFQsAAAA8YrwWBKqrKlVXV6OJk6e5xkx+fhoXN1HFhVc6re+w27Vi9VNKmLvAbXxMbJxaWppVV1c7\n4DUDAAAAjwqvPnfz0IG9Wr5qrWzWFpWVlmjuvDSZTH46npMtSRoydLjs9jZV3qyQ0+nU4YOZSl2U\nocaGel0vLdHY8ROUODdFu3dslsP+cF7GAQAAALzBq0HgRM4hmc0WJSSlaO78RSq/fk3vvfW6Ghvq\nJUnrn31JdbU1eufN30iSsg/slc1m1ZzE+UpdlK7ammpt2fSxzpzM8eZpAAAAAA8dr7+J6/DBTB0+\nmNnlsl+99jP3AadTx44c1LEjBwe+MAAAAOAR9vC+NQEAAABAnxEEAAAAAB9EEAAAAAB8EEEAAAAA\n8EEEAQAAAMAHEQQAAAAAH0QQAAAAAHwQQQAAAADwQQQBAAAAwAcRBAAAAAAfRBAAAAAAfJBfnzby\n91dba6skKTAwSFOmzZLD6VDu+dNqaW7u1wIBAAAA9L9eBQFLQIDWfumrCggI1B//+z9ltlj0tW/9\nUGFhETIYpAVpy/TWG79SbU31QNULAAAAoB/06taghUtWaGzseBXkX5IkzZydqPDwCO3Z+ZneefO3\ncjqdWrhkxYAUCgAAAKD/9OqKwIRJU3TsyEFlZe6QJE2aPE2NjY06emi/JOl4TraS5qX1f5UAAAAA\n+lWvrggEB4foZkW5JMliCdCIUWNUeOWya3lTU6P8/c39WyEAAACAfterIFB/65YiIqMlSRMnT5XB\nYFT+5Quu5SNHjdGtupr+rRAAAABAv+vVrUF5ly8oMXmBLAEBmjJtllqam5R36YJCQsM0b8FiTZ85\nRwf27R6oWgEAAAD0k14FgT07P5O/v1kzZyep/lattn32Z7W1tSk0LFxzEufr/NmTOnRw70DVCgAA\nAKCf9CoIOOx2bd20QVs3bXAbv1Fepv/89/9HjQ31/VocAAAAgIHRqzkCz730LY2Njes07rDb1dhQ\nr7iJj+nV7/6434oDAAAAMDB6vCLg5++voKBg17/HjB2ny7nnVF1d2Wldg8Gg8RMmKyIyqv+rBAAA\nANCvegwCZn+zvvHtv5bFEiBJcjqlZSue0LIVT3S5vsEgFV7J6/8qAQAAAPSrHoNAU1OjNn78roaP\nGC2DQVqwcJku5Z5XxY3rndZ1Oh1qamzUhXOnBqxYAAAAAP3jnpOFC/IvqSD/kiQpLDxSJ48dUllp\nyYAXBgAAAGDg9OqpQZ9t/HCg6gAAAADwAPUqCEjSuLhJmjp9tkJCQmUwdvHQIadT7/7pd/1RGwAA\nAIAB0qsgEJ84Txkr10qSGhvrZW+zD0hRAAAAAAZWr4JAYnKqKm6U6YO3f6/GxoaBqgkAAADAAOvV\nC8XCwiJ08tgRQgAAAADwkOtVEKitqVJwSMhA1QIAAADgAelVEMjO2qOEuQsUM2jIQNUDAAAA4AHo\n1RyBUaNjZbNZ9cp3/lpVlTfV1NQop9PpvhJPDQIAAAC+8HoVBMbFTZKc0q26Ovn7mxUebh6ougAA\nAAAMoF4FgV/94mcDVQcAAACAB6hXcwQAAAAAPBp6dUXguZe+dV/rvfvH3/apGAAAAAAPRq+CQERk\nlHTX3GCD0aCgoGD5+fmptrZGNyvK+7M+AAAAAAOgd3MEXut6joDBYNDEyVO16omndSR7X78UBgAA\nAGDg9MscAafTqUu553Tq+BEtXra6P3YJAAAAYAD162Th6upKDRk6rD93CQAAAGAA9FsQMJlMmjYj\nXo2NDf21SwAAAAADpF+eGmQy+Sk6ZpACAgKVlbmjXwoDAAAAMHA8fmqQJDmcDlVVVujC2VM6npPd\nX7UBAAAAGCD98tQgAAAAAA+XXgWB2wwGg4YNH6nwiEjZ7XbV1dXqxvXS/q4NAAAAwADpdRCIm/iY\nlq9ep9DQcBkM7WNOp9RQf0vbPvuz8i/n9neNAAAAAPpZr4LAqNGxWv/Mi2psaFDm7q2qqqyQwWBQ\ndMxgxSfO0/pnXtTbb/5GpSXFA1UvAAAAgH7QqyCQuihdtbU1evN3/yGrteWOJed1PCdbX3v1B0pJ\nW6oP3/lDP5cJAAAAoD/16j0Cw0aM0qnjR+4KAe1sVqtOn8zRiJFj+q04AAAAAAOjX98s7HQ6ZTT2\n6y4BAAAADIBefWsvKy3RrPgk+fv7d1pmNls0Kz5J18uu9VtxAAAAAAZGr+YIHMjcqedf/pZe/e7/\n0LGjB1VddVOSFB0zWHMS5ys0LFzbNv95QAoFAAAA0H96FQRKrhbq4w/+pOWr1mlpxmo5nXI9QrSh\nvl6fbHhHxUVXBqJOAAAAAP2o1+8RyLt0QfmXczV02AhFREZJMqj+Vp1KS6/K6XAMQIkAAAAA+tt9\nzRGYkzRfr3znb2TomAjsdDp1veyacs+f0cTJU7X+mReVkJQyoIUCAAAA6D/3DAKPr3tWGSufVEho\nmMLDIzstr62pktPp1NKMNXpy/XMDUiQAAACA/tXjrUGz4pM0bcZsHc85pN07Nsve1tZpnX17tuvA\n/t1auWa9ps2I15X8Szp3+viAFQwAAADAcz1eEZgZP1dXiwu1Y8snXYaA2+xtbdq88UNV3CjT7DnJ\n/V4kAAAAgP7VYxAYNHiILl88d397cjp18cJZDR4ytD/qAgAAADCAegwCDodD9jb7fe+sqalRTqfT\n46IAAAAADKweg0B1VaWGDh953zsbNnyUbtXVelwUAAAAgIHVYxC4cO6Ups2YrZhBQ+65o5hBQzRt\nxmxdybvYb8UBAAAAGBg9BoGTxw+rrrZGX33525o6fbYMt18jfCeDQVOmz9JXXnxVNqtVRw9nDVSt\nAAAAAPpJj48PbbXZ9NF7b+rpr7ysx9c9q+Wr16n8eqka6m/JaDQqKDhEQ4eNkNls0a26Wn3wwR/U\n2FD/oGoHAAAA0Ec9BgFJqq66qf/+9b9rTlKKpkybqVGjx8rY8YZhu92u0pJiXco9p5PHD8tuv/+J\nxQAAAAC8555BQGr/wn/00H4dPbRfkhQYFCSnw6mWluYBLQ4AAADAwLivIHC35qam/q4DAAAAwAPU\n42RhAAAAAI8mggAAAADggwgCAAAAgA8iCAAAAAA+qE+ThQEMjH+LsHT8rVEK81N3/4n+uNb6wGoC\nAACPJq4IAAAAAD6IIAAAAAD4IIIAAAAA4IMIAgAAAIAPIggAAAAAPoggAAAAAPggggAAAADgg7z+\nHoH4hHmaO3+hQkJDVV52Tdu3blRFeVn36yfO05zE+QqPiNKtuhodP5qt4znZD7BioPfWfLf2/lZ8\nd8jAFgIAANDBq1cEps9KUMaqJ3X65FH95aO3ZXc49NwLryooKLjL9RPnLlD6iid18cIZbXjvDV04\nd1rpK59QYnLqA64cAAAAeLh5NQikLkrXsSMHlZ21R/mXc/XhO7+X3WFXfOK8LtdPmp+mEznZysrc\nqaLCfB3Yt1Mnjx3R3HlpD7hyAAAA4OHmtSAQGRWjiIgo5V264Bpra2tTQf5ljYub1Gl9o8mky7nn\nlHv+jNt4VVWFwsIjZDAy3QEAAAC4X16bIxAVHSNJqq6udBuvranWhElTOq3vsNu1c9unncbjJjym\n6qqbcjocfa7FYDDKYDS5j3UECwJG3zxK/bv7s/FF8EWs6YviUfrseQP98wz96zt65xn655lHoX8G\nQ+9r91oQsFgCJEk2m9Vt3GZrkcViua99TJs5R+PiJmnr5o/vuW7qonSlLspwG6uqqtKWbVtkCQqR\nn7nrYwYEhd5XLehaf/avod/21DuBIeH9sJeqftjH5/qnpkcb/+16hv55hv71Hb3zDP3zzMPcP5Of\nf6+38d5Tgwwdfzo7L3J2MXa3SY9N1+onvqSLF87o5LHD91w/K3OnsjJ3uo35WwI1dPQEWZsa1Gpr\ncS/PaFRAUKhamuo9utrgqx6l/jU31HW7zB7/d/e5l7/tn2I69FSTr3uUPnveQP88Q//6jt55hv55\n5lHon785QIru3dMHvRYErC3tX7zNFous1s+/hJvNAW7/7srsOclavnqtruRd0saP3/W4FqfTIafD\n3vUyR/fLcG+PQv++iPV/EWv6onkUPnveRP88Q//6jt55hv555mHun9PZ+wDjtRuhajrmBkRERrmN\nR0RGqbrqZrfbJacs0srH1+vihbP6+IM/ym5/OH9YAAAAgDd5LQhUV1Wqrq5GEydPc42Z/Pw0Lm6i\niguvdLnN1OmztSR9tU4eP6xPPn5Xjof00g0AAADgbV59s/ChA3u1fNVa2awtKist0dx5aTKZ/Fxv\nCh4ydLjs9jZV3qyQv9msjFVrVV11U2dOHdPwEaPc9lVWWnJ/kwsAAAAAeDcInMg5JLPZooSkFM2d\nv0jl16/pvbdeV2NDvSRp/bMvqa62Ru+8+RuNHjNOgYFBCgwM0kvf+KtO+/qXn/6jWm22B30KAAAA\nwEPJq0FAkg4fzNThg5ldLvvVaz9z/f1K3kX99Cf9++QVAAAAwFc9vG9NAAAAANBnBAEAAADABxEE\nAAAAAB9EEAAAAAB8EEEAAAAA8EEEAQAAAMAHEQQAAAAAH0QQ+P/bu/Ooqs973+OfvTdsEEE2g0Oc\ncEBEUURFEFTAGDEOMWawTdukzWqTnp6cnvau09O7em7PuatrndvhnNuspufe5uSkN53SpBmaqTUx\n0TiLI2rUOKCCA4jIPCuwYd8/iMQtgxsRfhue9+sfF8/v2ZsvX9G9P/v5Pb8fAAAAYCCCAAAAAGAg\nggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCC\nAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIA\nAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAA\nAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAA\nAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAA\nYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABg\nIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAg\nggW4xO0AABtrSURBVAAAAABgIIIAAAAAYCCCAAAAAGAgggAAAABgIIIAAAAAYCCCAAAAAGAgggAA\nAABgIIIAAAAAYKAAqwsAYJ01z1T7NG/D865+rgQAAAw0VgQAAAAAAxEEAAAAAAMRBAAAAAADsUcA\nGILakn/o48zv92sdAADAf7EiAAAAABjI8hWBeclpSk3PVGhYmEqKi/TRxvdUWlJ828eNuWecnnz6\n7/Xsz/6nWpqbB6BSAAAAYOiwNAjMTkpW9qoHtXPbJpVevaKUtAx9+Ymn9eKvfq7GxoZuHxcRGaVH\nH3tSdrtjAKsFzPWsK8ined+rburnSgAAwN1i6alBS7KWK3d/jvbs2qpzZ07pjVdeUmtbq+YtSOv2\nMQmJ8/Tk099RoNM5gJUCAAAAQ4tlQSAiMlouV6TO5p3sGHO73So4d0ZTYqd3+ZhwV4RWr31Uhw/u\n1bbN7w9UqQAAAMCQY9mpQZFR0ZKkyspyr/HqqkpNmz6zy8c0Njbohf/z76qtqdbspOS7VovNZpft\nltOMbHa715/onaHUv1t/N/yBP9Yk+UddQ+l3zwr0r2/o352jd31D//pmKPTPZut97ZYFgaCgYElS\nc7P3OcXNzdcVFNT1+cgtzc13vDF4SdZyLcnK9hqrqKjQBx9+oKCQUAU4u/6ewSFhd/T90O5u9q/+\nrj1T7wwLDe/2mD/WJPlvXQOJf7t9Q//6hv7dOXrXN/SvbwZz/xwBgb1+jHWbhW2f/enpfMjTxVhf\n7dq+Wbu2b/YaCwwapjETp6mpsV4tzde9y7PbFRwSpuuNdfK0td39goa4odS/a/U1VpfQiT/WJPlH\nXUPpd88K9K9v6N+do3d9Q//6Zij0L9AZLEWN7tVjLAsCTdfb33g7g4LU1PT5m3CnM9jr64Hg8bTJ\n09ba9bG27o/h9oZC//yxfn+sSfKvuobC756V6F/f0L87R+/6hv71zWDun8fT+wBj2YlQVZ/tDXBF\nRHqNuyIiVVlRZkVJAAAAgDEsCwKVFeWqqalSXPysjjFHQICmxMbp4vl8q8oCAAAAjGDpDcX27t6m\nFavWqbnpuoovFyo1LUMOR4AOHdwjSRo9ZqxaW90qLyu1skwAAABgyLE0CBw+uFdOZ5CSUxYpNT1L\nJVeK9KeXf62G+jpJ0iOPfU011VV65XcvWFkmAAAAMORYGgQkaV/Odu3L2d7lseef+2m3jzv+Sa6O\nf5LbT1UBAAAAQ9vgvWsCAAAAgDtGEAAAAAAMRBAAAAAADGT5HgEMXmueqb7NjApJ0obnXf1fDAAA\nAHqFFQEAAADAQAQBAAAAwEAEAQAAAMBABAEAAADAQAQBAAAAwEAEAQAAAMBABAEAAADAQAQBAAAA\nwEDcUAydtCX/0MeZ3+/XOgAAANB/WBEAAAAADEQQAAAAAAxEEAAAAAAMRBAAAAAADEQQAAAAAAxE\nEAAAAAAMRBAAAAAADEQQAAAAAAxEEAAAAAAMRBAAAAAADEQQAAAAAAxEEAAAAAAMRBAAAAAADEQQ\nAAAAAAxEEAAAAAAMRBAAAAAADEQQAAAAAAxEEAAAAAAMRBAAAAAADBRgdQEY+p51Bfk073vVTf1c\nCQAAAG5gRQAAAAAwEEEAAAAAMBBBAAAAADAQQQAAAAAwEEEAAAAAMBBBAAAAADAQQQAAAAAwEEEA\nAAAAMBA3FAMwINqSf+jTPHvuj/u5EgAAIBEEAPiZNc9U+zRvw/Oufq4EAIChjVODAAAAAAMRBAAA\nAAADcWoQAPiAU5YAAEMNQQCA0XzdxCx9v1/rAABgoBEEAAxKz7qCejjaII0IkBSg71U3DVRJAAAM\nKuwRAAAAAAxEEAAAAAAMRBAAAAAADMQeAQC4i3reu/A59i4AAKzGigAAAABgIIIAAAAAYCCCAAAA\nAGAgggAAAABgIDYLA4Cf8fVux2tTfLvb8YbnXX0pBwAwRLEiAAAAABiIIAAAAAAYiCAAAAAAGIg9\nAhbz9Vxge+6P+7kSAAAAmIQgAABDHHc7BgB0hSAwSKx5ptqneVwdBAAAAL5gjwAAAABgIFYEAAA+\n4f4GADC0sCIAAAAAGIggAAAAABiIIAAAAAAYiD0CQwyXCQQwWPD/FQBYiyAAABi02MAMAHeOU4MA\nAAAAAxEEAAAAAANxahAAAJ+5W/sWWuf9wKfnsef+2Kd5ANAfCAIAAFhkzTPVPs1j7wKA/sCpQQAA\nAICBWBEAAMDP3Y1TlrjCEoBbsSIAAAAAGIgVAQAA0Gt3a2P1zSsV9T3MY6UCuPsIAgAAADfx9TQq\nrvqEwY4gAAAAhoy7tVLhi4G+6tPtAsqNFRUCCnxFEAAAAOhHAxlOJP8LKDcQUPyP5UFgXnKaUtMz\nFRoWppLiIn208T2VlhR3O3/6jNnKWJotV0SUKsqvauum93Xh/LkBrBgAAGDwG8oB5c6uklXR7byh\nuvfE0iAwOylZ2ase1M5tm1R69YpS0jL05See1ou/+rkaGxs6zZ80OVYPrX9cB/fv1vn8M5ozd4HW\nf/nr+s1/PaeK8lILfgIAAADcTQMdUHzhjzXdDZZePnRJ1nLl7s/Rnl1bde7MKb3xyktqbWvVvAVp\nXc5fnLVcZ/NOastHf1XBuTy98+dXVF52VQsXZQ5w5QAAAMDgZlkQiIiMlssVqbN5JzvG3G63Cs6d\n0ZTY6Z3mBwQEaNz4GJ3NO/H5oMejs3knu5wPAAAAoHuWnRoUGRUtSaqsLPcar66q1LTpMzvNd0VE\nyeFwqKqy4pb5FQoLC1eg06mW5uZe1WCz2SRJgc5g2Wzemchmt8sREChncIg8bW29et7eaGv17Xy5\nxtpQn+ZdDfBt6coZ3P1fvT/WJPlnXf5Yk+SfdfljTZJ/1mVlTT3930evbl9TR//8rC7J/3p1gz/W\n5Y81SdR1q8H4d9ifAgKdkj5/f+sLW2rGak9/FdSTmbOStO7Rr+jZn/2Lmq5f7xhfsHCx7l2+Wv/2\nr//kNX/c+Bh97alv6/+98AuvzcRx8Ql69LEn9R/P/qvq62q7/X5LspZrSVa211hBQYFy9ubcpZ8I\nAAAAsFb5lUu6Vu9bELIuttwIK13EEE9X0cTW00HJ0834Dbu2b9au7Zu9xux2u4JCRqjV3dTl0379\nm9/Vb178ZY/Pi+7RvztH7/qG/vUN/esb+nfn6F3f0L++Gez9s9kkR0CQmhq7/2D8VpYFgRurAM6g\nIDU1fb4i4HQGe33d1fybOZ3tX3f1mNtpa2vrMTFFRUWppelar58X7ejfnaN3fUP/+ob+9Q39u3P0\nrm/oX98Mjf71rn7LNgtXfbY3wBUR6TXuiohUZUVZp/nVVRVqa2uTKyLqlvlRqq2tlrulpf+KBQAA\nAIYYy4JAZUW5amqqFBc/q2PMERCgKbFxung+v9N8t9uty4UXND0+4fNBm03Tps/scj4AAACA7ll6\nQ7G9u7dpxap1am66ruLLhUpNy5DDEaBDB/dIkkaPGavWVrfKy9pvFrZn9zZ98SvfUPaqdTp35pQS\nk5IVPXK0Nrz7upU/BgAAADDoOMbHxP3Iqm9+pbhIbrdb85LTNHtOshoa6vXe23/qOG3oa099W+Mn\nTtbxT3IltZ9OVF1VqTnzUpQ0L1Uej0fv/+VNFRdd6rcaL10o6LfnNgH9u3P0rm/oX9/Qv76hf3eO\n3vUN/esb0/pn2eVDAQAAAFjHsj0CAAAAAKxDEAAAAAAMRBAAAAAADEQQAAAAAAxEEAAAAAAMRBAA\nAAAADGTpDcUGixkJiUpbvFSRUSNVX1erT48d0Z5dW9TW1mZ1aX5pXnKaUtMzFRoWppLiIn208T2V\nlhRbXZbfszscSlu0VLPnzFNoWLiqKsu1Z9cWnTpxzOrSBp1Ap1PffOYfderkMW3dtMHqcgaNqdPi\nlXnvCkVFj1ZdXY0O7t3VcYNH3IbNpoXpmUqan6rhw0NVerVEWzdv0OXCi1ZX5tfi4hO0au16Pffv\nP/IaX5y5XEnzUxQcHKJLF/P10fvvqKa6ypoi/VhX/XM6g5SxNFtxM2Zp2LAQlZVe1Y6tG3XxfL51\nhfqp7n7/bggbEa6nn/medmz9UIcODM3/C1kRuI1p0xP00PonVHjxvP782u916OAeLVyUqWXZa6wu\nzS/NTkpW9qoHdfTIAb3z5h/V2tamLz/xtEJChltdmt+7975VWrgoU4cO7tWfX/udLl3I10Prn1Bc\nfILVpQ06S5etVLgrwuoyBpWYSVO1/ktPqrioUG+8+pJOHj+i7FUPKmH2XKtLGxRS0zKUtex+HT18\nQG+9/gfV19XoS098UxGRUVaX5rfGjpugNeu+2Gl8SdZyLVyUpT27tuovb7+qsLBwPfbE07I7HBZU\n6b+6698DD31RCbPnKmfnFr39xsuqqa7Ul554WmPGjregSv/VXf9udv/qhxUcPGyAKrIGKwK3kZqe\noTOnT2jzh3+RJF0oOCu73aGsZSu1dfP7am1ttbhC/7Ika7ly9+doz66tktr79bff/YHmLUjT7h0f\nW1yd/3IEBGjegnRt+/gDHdy3S1J77yIio5Wa1v47CN+MmxCj2UnJun79mtWlDCqZy1bqzOkT+vD9\ntyVJF8/nyxURpclT43Ti+BGLq/N/s+fM16fHjmjv7m2SpEsXC/Sdf/hnzUqcr13bN1lcnX+x2e1K\nTklX1rJVcrtbvI45nUFKScvQji0bdfjgXknS5cKLeua//Q/NnJWkT48esqJkv9JT/1wRkZo+Y7b+\n/Nrvdeb0p5Kk8wVnNXLUGC1IXay/vvOaFSX7lZ76d7OZs+Zo9D1jB7Aya7AicBuFFwt09MgBr7HK\nijI5HA6FjXBZVJV/ioiMlssVqbN5JzvG3G63Cs6d0ZTY6RZW5v+Cg4J19PAB5Z895TVeUVGmcFek\nRVUNPnaHQ6vXrtfObZsIAr0wfHioxk+I0ZFD+73G//L2n7Th3dctqmpwCQgIUHNzU8fXba2tam5u\nVvCwof1p4p2YMHGSlmRla/uWD5S7P8fr2NjxExUUFKwzeZ9/+NHQUK/ioouayuuIpJ7753A4dCR3\nny5dvOk0II9HVZXlcrFKKqnn/t0wbFiIlq9cp00fvDfA1Q08VgRuY8fWjzqNxU6boebmJtXVVltQ\nkf+KjIqWJFVWlnuNV1dVatr0mVaUNGg0NNTrow/e8R602TQ1droqykutKWoQWpyxTM3Nzcrdv1sL\nFi62upxBI3rUaElSq9utxx5/ShMnTdW1xgbl7NrS8aksenY4d58WZ96nvFPHVXLlsubOX6gR4eE6\nzR6fTsrLruo/f/kzXbvWqCVZy72ORUWNVGtrq2pqvF9fq6oqNXrMPQNZpt/qqX8V5WXauOEtrzGn\nM0gTJk5WHivLknru3w333b9WRZcudKyqDGVGBwG73d7j+Zu1tTVqaW72GouZPFVz5i3Qvj07OC3o\nFkFBwZLk9alY+9fXFRQUZEVJg9rijGWKHjlaH3/0V6tLGRRGjhqt1PRM/eGlX8nj8VhdzqASEhIq\nSVr7yJd07Eiu9uZs07TpCbp/9cNqqK9T3qmh/2LYV0dy92rylGn6yte+1TG26YN3VXjpvIVV+afG\nhoZujzmDgtTS0izd8m+4ublJzs9eY0zXU/+6snzlWgUFD1Pu/t39VNHgcrv+TZ4ap2nTZ+rFX/18\ngCqyltFBIGxEuP7m2/+92+N/fu13Xudmj584SY8+9qQuFxVq1zbO+ezE9tmfXbwH431Z7yxIXayM\npSu0f88OFZzLs7oc/2ezadXa9Tp0cK+ucoWqXruxCfPM6RPaua19FfTi+XxFREZpUcZ9BAEfPPb4\nU4qMHqX3//KmqisrFDdjlu67/wHV1tYY8ani3WKz2boP8ryQ9Nqy7DWaMzdFmz54V2WlJVaX4/cC\nAwO1cs0j2rH1Q9XX1VpdzoAwOgjUVFfpJz/6vk9zY+Nm6KH1j6v0aoneePUlVgO60HT9uqT2T3Sa\nmq53jDudwV5fo2eZ967Qooz7dCR3n7Zw6UufLEhdpNDQEdq9Y7Ns9s+3PtnUvjHMw6V+e9Ty2Sre\nraHzQv5ZLV2+SrLZeBPWg/ETJ2lCzBS98epvdO5M+z6fixfyFRIyXPdmryYI9ELT9etyOp2dxp3O\nIF5HesFmt2v12vVKTErW9i0blXug63Ph4S1z2Uo1NtbryKH93q8lNlvPIXUQMzoI+Grm7CQ9sO4x\nFRVe0Juv/rbTqS9oV/XZ3gBXRKTqams6xl0RkaqsKLOqrEFlxaqHND8lXfv27OD6970QFz9L4a4I\n/eM//S+v8dT0TKWmZ/oc+E1VVVkhqX3D683sDodshIDbGvHZhSOKiy55jRcVXlDC7LmE0V6orCyX\nwxGgEeEu1d60TyAiIlKVFeU9PBI32O12PfyFr2ra9BnavPE9HeSUIJ/FxSfI5YrUD/7lZ17j2SvX\nKSUtQ88/91OLKus/BIHbmBgzRQ+se0wF+Xl6+42X1ep2W12S36qsKFdNTZXi4mep8GL7ebGOgABN\niY3T0cMHLa7O/6UvuVfzU9K1Y+uHytm5xepyBpWNf31Lzlv2oaz/0pO6UHCOF0EflJVdVV1djeJn\nJur0yeMd41Nip+vyLW9u0dmNCySMmzBJZ2+62s3YcRNVW1tNCOiFosILamlpUVx8QscVXYYPD9XY\n8THadOsFFdClFasfVmzcDG149w0d53KrvfLmq7+V45YPRL7+ze9qb872IXvpWoJAT2w2rXzgETU1\nXdeBvTs1eoz39WRLS4rlJhh42bt7m1asWqfmpusqvlyo1LQMORwB3J30NkaEu7Qka7kKL13Q+YKz\nGjt+YsexttZWlVy5bGF1/q+rFafW1lY1NNSrpLjIgooGGY9Hu7Zt0qq161VXW6P8c3mKnzlbkyZP\n1Wt/fMnq6vxeSXGR8s+e1uq1j2r7luGqrqrU1LgZmpU4Vx9u4M1rb7Q0Nyv3QI7uXb5aNptN1VVV\nyliarbq6Gn3K/Sxua9yEGM2dn6rTJ4+poqLM67WkpblJZaVXLazO/3W3j6K2pmrI7rEgCPQgOnqk\noqJHSZLXlSBu+PXzP+cf1S0OH9wrpzNIySmLlJqepZIrRfrTy79WQ32d1aX5tdi4GXI4AjRh4iQ9\n+dTfex1rbGzo9vbnwN3yyeEDam1rU9qiLM1PSVdVZYXefuOPOp9/xurSBoW33/iDMpetVMbSFXIG\nBauivFTvvPlHrxUW+Gb7lo2ySUpfskwBAQEqvHhemza+x4q8D+LiZ0mS4mcmKn5motexK8WF+u2L\n/2FFWfBjttSM1Zz8CQAAABiGOwsDAAAABiIIAAAAAAYiCAAAAAAGIggAAAAABiIIAAAAAAYiCAAA\nAAAG4j4CAAAvDodDKWkZmjkrSRGR0fJ42lRZUa5TJ47q4P7dXM8dAIYIggAAoIPNbtdjjz+lcRNi\ndPzoIR05tE92u10TJk7W0vtWatr0BL36+xfU2tpqdakAgD4iCAAAOsxISFTM5Fi99frvlXfq047x\n3P05Sk3P1LLsNZozN0WHc/daWCUA4G5gjwAAoMP4CZMkSQX5ZzodO3xwj1pb3Ro3IWaAqwIA9AdW\nBAAAHZqbmiRJc+cv1IG9O72OtbS06H//5J/VdtNpQVHRI5WxdIViJsfKbrfrakmxdm79SIWXznfM\nGTlqjDLuXaGYSVPlcASo9Gqx9u7epjOnT3TM+cqT35Lb7VZJcaEWLFyilpYWvfr7/1JZaYmiR45S\n5r0rFTN5qhwOh0quFGv3js0630VYAQD4zjE+Ju5HVhcBAPAP9fV1mjMvRbFxMxQ/M1GhoSPkkUf1\ndbXyeDzyeDwdcyMio/Xk099RuCtChw7k6FzeKU2ImayUtCUqOJen+rpa3TN2vJ74+t9peMhwHdyf\no/xzpzXmnnFKSctQY0ODrhQXSpISk5I1bvxEhYdHaPeOj1VTU6WTn36ikaPG6Kvf+DsFBgYqd3+O\nzuef1egx92hhepYqystUXnbVqlYBwKBHEAAAdGhsbFDJlcuaPGWaXBFRmjhpihKTFiglbYlGjhqj\nstIrunatUZJ0/+qHFD1ytH774i+Vd+pTXSku1KkTRzU/JV2hoWE6ffKYHvniVxUSMlwvvfALnTtz\nSsVFl3Ts6CFNjY1XQuJcHTm0T+6WFiUmJSsqaqRef+Ulnck7oQsFZyVJD61/XHa7Xb954Re6dKFA\nxUWXdPSTXE2aHKtZifN0cP9ur3ACAPAdewQAAF7yz57W/33uJ3rnzZd1/Ogh1dXVyOkMUsLsufrG\nt/5BE2OmSDabpk6LV/7Z06qqrOh47LVrjXr5N7/Spo3vafjwUI0bH6NPjx1WXW1Nx5xWt1v792xX\nYKBTk6fEdYy3tDSruLio4+thw0IUM2mq8s+eVkBgoIaFhGhYSIiCg4OVd+pThYaGaezYCQPSEwAY\nitgjAADopNXt1qkTx3TqxDFJ0uh7xmlheqYSZs/V/Wse1h9/+58KCgpWZUV5p8eWlbafrjN2XPub\n9Mrysk5zystKJUnhroiOsWuNjdJNn+67IqMkSQtSF2tB6uIu6xwR7pIK7+QnBAAQBAAAkqTAwECl\nL1mmkitFXpcOlaSrVy7rvbdeVVBwsGKnzZDd4ZAkedTDaTk2Ww+H2o/dfD+CNk+b1xy7rX3ROvdA\njtfG4puVlZZ0//0BAD0iCAAAJElut1up6Zm6XHihUxC4obz0qqbGTldzc5NaWpoVERHVaU5qeqZC\nQ8O0b88OSVJU9KhOc6KiR0qSamuqu62nurpSktTW1taxZ+CG6JGjFO6KlLulxbcfDgDQCXsEAACS\nJI/Ho1MnjipmcqwSEud1Oh48bJjiZybqfME5NTc1qSD/jKZOi1fYiPDP5wQP08L0TLkiotRQX6fi\ny4VKSJzrNcfucCglLUNud4vOF3R/CdAbj09MSlZo2IjPH2+3a/WDX9DDX/iq7HZexgDgTnHVIABA\nh8JLBYqbnqC58xdq7PgYhYQMV/TI0YpPSNSqBx5VYKBTb73+B12/1qjSkitKmp+qxKRkOQICNHrM\nWGWvWqfhoWF6761X1NjYoLLSEiXOXaDZc+YrINCpMfeMVfbKBzV23ER9/OFfVXix/X4DiUnJCg4e\npoP7dnvVU1ZaojlzU5T42eNHjhqtZdlrNH7iZO3c9pHO37JSAADwnS01YzXXXQMAdAgMDFRKWoam\nTU9QRGSUAgOdqq+r1bmzp5Szc4sa6us65kaPHK2sZSs1cdIUeTweXblcqG0ff6CrJcUdc0bfM04Z\nS7M1YeLkjpuO7cvZobN53jcUC3dF6PnnftqpntH3jFNGVrYmxEyW3e5QZUWpDu7breNHD/VvIwBg\niCMIAAAAAAbi5EoAAADAQAQBAAAAwEAEAQAAAMBABAEAAADAQAQBAAAAwEAEAQAAAMBABAEAAADA\nQAQBAAAAwEAEAQAAAMBA/x/luN0eVuBD+QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jtplot.style('onedork', ticks=True, fscale=1.5)\n", "jtplot.figsize(x=11., y=8.)\n", "\n", "# Plot the inner 90 of data for 'score'. \n", "years = ['2008', '2009', '2010']\n", "score_ranges = [tuple(data[y].score.quantile([0.05, .95])) for y in years]\n", "print(score_ranges)\n", "\n", "# Pick the widest range to fit all data in plot.\n", "from operator import itemgetter\n", "score_range = [min(score_ranges, key=itemgetter(0))[0],\n", " max(score_ranges, key=itemgetter(1))[1]]\n", "print('sr:', score_range)\n", "num_bins = int(score_range[1] - score_range[0] + 1)\n", "print('nb:', num_bins)\n", "\n", "score_data = [data[y].score for y in years]\n", "plt.hist(score_data,\n", " bins=num_bins,\n", " normed=True,\n", " align='left',\n", " label=years,\n", " range=score_range)\n", "\n", "plt.title('Comment Scores (Normalized)')\n", "plt.xlabel('Score')\n", "plt.ylabel('Counts')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualization: Word Distributions" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from nltk import word_tokenize\n", "from collections import Counter\n", "from itertools import chain\n", "\n", "jtplot.style('onedork', ticks=True, fscale=1.5)\n", "jtplot.figsize(x=11., y=8.)\n", "\n", "#$word_tokenize(data['2008'].loc[0, 'body'])\n", "pd.set_option('display.max_colwidth', 1000)\n", "#pd.DataFrame(data['2008']['body']).head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from nltk import FreqDist\n", "\n", "wt = Counter(chain.from_iterable(data['2008']['body']))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time to run parallel_map_list: 13.947 seconds.\n", "DONE\n" ] } ], "source": [ "tokenized = parallel_map_list(fn=DataHelper.word_tokenizer, \n", " iterable=data['2008'].body.values)\n", "print('DONE')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data_helper.set_word_freq(Counter(chain.from_iterable(tokenized)))" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": true }, "outputs": [], "source": [ "most_comm = data_helper.word_freq.most_common(20)\n", "words, counts = zip(*most_comm)\n", "\n", "x_labels = words\n", "counts_series = pd.Series.from_array(counts)\n", "\n", "plt.figure(figsize=(16, 10))\n", "ax = counts_series.plot(kind='bar')\n", "ax.set_title('Most Common Words 2008')\n", "ax.set_ylabel('Counts')\n", "ax.set_xlabel('Words')\n", "ax.set_xticklabels(x_labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Preprocessing" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "PROJECT_ROOT = '/home/brandon/Documents/DeepChatModels'\n", "REDDIT_DIR = '/home/brandon/Datasets/reddit'\n", "SOURCE_DIR = os.path.join(REDDIT_DIR, 'raw_data')\n", "TARGET_DIR = os.path.join(REDDIT_DIR, 'raw_data_columns_removed')\n", "YEAR = '2009'\n", "TARGET_FILE = os.path.join(TARGET_DIR, YEAR + '_cols_removed.json')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data_helper = DataHelper()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "data_helper.file_counter = 9\n", "print(data_helper.file_paths[data_helper.file_counter:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load 2007 Data in DF" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = data_helper.safe_load()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "print(\"df has {} rows.\".format(len(df.index)))\n", "print(\"df has columns:\\n\", df.columns)\n", "df.body.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = remove_extra_columns(df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "print(\"df has {} rows.\".format(len(df.index)))\n", "print(\"df has columns:\\n\", df.columns)\n", "df.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In One Function" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def remove_extra_columns_and_save()\n", " print(\"Removing extra columns . . . \")\n", " df = remove_extra_columns(df)\n", " print(\"Saving to {} . . . \".format(TARGET_FILE))\n", " DataHelper.df_to_json(\n", " df, \n", " orient='records', \n", " lines=False, \n", " target_file=TARGET_FILE)\n", " print(\"Done!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Loading back later" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_loaded = pd.read_json(target_file)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "len(df_loaded)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "file_names = []\n", "for y in ['2007', '2008', '2009']:\n", " file_names.append(y + '_cols_removed.json')\n", "file_names = file_names[:-1]\n", "#file_names[-1] = '2009_cols_removed_part_1.json'\n", "#file_names.append('2009_cols_removed_part_2.json')\n", "file_names = [os.path.join(TARGET_DIR, fname) for fname in file_names]\n", "pprint(file_names)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "list_ = []\n", "for file_path in file_names:\n", " print('file:', file_path)\n", " sys.stdout.flush()\n", " list_.append(pd.read_json(file_path))\n", "df = pd.concat(list_).reset_index()\n", "del list_\n", "list_ = None" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_cols_removed.json')\n", "DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Stage 2: Regex, Long Comments, and Contractions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Regex" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DataFrame loaded.\n" ] } ], "source": [ "TARGET_FILE = os.path.join(TARGET_DIR, YEAR+'_cols_removed_part_1.json')\n", "df = pd.read_json(TARGET_FILE)\n", "print('DataFrame loaded.')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time to run regex_replacements: 583.041 seconds.\n", "Regex replacements done.\n" ] } ], "source": [ "from data.reddit_preprocessor import regex_replacements\n", "df = regex_replacements(df)\n", "print('Regex replacements done.')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_regex_replaced.json')\n", "DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Long Comments" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_regex_replaced.json')\n", "df = pd.read_json(TARGET_FILE)\n", "print('DataFrame loaded from', TARGET_FILE)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "reload(data)\n", "from data.reddit_preprocessor import remove_large_comments, expand_contractions\n", "df = remove_large_comments(df=df, max_len=20)\n", "df = expand_contractions(df)\n", "print('Remove large comments and contractions done.')\n", "\n", "TARGET_FILE = os.path.join(TARGET_DIR, YEAR+'_large_comments_contractions.json')\n", "DataHelper.df_to_json(df, orient='records', lines=False, target_file=TARGET_FILE)\n", "\n", "print('done')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Stage 3: Parallel Calls" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DataFrame loaded from /home/brandon/Datasets/reddit/raw_data_columns_removed/2007-8_large_comments_contractions.json\n" ] } ], "source": [ "from data.reddit_preprocessor import parallel_map_list\n", "from data.reddit_preprocessor import data_helper\n", "TARGET_FILE = os.path.join(TARGET_DIR, '2007-8_large_comments_contractions.json')\n", "df = pd.read_json(TARGET_FILE)\n", "print('DataFrame loaded from', TARGET_FILE)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time to run parallel_map_list: 19.272 seconds.\n" ] } ], "source": [ "from collections import Counter\n", "from itertools import chain\n", "sentences = parallel_map_list(fn=DataHelper.word_tokenizer, iterable=df.body.values)\n", "data_helper.set_word_freq(Counter(chain.from_iterable(sentences)))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time to run parallel_map_list: 215.748 seconds.\n" ] } ], "source": [ "from data.reddit_preprocessor import sentence_score\n", "df['score'] = parallel_map_list(fn=sentence_score, iterable=sentences)\n", "del sentences" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAgECgQAXLlwgPT0dgJycnFBonjx5kvvuu4/4+HgiIiJwuVyhOo/Hg8vlIiIigvj4eFJTUzl58mT4\nVy0iIpPGqJ7RdXR0cOzYMR58sH9X/g8++IC8vDzWr18/KHh8Ph92uz30u8PhwOfz3bR84BiHw/GV\ndX6/f9BxCQkJeL3e0XRdREQmqRF/Tc/Vq1d54YUXyM/PZ968ecTHx3Po0CFmzJjBhx9+yHPPPcfr\nr79OYmIilmV95TluVj6ccI/bs2cPFRUVg8pmx85hpWttWOcTEZGJZ0RBd/36dYqKirj77rt57LHH\nAJgxY0aofuHChdx77728//77JCYmhmZjSUlJQP+CFrvdjmVZg257DpQD2O123n///UF18fHxobob\nj2tvb+eee+4Ztt8FBQUUFBQMKvP6LrG/unEkly0iIgYY0a3Ln//850RHR7Np06ZQ2aeffhqaafl8\nPv785z8zf/58ADIzM3nzzTcBOHHiBImJicTGxhIXF8fcuXM5ceIEAHV1dWRmZgKQlpbGqVOn8Pv9\nBINBDh48iNPpBMDpdNLY2EgwGMTv9/POO++QlpY2RkMgIiImG3ZG9+6771JXV8eCBQvIy8sDIDs7\nmylTpvD73/+eiIgILMvi+eefJzk5GYDHH3+cLVu24Ha7mT59Otu2bQudr6ioiJdffplXXnmFu+66\ni9LSUgBmzpzJxo0beeqpp7AsC6fTydKlSwFYunQpzc3N5ObmYrPZ2LhxIzNnzhzzwRAREfPYrHAf\ngE1QA7cu1+W5cNjjwjrH9zb9cUSve7v8wbDOLyIiXxbu57d2RhEREaMp6ERExGgKOhERMZqCTkRE\njKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERE\nxGgKOhERMZqCTkREjKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoEXe6Ayb73qY/\nDvr97fIH71BPREQmL83oRETEaMMGndfr5cc//jGrV6/m4YcfZufOnViWBUBlZSVutxu3201lZWXo\nmGAwSHFxMW63m9WrV9PS0hKq8/v9rF+/nuzsbNavX4/f7w/VtbS0sHr1atxuN8XFxQSDwVDdzdoS\nEREZyrBBN3XqVAoLC6mtraW6upo//elPeDwezp8/T3V1NVVVVVRVVVFdXc3HH38MQENDAz09PTQ0\nNLBjxw5KSkro6+sDYNeuXWRlZVFfX09WVha7d+8GoK+vj5KSEnbs2BE6vrGxEWDItkRERIYybNDN\nmTOHxYsXAzBt2jRSUlLw+Xw0NTWxfPlyoqOjiY6OZtmyZTQ1NQHg8XjIzc0FICUlhdmzZ3PmzBkA\njh8/jsvlAsDlcnHs2DEATp8+TWxsLCkpKQDk5OTg8XgAhmxLRERkKKN6RtfR0cGxY8d48MEH8fl8\n2O32UJ3D4cDr9QL9tydvrEtISMDr9dLR0UFkZCRRUVEAREVFERkZSUdHBz6fD4fDMeh8Pp8PYMi2\nREREhjLiVZdXr17lhRdeID8/n3nz5g352oFneCMtH64uXHv27KGiomJQ2ezYOax0rR3ztkREZHwa\nUdBdv36doqIi7r77bh577DEA7HZ7aMYF/YtWBmZdA3UDgdje3o7dbicmJobe3l56enqIioqip6eH\n3t5eYmJivjRL83q9xMfHD9vWUAoKCigoKBhU5vVdYn9140guW0REDDCiW5c///nPiY6OZtOmTaGy\nzMxMjhw5Qnd3N93d3Rw9epTMzEwAnE4ndXV1ALS1tREIBFi8eDE2m42MjIzQIpPGxkYyMjIAWLRo\nEZcuXaKtrQ2A+vp6nE7nsG2JiIgMZdgZ3bvvvktdXR0LFiwgLy8PgOzsbPLz81mzZk2oLC8vj6Sk\nJKB/kUlraysul4tp06ZRUlLClCn9mVpYWEhRURH79+8nLi6O7du3A/2rO4uLi9m8eTPXrl1jyZIl\noUUrSUlJN21LRERkKDbrdjwcG8cGbl2uy3PhsMeFdY4v7ngyUtoZRUQkfOF+fmtnFBERMZqCTkRE\njKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERE\nxGgKOhERMZqCTkREjKagExERoynoRETEaAo6ERExmoJORESMpqATERGjKehERMRoEXe6A5PJ9zb9\nMfTz2+UP3sGeiIhMHprRiYiI0RR0IiJitBEFXWlpKStWrCA1NTVU1tLSQlpaGo8++iiPPvoo//RP\n/xSq6+rqYsOGDbjdbvLz8zl79myo7uzZs6xduxa3282GDRvo7u4O1R0+fJjs7Gzcbje7d+8e1Idd\nu3bhdrvJzs7m8OHDYV+wiIhMLiMKuqysLKqqqr5UvmjRImpqaqipqeGXv/xlqHzfvn0kJyfT0NDA\n008/TVlZWaiutLSUZ555hoaGBpKTk3njjTcAuHLlCuXl5ezdu5fa2lpOnTrFW2+9BUBzczOtra3U\n1tayd+9eysvL6erqupXrFhGRSWJEQXf//fcTGxs74pN6PB5yc3MBSE9P55NPPiEQCBAIBLhw4QLp\n6ekA5OTk4PF4ADh58iT33Xcf8fHxRERE4HK5QnUejweXy0VERATx8fGkpqZy8uTJUV2oiIhMTrf0\njO6DDz4gLy+P9evXDwoen8+H3W4P/e5wOPD5fDctHzjG4XB8ZZ3f7x90XEJCAl6v91a6LiIik0TY\nf15wzz33cOjQIWbMmMGHH37Ic889x+uvv05iYiKWZX3lMTcrH064x+3Zs4eKiopBZbNj57DStTas\n84mIyMQTdtDNmDEj9PPChQu59957ef/990lMTAzNxpKSkgDwer3Y7XYsywrN0m4sB7Db7bz//vuD\n6uLj40N1Nx7X3t7OPffcM2wfCwoKKCgoGFTm9V1if3VjGFcsIiITUdi3Lj/99NPQTMvn8/HnP/+Z\n+fPnA5CZmcmbb74JwIkTJ0hMTCQ2Npa4uDjmzp3LiRMnAKirqyMzMxOAtLQ0Tp06hd/vJxgMcvDg\nQZxOJwBOp5PGxkaCwSB+v5933nmHtLS08K9aREQmjRHN6H7605+GnsE99NBDpKWlcffdd/P73/+e\niIgILMvi+eefJzk5GYDHH3+cLVu24Ha7mT59Otu2bQudq6ioiJdffplXXnmFu+66i9LSUgBmzpzJ\nxo0beeqpp7AsC6fTydKlSwFYunQpzc3N5ObmYrPZ2LhxIzNnzhzTgRARETPZrHAfgE1QA7cu1+W5\ncNjjwjrHjVt5hUtbgImIjE64n9/aGUVERIymoBMREaMp6ERExGgKOhERMZqCTkREjKagExERoyno\nRETEaAo6ERExmoJORESMFvamznJrvri7inZKERG5PTSjExERoynoRETEaAo6ERExmoJORESMpqAT\nERGjKehERMRoCjoRETGagk5ERIymoBMREaMp6ERExGgKOhERMZqCTkREjKZNnceJGzd51gbPIiJj\nZ9gZXWlpKStWrCA1NXVQeWVlJW63G7fbTWVlZag8GAxSXFyM2+1m9erVtLS0hOr8fj/r168nOzub\n9evX4/f7Q3UtLS2sXr0at9tNcXExwWBw2LZERESGM2zQZWVlUVVVNajs/PnzVFdXU1VVRVVVFdXV\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from jupyterthemes import jtplot\n", "jtplot.style('onedork')\n", "jtplot.style(ticks=True, grid=False)\n", "jtplot.figsize(aspect=1.2)\n", "plt.hist(df['score'].values, bins=100,\n", " range=(0., df['score'].quantile(0.7)))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Final Stage" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Prepping for the grand finale.\n", "Time to run children_dict: 4.701 seconds.\n", "Final processed file has 306164 samples total.\n" ] } ], "source": [ "# Keep the desired percentage of lowest-scored sentences. (low == good)\n", "from data.reddit_preprocessor import children_dict\n", "keep_best_percent = 0.7\n", "df = df.loc[df['score'] < df['score'].quantile(keep_best_percent)]\n", "\n", "print('Prepping for the grand finale.')\n", "comments_dict = pd.Series(df.body.values, index=df.name).to_dict()\n", "root_to_children = children_dict(df)\n", "data_helper.generate_files(\n", " from_file_path=\"from_file.txt\",\n", " to_file_path=\"to_file.txt\",\n", " root_to_children=root_to_children,\n", " comments_dict=comments_dict)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exploration" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.style.set_properties(subset=['text'], **{'width': '800px'})\n", "def get_comments(df, n=10):\n", " i = 0\n", " while i < len(df.index):\n", " yield df.loc[i:i+n]['body']\n", " i += n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "gen = get_comments(df, 5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "comments = next(gen)\n", "for comment in comments:\n", " print(comment)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: notebooks/TensorFlow Notes.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "# TensorBoard Usage -- Updated\n", "\n", "Looks like I need to relearn Tensorboard since my old code is all deprecated :/\n", "Tutorial link: [link](https://www.tensorflow.org/get_started/summaries_and_tensorboard)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "1. Create the TensorFlow graph that you'd like to collect summary data from, and decide which nodes you would like to annotate with summary operations.\n", "```python\n", "def variable_summaries(var):\n", " \"\"\"Attach a lot of summaries to a Tensor (for TensorBoard visualization).\"\"\"\n", " with tf.name_scope('summaries'):\n", " mean = tf.reduce_mean(var)\n", " tf.summary.scalar('mean', mean)\n", " with tf.name_scope('stddev'):\n", " stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))\n", " tf.summary.scalar('stddev', stddev)\n", " tf.summary.scalar('max', tf.reduce_max(var))\n", " tf.summary.scalar('min', tf.reduce_min(var))\n", " tf.summary.histogram('histogram', var)\n", "```\n", "\n", "2. To generate summaries, we need to run all of these summary nodes. Combine them into a single op that generates all the summary data.\n", "```python\n", "merged = tf.summary.merge_all()\n", "```\n", "\n", "3. Run the merged summary op, which will generate a serialized Summary protobuf object with all of your summary data at a given step. Finally, to write this summary data to disk, pass the summary protobuf to a tf.summary.FileWriter.\n", "```python\n", "train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',\n", " sess.graph)\n", "test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')\n", "tf.global_variables_initializer().run()\n", "```\n", "\n", "4. During training . . . \n", "```python\n", "summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))\n", " test_writer.add_summary(summary, i)\n", "```\n", "\n", "5. Launching tensorboard after training. \n", "```\n", "tensorboard --logdir=path/to/log-directory\n", "```" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "Description of below code (docstring):\n", "\n", "*A simple MNIST classifier which displays summaries in TensorBoard. This is an unimpressive MNIST model, but it is a good example of using tf.name\\_scope to make a graph legible in the TensorBoard graph explorer, and of naming summary tags so that they are grouped meaningfully in TensorBoard. It demonstrates the functionality of every TensorBoard dashboard.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "hidden": true }, "outputs": [], "source": [ "import argparse\n", "import sys\n", "import tensorflow as tf\n", "from tensorflow.examples.tutorials.mnist import input_data\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "hidden": true }, "outputs": [], "source": [ "def train():\n", " mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)\n", "\n", " sess = tf.InteractiveSession()\n", " # Create a multilayer model.\n", "\n", " # Input placeholders\n", " with tf.name_scope('input'):\n", " x = tf.placeholder(tf.float32, [None, 784], name='x-input')\n", " y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')\n", "\n", " with tf.name_scope('input_reshape'):\n", " image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])\n", " tf.summary.image('input', image_shaped_input, 10)\n", "\n", " # We can't initialize these variables to 0 - the network will get stuck.\n", " def weight_variable(shape):\n", " \"\"\"Create a weight variable with appropriate initialization.\"\"\"\n", " initial = tf.truncated_normal(shape, stddev=0.1)\n", " return tf.Variable(initial)\n", "\n", " def bias_variable(shape):\n", " \"\"\"Create a bias variable with appropriate initialization.\"\"\"\n", " initial = tf.constant(0.1, shape=shape)\n", " return tf.Variable(initial)\n", "\n", " def variable_summaries(var):\n", " \"\"\"Attach a lot of summaries to a Tensor (for TensorBoard visualization).\"\"\"\n", " with tf.name_scope('summaries'):\n", " mean = tf.reduce_mean(var)\n", " tf.summary.scalar('mean', mean)\n", " with tf.name_scope('stddev'):\n", " stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))\n", " tf.summary.scalar('stddev', stddev)\n", " tf.summary.scalar('max', tf.reduce_max(var))\n", " tf.summary.scalar('min', tf.reduce_min(var))\n", " tf.summary.histogram('histogram', var)\n", "\n", " def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):\n", " \"\"\"Reusable code for making a simple neural net layer.\n", "\n", " It does a matrix multiply, bias add, and then uses relu to nonlinearize.\n", " It also sets up name scoping so that the resultant graph is easy to read,\n", " and adds a number of summary ops.\n", " \"\"\"\n", " # Adding a name scope ensures logical grouping of the layers in the graph.\n", " with tf.name_scope(layer_name):\n", " # This Variable will hold the state of the weights for the layer\n", " with tf.name_scope('weights'):\n", " weights = weight_variable([input_dim, output_dim])\n", " variable_summaries(weights)\n", " with tf.name_scope('biases'):\n", " biases = bias_variable([output_dim])\n", " variable_summaries(biases)\n", " with tf.name_scope('Wx_plus_b'):\n", " preactivate = tf.matmul(input_tensor, weights) + biases\n", " tf.summary.histogram('pre_activations', preactivate)\n", " activations = act(preactivate, name='activation')\n", " tf.summary.histogram('activations', activations)\n", " return activations\n", "\n", " hidden1 = nn_layer(x, 784, 500, 'layer1')\n", "\n", " with tf.name_scope('dropout'):\n", " keep_prob = tf.placeholder(tf.float32)\n", " tf.summary.scalar('dropout_keep_probability', keep_prob)\n", " dropped = tf.nn.dropout(hidden1, keep_prob)\n", "\n", " # Do not apply softmax activation yet, see below.\n", " y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)\n", "\n", " with tf.name_scope('cross_entropy'):\n", " # The raw formulation of cross-entropy,\n", " #\n", " # tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(tf.softmax(y)),\n", " # reduction_indices=[1]))\n", " #\n", " # can be numerically unstable.\n", " #\n", " # So here we use tf.nn.softmax_cross_entropy_with_logits on the\n", " # raw outputs of the nn_layer above, and then average across\n", " # the batch.\n", " diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)\n", " with tf.name_scope('total'):\n", " cross_entropy = tf.reduce_mean(diff)\n", " tf.summary.scalar('cross_entropy', cross_entropy)\n", "\n", " with tf.name_scope('train'):\n", " train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(cross_entropy)\n", "\n", " with tf.name_scope('accuracy'):\n", " with tf.name_scope('correct_prediction'):\n", " correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))\n", " with tf.name_scope('accuracy'):\n", " accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", " tf.summary.scalar('accuracy', accuracy)\n", "\n", " # Merge all the summaries and write them out to /tmp/tensorflow/mnist/logs/mnist_with_summaries (by default)\n", " merged = tf.summary.merge_all()\n", " train_writer = tf.summary.FileWriter(FLAGS.log_dir + '/train', sess.graph)\n", " test_writer = tf.summary.FileWriter(FLAGS.log_dir + '/test')\n", " tf.global_variables_initializer().run()\n", "\n", " # Train the model, and also write summaries.\n", " # Every 10th step, measure test-set accuracy, and write test summaries\n", " # All other steps, run train_step on training data, & add training summaries\n", "\n", " def feed_dict(train):\n", " \"\"\"Make a TensorFlow feed_dict: maps data onto Tensor placeholders.\"\"\"\n", " if train or FLAGS.fake_data:\n", " xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)\n", " k = FLAGS.dropout\n", " else:\n", " xs, ys = mnist.test.images, mnist.test.labels\n", " k = 1.0\n", " return {x: xs, y_: ys, keep_prob: k}\n", "\n", " for i in range(FLAGS.max_steps):\n", " if i % 10 == 0: # Record summaries and test-set accuracy\n", " summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))\n", " test_writer.add_summary(summary, i)\n", " print('Accuracy at step %s: %s' % (i, acc))\n", " else: # Record train set summaries, and train\n", " if i % 100 == 99: # Record execution stats\n", " run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)\n", " run_metadata = tf.RunMetadata()\n", " summary, _ = sess.run([merged, train_step],\n", " feed_dict=feed_dict(True),\n", " options=run_options,\n", " run_metadata=run_metadata)\n", " train_writer.add_run_metadata(run_metadata, 'step%03d' % i)\n", " train_writer.add_summary(summary, i)\n", " print('Adding run metadata for', i)\n", " else: # Record a summary\n", " summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))\n", " train_writer.add_summary(summary, i)\n", " train_writer.close()\n", " test_writer.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "hidden": true }, "outputs": [], "source": [ "def main(_):\n", " if tf.gfile.Exists(FLAGS.log_dir):\n", " tf.gfile.DeleteRecursively(FLAGS.log_dir)\n", " tf.gfile.MakeDirs(FLAGS.log_dir)\n", " train()\n", "\n", "\n", "if __name__ == '__main__':\n", " parser = argparse.ArgumentParser()\n", " parser.add_argument('--fake_data', nargs='?', const=True, type=bool,\n", " default=False,\n", " help='If true, uses fake data for unit testing.')\n", " parser.add_argument('--max_steps', type=int, default=1000,\n", " help='Number of steps to run trainer.')\n", " parser.add_argument('--learning_rate', type=float, default=0.001,\n", " help='Initial learning rate')\n", " parser.add_argument('--dropout', type=float, default=0.9,\n", " help='Keep probability for training dropout.')\n", " parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',\n", " help='Directory for storing input data')\n", " parser.add_argument('--log_dir', type=str, default='/tmp/tensorflow/mnist/logs/mnist_with_summaries',help='Summaries log directory')\n", " FLAGS, unparsed = parser.parse_known_args()\n", " tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "# Trying to save the Graph Again" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "[Tutorial Link](https://www.tensorflow.org/programmers_guide/meta_graph)\n", "\n", "In order for a Python object to be serialized to and from MetaGraphDef, the Python class must implement to_proto() and from_proto() methods, and register them with the system using register_proto_function:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "hidden": true }, "outputs": [], "source": [ "class Variable:\n", "\n", " def to_proto(self, export_scope=None):\n", " \"\"\"Converts a `Variable` to a `VariableDef` protocol buffer.\n", "\n", " Args:\n", " export_scope: Optional `string`. Name scope to remove.\n", "\n", " Returns:\n", " A `VariableDef` protocol buffer, or `None` if the `Variable` is not\n", " in the specified name scope.\n", " \"\"\"\n", " if (export_scope is None or self._variable.name.startswith(export_scope)):\n", " var_def = variable_pb2.VariableDef()\n", " var_def.variable_name = ops.strip_name_scope(self._variable.name, export_scope)\n", " var_def.initializer_name = ops.strip_name_scope(self.initializer.name, export_scope)\n", " var_def.snapshot_name = ops.strip_name_scope(self._snapshot.name, export_scope)\n", " if self._save_slice_info:\n", " var_def.save_slice_info_def.MergeFrom(self._save_slice_info.to_proto(export_scope=export_scope))\n", " return var_def\n", " else:\n", " return None\n", "\n", " @staticmethod\n", " def from_proto(variable_def, import_scope=None):\n", " \"\"\"Returns a `Variable` object created from `variable_def`.\"\"\"\n", " return Variable(variable_def=variable_def, import_scope=import_scope)\n", "\n", "\n", "ops.register_proto_function(ops.GraphKeys.GLOBAL_VARIABLES,\n", " proto_type=variable_pb2.VariableDef,\n", " to_proto=Variable.to_proto,\n", " from_proto=Variable.from_proto)" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "## Exporting a MetaGraph\n", "\n", "The function signature, for reference:\n", "```python\n", "def export_meta_graph(filename=None, collection_list=None, as_text=False):\n", " \"\"\"Writes `MetaGraphDef` to save_path/filename.\n", "\n", " Args:\n", " filename: Optional meta_graph filename including the path.\n", " collection_list: List of string keys to collect.\n", " as_text: If `True`, writes the meta_graph as an ASCII proto.\n", "\n", " Returns:\n", " A `MetaGraphDef` proto.\n", " \"\"\"\n", "```\n", "\n", "You should store all variables you wanna get letter in ```collection```. Or, if you don't specify one, it will save everything (yeah do that). \n", "\n", "How to export the default running graph:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "hidden": true }, "outputs": [], "source": [ "logits = tf.matmul(hidden2, weights) + biases\n", "tf.add_to_collection(\"logits\", logits)\n", "\n", "init_all_op = tf.global_variables_initializer()\n", "\n", "with tf.Session() as sess:\n", " # Initializes all the variables.\n", " sess.run(init_all_op)\n", " # Runs to logit.\n", " sess.run(logits)\n", " chatbot.saver.save(sess, 'my-save-dir/my-model-10000')\n", " # Generates MetaGraphDef.\n", " chatbot.saver.export_meta_graph('my-save-dir/my-model-10000.meta')\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "## Importing the MetaGraph and Resuming Training" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "#### Case: Import and Extend Graph" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "hidden": true }, "outputs": [], "source": [ "with tf.Session() as sess:\n", " new_saver = tf.train.import_meta_graph('my-save-dir/my-model-10000.meta')\n", " new_saver.restore(sess, 'my-save-dir/my-model-10000')\n", " \n", " # Adds loss and train.\n", " labels = tf.constant(0, tf.int32, shape=[100], name=\"labels\")\n", " batch_size = tf.size(labels)\n", " labels = tf.expand_dims(labels, 1)\n", " indices = tf.expand_dims(tf.range(0, batch_size), 1)\n", " concated = tf.concat([indices, labels], 1)\n", " onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 10]), 1.0, 0.0)\n", " \n", " # Getting the logits variable back that we saved.\n", " logits = tf.get_collection(\"logits\")[0]\n", " cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=onehot_labels, logits=logits, name=\"xentropy\")\n", " loss = tf.reduce_mean(cross_entropy, name=\"xentropy_mean\")\n", "\n", " tf.summary.scalar('loss', loss)\n", " # Creates the gradient descent optimizer with the given learning rate.\n", " optimizer = tf.train.GradientDescentOptimizer(0.01)\n", "\n", " # Runs train_op.\n", " train_op = optimizer.minimize(loss)\n", " sess.run(train_op)\n" ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "#### Case: Retrieve Hyperparameters" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "hidden": true }, "outputs": [], "source": [ "filename = \".\".join([tf.latest_checkpoint(train_dir), \"meta\"])\n", "tf.train.import_meta_graph(filename)\n", "hparams = tf.get_collection(\"hparams\")" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "# Sharing Variables\n", "\n", "My version of TensorFlow's tutorial by the same name, but in English. The (sub)section names are identical; I compress the content. " ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "## The Problem\n", "\n", "**Reusing the same model on multiple inputs**: Let's say we make a function ```my_model(inputs)``` that creates a bunch of tf.Variable() objects and returns the final output tensor variable. Each time we call my_model(next_inputs), it is going to create a whole new model with new variables. This bad. \n", "\n", "**How to fix?**: Rather than requiring classes to create a model and manage the variables, TensorFlow provides a *Variable scope* mechanism for sharing named variables while constructing a graph." ] }, { "cell_type": "markdown", "metadata": { "hidden": true }, "source": [ "## Variable Scope\n", "\n", "The mechanism consists of 2 main functions:\n", "1. ```tf.get_variable(name, shape, initializer)``` creates or returns a variable with a given name.\n", "2. ```tf.variable_scope(scope_name)``` manages namespaces **for names passed to tf.get_variable()**. \n", "\n", "\n", "__Difference between name scope and variable scope__: [Here is a link](http://stackoverflow.com/questions/35919020/whats-the-difference-of-name-scope-and-a-variable-scope-in-tensorflow) to the best explanation I could find. The following is the main part:\n", "\n", "\"However, name scope is ignored by tf.get_variable. We can see that in the following example:\n", "\n", "```python\n", "with tf.name_scope(\"my_scope\"):\n", " v1 = tf.get_variable(\"var1\", [1], dtype=tf.float32)\n", " v2 = tf.Variable(1, name=\"var2\", dtype=tf.float32)\n", " a = tf.add(v1, v2)\n", "\n", "print(v1.name) # var1:0\n", "print(v2.name) # my_scope/var2:0\n", "print(a.name) # my_scope/Add:0\n", "```\n", "\n", "The only way to place a variable accessed using tf.get_variable in a scope is to use variable scope, as in the following example:\n", "\n", "```python\n", "with tf.variable_scope(\"my_scope\"):\n", " v1 = tf.get_variable(\"var1\", [1], dtype=tf.float32)\n", " v2 = tf.Variable(1, name=\"var2\", dtype=tf.float32)\n", " a = tf.add(v1, v2)\n", "\n", "print(v1.name) # my_scope/var1:0\n", "print(v2.name) # my_scope/var2:0\n", "print(a.name) # my_scope/Add:0\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# RNN Documentation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## RNNCell" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Interface Specifications\n", "\n", "It's extremely helpful to read the [source code for RNNCell](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/rnn_cell_impl.py). Let's see a condensed list of the important methods and descriptions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "* __\\_\\_call\\_\\___: Run this RNN cell on inputs, starting from the given state.\n", "\n", "```python\n", "def __call__(self, inputs, state, scope=None):\n", " \"\"\"Args:\n", " inputs: `2-D` tensor with shape `[batch_size x input_size]`.\n", " state: if `self.state_size` is an integer, this should be a `2-D Tensor`\n", " with shape `[batch_size x self.state_size]`. Otherwise, if\n", " `self.state_size` is a tuple of integers, this should be a tuple\n", " with shapes `[batch_size x s] for s in self.state_size`.\n", " scope: VariableScope for the created subgraph; defaults to class name.\n", " Returns:\n", " A pair containing:\n", " - Output: A `2-D` tensor with shape `[batch_size x self.output_size]`.\n", " - New state: Either a single `2-D` tensor, or a tuple of tensors matching\n", " the arity and shapes of `state`.\n", " \"\"\"\n", "```\n", "\n", "* __state\\_size and output\\_size__:\n", "\n", "```python\n", " @property\n", " def state_size(self):\n", " \"\"\"size(s) of state(s) used by this cell.\n", " It can be represented by an Integer, a TensorShape or a tuple of Integers\n", " or TensorShapes.\n", " \"\"\"\n", "\n", " @property\n", " def output_size(self):\n", " \"\"\"Integer or TensorShape: size of outputs produced by this cell.\"\"\"\n", "```\n", "\n", "* __zero\\_state__:\n", "```python\n", " def zero_state(self, batch_size, dtype):\n", " \"\"\"Return zero-filled state tensor(s).\n", " Args:\n", " batch_size: int, float, or unit Tensor representing the batch size.\n", " dtype: the data type to use for the state.\n", " Returns:\n", " If `state_size` is an int or TensorShape, then the return value is a\n", " `N-D` tensor of shape `[batch_size x state_size]` filled with zeros.\n", " If `state_size` is a nested list or tuple, then the return value is\n", " a nested list or tuple (of the same structure) of `2-D` tensors with\n", " the shapes `[batch_size x s]` for each s in `state_size`.\n", " \"\"\"\n", " with ops.name_scope(type(self).__name__ + \"ZeroState\", values=[batch_size]):\n", " state_size = self.state_size\n", " return _zero_state_tensors(state_size, batch_size, dtype)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Decoder Class -- Currently undocumented . . . " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here I'm going to give myself an overview of this strange new set of files in tf.contrib.seq2seq (master branch) that is not on the website. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Basic Decoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Miscellaneous" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Review: logits terminology\n", "\n", "1. Logistic function: \n", "$$\\begin{align}\n", "p(X) &= \\frac{1}{1 + e^{-\\beta^TX}} \\\\\n", "&= \\frac{e^{ \\beta^TX}}{1 + e^{ \\beta^TX}}\n", "\\end{align}$$\n", "\n", "2. Odds: \n", "$$\n", "\\frac{p(X)}{1 - p(X)} = e^{\\beta^T X}\n", "$$\n", "\n", "3. log-odds, \"logit\":\n", "$$\n", "\\log\\left(\\frac{p(X)}{1 - p(X)} \\right) = \\beta^T X\n", "$$" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Random Facts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* __tf.Variable vs tf.placeholder__: \"The difference is that with tf.Variable you have to provide an initial value when you declare it. With tf.placeholder you don't have to provide an initial value and you can specify it at run time with the feed_dict argument inside Session.run\" [Source](http://stackoverflow.com/questions/36693740/whats-the-difference-between-tf-placeholder-and-tf-variable)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Embedding (All Related Topics)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Embedding Lookup\n", "\n", "Goal: Figure out how embedding lookup works. Ideally i'd like to show, as a toy example, an integer being mapped to its binary string. For example, with embed size of 5\n", "```python\n", "embed([2, 19]) --> [[0, 0, 0, 1, 0], [1, 0, 0, 1, 1]] \n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "\n", "input_size = (1, 2) # arbitrary\n", "embed_size = 5\n", "vocab_size = 2**embed_size\n", "input_array = np.random.randint(vocab_size, size=input_size)\n", "expected_embedding = ['{0:b}'.format(inp) for inp in input_array.flatten()]\n", "print(\"Input array:\\n\", input_array)\n", "print(\"Expected embedding:\\n\", expected_embedding)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[ 0.30149388 -0.099668 0.14693063 -0.39335564 0.34846574]\n", " [-0.0505532 -0.21680753 -0.3851763 -0.1110653 0.0726169 ]]]\n" ] } ], "source": [ "tf.reset_default_graph()\n", "sess = None\n", "with tf.Session() as sess:\n", " params = tf.get_variable('embed_tensor', \n", " shape=[vocab_size, embed_size], \n", " initializer=tf.contrib.layers.xavier_initializer())\n", " inputs = tf.convert_to_tensor(input_array)\n", " embedding = tf.nn.embedding_lookup(params, inputs)\n", " \n", " \n", " sess.run(tf.global_variables_initializer())\n", " emb = sess.run(embedding)\n", " print(emb)\n", "\n", "sess = None\n", "tf.reset_default_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding Visualizer" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import absolute_import\n", "from __future__ import division\n", "from __future__ import print_function\n", "import argparse\n", "import sys \n", "import os\n", "import numpy as np\n", "from tensorflow.contrib.tensorboard.plugins import projector\n", "import tensorflow as tf\n", "from tensorflow.examples.tutorials.mnist import input_data\n", "FLAGS = None" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def generate_embeddings():\n", " # Import data\n", " mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)\n", " sess = tf.InteractiveSession()\n", " # Input set for Embedded TensorBoard visualization\n", " # Performed with cpu to conserve memory and processing power\n", " with tf.device(\"/cpu:0\"):\n", " embedding = tf.Variable(tf.stack(mnist.test.images[:FLAGS.max_steps], axis=0), \n", " trainable=False, name='embedding')\n", " tf.global_variables_initializer().run()\n", " saver = tf.train.Saver()\n", " writer = tf.summary.FileWriter(FLAGS.log_dir + '/projector', sess.graph)\n", " # Add embedding tensorboard visualization. \n", " config = projector.ProjectorConfig()\n", " embed= config.embeddings.add()\n", " embed.tensor_name = 'embedding:0'\n", " embed.metadata_path = os.path.join(FLAGS.log_dir + '/projector/metadata.tsv')\n", " embed.sprite.image_path = os.path.join(FLAGS.data_dir + '/mnist_10k_sprite.png')\n", " # Specify the width and height of a single thumbnail.\n", " embed.sprite.single_image_dim.extend([28, 28])\n", " projector.visualize_embeddings(writer, config)\n", " saver.save(sess, os.path.join(\n", " FLAGS.log_dir, 'projector/a_model.ckpt'), global_step=FLAGS.max_steps)\n", "\n", "def generate_metadata_file():\n", " # Import data\n", " mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True, fake_data=FLAGS.fake_data)\n", " def save_metadata(file):\n", " with open(file, 'w') as f:\n", " for i in range(FLAGS.max_steps):\n", " c = np.nonzero(mnist.test.labels[::1])[1:][0][i]\n", " f.write('{}\\n'.format(c))\n", " save_metadata(FLAGS.log_dir + '/projector/metadata.tsv')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def main(_):\n", " if tf.gfile.Exists(FLAGS.log_dir + '/projector'):\n", " tf.gfile.DeleteRecursively(FLAGS.log_dir + '/projector')\n", " tf.gfile.MkDir(FLAGS.log_dir + '/projector')\n", " tf.gfile.MakeDirs(FLAGS.log_dir + '/projector') # fix the directory to be created\n", " generate_metadata_file()\n", " generate_embeddings()\n", "\n", "if __name__ == '__main__':\n", " BASE = '/home/brandon/mnist-tensorboard-embeddings/'\n", " parser = argparse.ArgumentParser()\n", " parser.add_argument('--fake_data', nargs='?', const=True, type=bool,\n", " default=False, help='If true, uses fake data for unit testing.')\n", " parser.add_argument('--max_steps', type=int, default=10000, help='Number of steps to run trainer.')\n", " parser.add_argument('--data_dir', type=str, default=BASE+'mnist_data', help='Directory for storing input data')\n", " parser.add_argument('--log_dir', type=str, default=BASE+'logs', help='Summaries log directory')\n", " FLAGS, unparsed = parser.parse_known_args()\n", " tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### YES: TensorBoard Summit Tutorial Code" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting /tmp/mnist_tutorial/data/train-images-idx3-ubyte.gz\n", "Extracting /tmp/mnist_tutorial/data/train-labels-idx1-ubyte.gz\n", "Extracting /tmp/mnist_tutorial/data/t10k-images-idx3-ubyte.gz\n", "Extracting /tmp/mnist_tutorial/data/t10k-labels-idx1-ubyte.gz\n" ] }, { "data": { "text/plain": [ "('/tmp/mnist_tutorial/sprite_1024.png',\n", " )" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "import tensorflow as tf\n", "import urllib\n", "import urllib.request\n", "\n", "LOGDIR = '/tmp/mnist_tutorial/'\n", "GIST_URL = 'https://gist.githubusercontent.com/dandelionmane/4f02ab8f1451e276fea1f165a20336f1/raw/ dfb8ee95b010480d56a73f324aca480b3820c180'\n", "\n", "### MNIST EMBEDDINGS ###\n", "mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + 'data', one_hot=True)\n", "### Get a sprite and labels file for the embedding projector ###\n", "urllib.request.urlretrieve(GIST_URL + 'labels_1024.tsv', LOGDIR + 'labels_1024.tsv')\n", "urllib.request.urlretrieve(GIST_URL + 'sprite_1024.png', LOGDIR + 'sprite_1024.png')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def conv_layer(input, size_in, size_out, name=\"conv\"):\n", " with tf.name_scope(name):\n", " w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name=\"W\")\n", " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", " conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding=\"SAME\")\n", " act = tf.nn.relu(conv + b)\n", " tf.summary.histogram(\"weights\", w)\n", " tf.summary.histogram(\"biases\", b)\n", " tf.summary.histogram(\"activations\", act)\n", " return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\")\n", " \n", "def fc_layer(input, size_in, size_out, name=\"fc\"):\n", " with tf.name_scope(name):\n", " w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name=\"W\")\n", " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", " act = tf.nn.relu(tf.matmul(input, w) + b)\n", " tf.summary.histogram(\"weights\", w)\n", " tf.summary.histogram(\"biases\", b)\n", " tf.summary.histogram(\"activations\", act)\n", " return act " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def mnist_model(learning_rate, use_two_conv, use_two_fc, hparam):\n", " tf.reset_default_graph()\n", " sess = tf.Session()\n", " # Setup placeholders, and reshape the data\n", " x = tf.placeholder(tf.float32, shape=[None, 784], name=\"x\")\n", " x_image = tf.reshape(x, [-1, 28, 28, 1]) \n", " tf.summary.image('input', x_image, 3)\n", " y = tf.placeholder(tf.float32, shape=[None, 10], name=\"labels\")\n", " if use_two_conv:\n", " conv1 = conv_layer(x_image, 1, 32, \"conv1\")\n", " conv_out = conv_layer(conv1, 32, 64, \"conv2\")\n", " else:\n", " conv1 = conv_layer(x_image, 1, 64, \"conv\")\n", " conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\")\n", " flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])\n", " if use_two_fc:\n", " fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, \"fc1\")\n", " embedding_input = fc1 \n", " embedding_size = 1024\n", " logits = fc_layer(fc1, 1024, 10, \"fc2\")\n", " else:\n", " embedding_input = flattened\n", " embedding_size = 7*7*64\n", " logits = fc_layer(flattened, 7*7*64, 10, \"fc\")\n", " with tf.name_scope(\"xent\"):\n", " xent = tf.reduce_mean(\n", " tf.nn.softmax_cross_entropy_with_logits(\n", " logits=logits, labels=y), name=\"xent\")\n", " tf.summary.scalar(\"xent\", xent)\n", " with tf.name_scope(\"train\"):\n", " train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)\n", " with tf.name_scope(\"accuracy\"):\n", " correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1)) \n", " accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", " tf.summary.scalar(\"accuracy\", accuracy)\n", " summ = tf.summary.merge_all()\n", " \n", " # _________ EMBEDDING VARIABLE/TENSOR CREATED _________\n", " embedding = tf.Variable(tf.zeros([1024, embedding_size]), name=\"test_embedding\")\n", " assignment = embedding.assign(embedding_input)\n", " \n", " # _________ SAVER CREATED _________\n", " saver = tf.train.Saver()\n", " \n", " # _________ INIT GLOBAL VARS IS RUN _________\n", " sess.run(tf.global_variables_initializer())\n", " \n", " # _________ WRITER IS CREATED _________\n", " writer = tf.summary.FileWriter(LOGDIR + hparam)\n", " writer.add_graph(sess.graph)\n", " \n", " # ================================================================\n", " # _________ PROJECTORCONFIG CONSTRUCTOR _________\n", " config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()\n", " embedding_config = config.embeddings.add()\n", " embedding_config.tensor_name = embedding.name\n", " embedding_config.sprite.image_path = LOGDIR + 'sprite_1024.png'\n", " embedding_config.metadata_path = LOGDIR + 'labels_1024.tsv'\n", " # Specify the width and height of a single thumbnail.\n", " embedding_config.sprite.single_image_dim.extend([28, 28])\n", " tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)\n", " # ================================================================\n", " \n", " for i in range(2001):\n", " batch = mnist.train.next_batch(100)\n", " if i % 5 == 0:\n", " [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})\n", " writer.add_summary(s, i)\n", " if i % 500 == 0:\n", " sess.run(assignment, feed_dict={x: mnist.test.images[:1024], y: mnist.test.labels[:1024]})\n", " saver.save(sess, os.path.join(LOGDIR, \"model.ckpt\"), i)\n", " sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def make_hparam_string(learning_rate, use_two_fc, use_two_conv):\n", " conv_param = \"conv=2\" if use_two_conv else \"conv=1\"\n", " fc_param = \"fc=2\" if use_two_fc else \"fc=1\"\n", " return \"lr_%.0E,%s,%s\" % (learning_rate, conv_param, fc_param)\n", "\n", "def main():\n", " # You can try adding some more learning rates\n", " for learning_rate in [1E-4]:\n", " # Include \"False\" as a value to try different model architectures\n", " for use_two_fc in [True]:\n", " for use_two_conv in [True]:\n", " # Construct a hyperparameter string for each one (example: \"lr_1E-3,fc=2,conv=2)\n", " hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv)\n", " print('Starting run for %s' % hparam)\n", "\n", " # Actually run with the new settings\n", " mnist_model(learning_rate, use_two_fc, use_two_conv, hparam)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Misc. Ops Testing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tf concat with -1 as an argument? No documentation on it so guess we'll have to try it out." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import tensorflow as tf\n", "import numpy as np\n", "\n", "a = tf.convert_to_tensor(np.arange(20).reshape(5, 4))\n", "concat = tf.concat([[-1, 1], tf.shape(a)], 0)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1 1 5 4]\n" ] } ], "source": [ "# Config (hopefully) fixes GPU not releasing memory issue in jupyter.\n", "config = tf.ConfigProto()\n", "config.gpu_options.allow_growth=True\n", "with tf.Session(config=config) as sess:\n", " print(sess.run(concat))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: notebooks/__init__.py ================================================ ================================================ FILE: notebooks/ubuntu_reformat.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Reformatting Ubuntu Dialogue Corpus for Chatbot Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dataset Description" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**How to run this notebook**: \n", "1. Download the data from the [github repository](https://github.com/rkadlec/ubuntu-ranking-dataset-creator)\n", "2. CD to the downloaded directory and run ```./generate.sh -t -l```. I downloaded 1 mill. train samples with p = 1.0. \n", "3. Change the value of DATA_DIR below to your project path root.\n", "\n", "I chose to copy the first 10k lines of data into a \"sample\" directory so I could quickly play around with the data, and then use the full dataset when done.\n", "\n", "Random facts [from paper](https://arxiv.org/abs/1506.08909):\n", "* 2-way (dyadic) conversation, as opposed to multi-participant.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load the Data" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "import os.path\n", "import pdb\n", "import pandas as pd\n", "from pprint import pprint\n", "\n", "#DATA_DIR = '/home/brandon/terabyte/Datasets/ubuntu_dialogue_corpus/'\n", "DATA_DIR = '/home/brandon/ubuntu_dialogue_corpus/src/' # sample/'\n", "TRAIN_PATH = DATA_DIR + 'train.csv'\n", "VALID_PATH = DATA_DIR + 'valid.csv'\n", "TEST_PATH = DATA_DIR + 'test.csv'\n", "\n", "def get_training():\n", " \"\"\"Returns dataframe data from train.csv \"\"\"\n", " # First, we need to load the data directly into a dataframe from the train.csv file. \n", " df_train = pd.read_csv(TRAIN_PATH)\n", " # Remove all examples with label = 0. (why would i want to train on false examples?)\n", " df_train = df_train.loc[df_train['Label'] == 1.0]\n", " # Don't care about the pandas indices in the df, so remove them.\n", " df_train = df_train.reset_index(drop=True)\n", " df_train = df_train[df_train.columns[:2]]\n", " return df_train\n", "\n", "def get_validation():\n", " \"\"\"Returns data from valid.csv \"\"\"\n", " # First, we need to load the data directly into a dataframe from the train.csv file. \n", " df_valid = pd.read_csv(VALID_PATH)\n", " first_two_cols = df_valid.columns[:2]\n", " df_valid = df_valid[first_two_cols]\n", " df_valid.columns = ['Context', 'Utterance']\n", " return df_valid\n", "\n", "df_train = get_training()\n", "df_valid = get_validation()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "## Functions for Visualization and Reformatting" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Now get all of the data in a single string and make a 'vocabulary' (unique words). \n", "import nltk, re, pprint\n", "from nltk import word_tokenize\n", "import pdb\n", "\n", "def print_single_turn(turn: str):\n", " as_list_of_utters = turn.split('__eou__')[:-1]\n", " for idx_utter, utter in enumerate(as_list_of_utters):\n", " print(\"\\t>>>\", utter)\n", "\n", "def print_conversation(df, index=0):\n", " \"\"\"Display the ith conversation in nice format.\"\"\"\n", " \n", " # Get the row identified by 'index'. \n", " context_entry = df['Context'].values[index]\n", " target = df['Utterance'].values[index]\n", " \n", " # Split returns a blank last entry, so don't store.\n", " turns = context_entry.split('__eot__')[:-1]\n", " print('--------------------- CONTEXT ------------------- ')\n", " for idx_turn, turn in enumerate(turns):\n", " print(\"\\nUser {}: \".format(idx_turn % 2))\n", " print_single_turn(turn)\n", " print('\\n--------------------- RESPONSE ------------------- ')\n", " print(\"\\nUser {}: \".format(len(turns) % 2))\n", " print_single_turn(target)\n", " \n", "def get_user_arrays(df):\n", " \"\"\"Returns two arrays of every other turn. \n", " Specifically:\n", " len(returned array) is number of rows in df. I SURE HOPE NOT!\n", " each entry is a numpy array. \n", " each numpy array contains utterances as entries. \n", " \"\"\"\n", " userOne = []\n", " userTwo = []\n", " contexts = df['Context'].values\n", " targets = df['Utterance'].values\n", " assert(len(contexts) == len(targets))\n", " \n", " for i in range(len(contexts)):\n", " # combined SINGLE CONVERSATION ENTRY of multiple turns each with multiple utterances.\n", " list_of_turns = contexts[i].lower().split('__eot__')[:-1] + [targets[i].lower()]\n", " # make sure even number of entries\n", " if len(list_of_turns) % 2 != 0:\n", " list_of_turns = list_of_turns[:-1]\n", " # strip out the __eou__ occurences (leading space bc otherwise would result in two spaces)\n", " new_list_of_turns = []\n", " for turn in list_of_turns:\n", " utter_list = turn.lower().split(\" __eou__\")\n", " #if len(utter_list) > 3:\n", " # utter_list = utter_list[:3]\n", " new_list_of_turns.append(\"\".join(utter_list))\n", " #list_of_turns = [re.sub(' __eou__', '', t) for t in list_of_turns]\n", " userOneThisConvo = new_list_of_turns[0::2]\n", " userTwoThisConvo = new_list_of_turns[1::2]\n", " userOne += userOneThisConvo \n", " userTwo += userTwoThisConvo\n", " assert(len(userOne) == len(userTwo))\n", " return userOne, userTwo\n", "\n", "def save_to_file(fname, arr):\n", " with open(DATA_DIR+fname,\"w\") as f:\n", " for line in arr:\n", " f.write(line + \"\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training Data" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true }, "source": [ "#### At a Glance" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "hidden": true }, "outputs": [ { "data": { "text/html": [ "
\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", "
ContextUtterance
count10000001000000
unique957096849957
top! ops __eou__ __eot__ ? __eou__ __eot__thank __eou__
freq1411658
\n", "
" ], "text/plain": [ " Context Utterance\n", "count 1000000 1000000\n", "unique 957096 849957\n", "top ! ops __eou__ __eot__ ? __eou__ __eot__ thank __eou__\n", "freq 14 11658" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_train.describe()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "hidden": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ContextUtterance
0i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there __eou__ __eot__ it would be very easy to keep a hash db of message-ids __eou__ sound good __eou__ __eot__ ok __eou__ perhaps we can ship an ad-hoc apt_prefereces __eou__ __eot__ version ? __eou__ __eot__ thank __eou__ __eot__ not yet __eou__ it be cover by your insurance ? __eou__ __eot__ yes __eou__ but it 's ...basically each xfree86 upload will NOT force users to upgrade 100Mb of fonts for nothing __eou__ no something i do in my spare time . __eou__
1I 'm not suggest all - only the ones you modify . __eou__ __eot__ ok , it sound like you 're agree with me , then __eou__ though rather than `` the ones we modify '' , my idea be `` the ones we need to merge '' __eou__ __eot__oh ? oops . __eou__
\n", "
" ], "text/plain": [ " Context \\\n", "0 i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there __eou__ __eot__ it would be very easy to keep a hash db of message-ids __eou__ sound good __eou__ __eot__ ok __eou__ perhaps we can ship an ad-hoc apt_prefereces __eou__ __eot__ version ? __eou__ __eot__ thank __eou__ __eot__ not yet __eou__ it be cover by your insurance ? __eou__ __eot__ yes __eou__ but it 's ... \n", "1 I 'm not suggest all - only the ones you modify . __eou__ __eot__ ok , it sound like you 're agree with me , then __eou__ though rather than `` the ones we modify '' , my idea be `` the ones we need to merge '' __eou__ __eot__ \n", "\n", " Utterance \n", "0 basically each xfree86 upload will NOT force users to upgrade 100Mb of fonts for nothing __eou__ no something i do in my spare time . __eou__ \n", "1 oh ? oops . __eou__ " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.options.display.max_colwidth = 500\n", "df_train.head(2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------- CONTEXT ------------------- \n", "\n", "User 0: \n", "\t>>> interest \n", "\t>>> grub-install work with / be ext3 , fail when it be xfs \n", "\t>>> i think d-i instal the relevant kernel for your machine . i have a p4 and its instal the 386 kernel \n", "\t>>> holy crap a lot of stuff get instal by default : ) \n", "\t>>> YOU ARE INSTALLING VIM ON A BOX OF MINE \n", "\t>>> ; ) \n", "\n", "User 1: \n", "\t>>> more like osx than debian ; ) \n", "\t>>> we have a selection of python modules available for great justice ( and python development ) \n", "\n", "User 0: \n", "\t>>> 2.8 be fix them iirc \n", "\n", "User 1: \n", "\t>>> pong \n", "\t>>> vino will be in \n", "\t>>> enjoy ubuntu ? \n", "\n", "User 0: \n", "\t>>> tell me to come here \n", "\t>>> suggest thursday as a good day to come \n", "\n", "User 1: \n", "\t>>> we freeze versions a while back : ) \n", "\t>>> you come today or thursday ? \n", "\t>>> we 're consider shift it \n", "\t>>> yay \n", "\t>>> enjoy ubuntu ? \n", "\t>>> usplash ! \n", "\n", "User 0: \n", "\t>>> thats the one \n", "\n", "User 1: \n", "\t>>> so i saw your email with the mockup at the airport , but it have n't appear now that i 've pull my mail : | \n", "\n", "User 0: \n", "\t>>> i 've get a better one now too , give me a minute \n", "\t>>> we 've get rh9 instal on most desktops . you want me to look at up2date , right ? \n", "\n", "User 1: \n", "\t>>> aha ! no , the gui thingy \n", "\t>>> it 's more wizardy \n", "\t>>> so the first page be okayish \n", "\t>>> we can do a whole load better on the second page ( icons , translate descriptions ) \n", "\t>>> but that 's the kind of thing i be think about \n", "\t>>> ( a single big treeview would get very scary , very quickly ) \n", "\t>>> sure it 's not a hurricane ? \n", "\n", "User 0: \n", "\t>>> i think experimental be get 2.8 too \n", "\t>>> let him work on # 1217 : ) \n", "\n", "User 1: \n", "\t>>> we call it 'universe ' ; ) \n", "\t>>> haha \n", "\t>>> ooh , totally \n", "\n", "User 0: \n", "\t>>> i want it on in sarge too but nobody else agree \n", "\n", "--------------------- RESPONSE ------------------- \n", "\n", "User 1: \n", "\t>>> i fully endorse this suggestion < /quimby > \n", "\t>>> how do your reinstall go ? \n" ] } ], "source": [ "print_conversation(df_train, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Turn-Based DataFrame" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\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", " \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", " \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", " \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", " \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", " \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", " \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", " \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", "
UserOneUserTwo
0i think we could import the old comment via rs...it would be very easy to keep a hash db of me...
1ok perhaps we can ship an ad-hoc apt_preferecesversion ?
2thanknot yet it be cover by your insurance ?
3yes but it 's really not the right time : / w...you will be move into your house soon ? post ...
4how urgent be # 896 ?not particularly urgent , but a policy violat...
5i agree that we should kill the -novtswitchok
6would you consider a package split a feature ?context ?
7split xfonts* out of xfree86* . one upload fo...split the source package you mean ?
8yes . same binary package .i would prefer to avoid it at this stage . th...
9i 'm not suggest all - only the ones you modif...ok , it sound like you 're agree with me , th...
10afternoon all not entirely relate to warty , b...here
11you might want to know that thinice in warty ...and apparently gnome be suddently almost perf...
12can i file the panel not link to eds ? : )be you use alt ? or the windows key ? wait fo...
13i just restart x and now nautilus wo n't show...do you think we have any interest to have hal...
14be it a know bug that g-s-t do n't know what ...somebody should really kick that guy *hard* i...
15arse . xt-dev ? i add libx11-dev so just libx...we have plan to speak about menu organisation...
16be away , you say ? nopethe warty repository ok , fine . thanks nice ...
17you 'll be glad to know i 've fix my miss arr...i 've upload the gnome-vfs without hal suppor...
18should g2 in ubuntu do the magic dont-focus-w...we 'll have a bof about this so you 're come t...
19interest grub-install work with / be ext3 , fa...more like osx than debian ; ) we have a selec...
202.8 be fix them iircpong vino will be in enjoy ubuntu ?
21tell me to come here suggest thursday as a go...we freeze versions a while back : ) you come ...
22thats the oneso i saw your email with the mockup at the ai...
23i 've get a better one now too , give me a mi...aha ! no , the gui thingy it 's more wizardy ...
24i think experimental be get 2.8 too let him w...we call it 'universe ' ; ) haha ooh , totally
25i want it on in sarge too but nobody else agreei fully endorse this suggestion < /quimby > ho...
26and because python give mark a woodyi 'm not sure if we 're mean to talk about th...
27and i think we be a `` pant off '' kind of co...mono 1.0 ? dude , that 's go to be a barrel o...
28there be an accompany irc conversation to tha...but debian/ be also part of diff.gz ... you c...
29notwarty , hth , hand , kthxbye < g > everyon...which ? the best feature of the new imac be t...
.........
170this mornings run fine .yep , it be . could you add hurd-i386 amd64 t...
171do - i assume that you 'll poke elmo to fresh...do n't know i have to i 'll remind him next ti...
172know bug . check bugs.debian.org/src : xfree86...i 'm wait approval to join the sounder list ....
173setuid /bin/mount be go to be disable in favou...under all circumstances , i take it ?
174i would say sodo
175i will accept responsibility for the addition...indeed . it 's a recommends : thing , fix act...
176we need to make sure that cdroms ( and other r...presumably i should make the same quietinit- ...
177yesdo ( be the actual option change in sysvinit ...
178sysvinit usplash will also check for it and n...the patch as post be wrong , but i 've test w...
179if it work , can you patch it and upload it ?sure , let 's make it tomorrow though : - )
180nphm , that eject change be go to need some tes...
181pmount just wrap mount , so long as you be a....that 's not my point at all
182i 'll double check that thats the whole reaso...maybe just fall back to something like the ol...
183thats a little difficult with the way it be c...do n't have to be exact by any mean be it imp...
184what do the fb corruption look like ?lot of dot and squggles , text be partly read...
185which package ?^^^
186they build 'em sturdy down there , apparently...over here they install fine , but then apt wa...
187try apt-get clean ?that fix it , thank
188that issue should n't affect upgrade from woo...pitti : i 'm in group plugdev , it 's still n...
189one difference be that some pcs have a line o...removable devices have be bad for me , but it...
190i think we nail the issue ( executable permis...it 's copy into their cache already , be n't ...
191hmm , good point nono , ( b ) give the cd to ...if we be use grub only , should we turn off do...
192poketry to remember if i ask if you be ppc or i38...
193yeah , series 1 h8 that debconf should be con...what kind of puppies ? awesome
194you ping the other day ? ( i only just get to ...i ping a few minutes ago do you make a usplas...
195right click on the desktop be not work for menautilus manage the desktop ? the icons be di...
196anybody else see fb corruption during boot ? g...which video card ?
197no , it 's my home desktopi remember fb break on that laptop and iirc it...
198that typically mean that apt be see multiple p...there 's something definitely screwy with the...
199stock warty apt-get install `debootstrap -- p...what kernel be you run ? # 268154 , yeah , re...
\n", "

200 rows × 2 columns

\n", "
" ], "text/plain": [ " UserOne \\\n", "0 i think we could import the old comment via rs... \n", "1 ok perhaps we can ship an ad-hoc apt_prefereces \n", "2 thank \n", "3 yes but it 's really not the right time : / w... \n", "4 how urgent be # 896 ? \n", "5 i agree that we should kill the -novtswitch \n", "6 would you consider a package split a feature ? \n", "7 split xfonts* out of xfree86* . one upload fo... \n", "8 yes . same binary package . \n", "9 i 'm not suggest all - only the ones you modif... \n", "10 afternoon all not entirely relate to warty , b... \n", "11 you might want to know that thinice in warty ... \n", "12 can i file the panel not link to eds ? : ) \n", "13 i just restart x and now nautilus wo n't show... \n", "14 be it a know bug that g-s-t do n't know what ... \n", "15 arse . xt-dev ? i add libx11-dev so just libx... \n", "16 be away , you say ? nope \n", "17 you 'll be glad to know i 've fix my miss arr... \n", "18 should g2 in ubuntu do the magic dont-focus-w... \n", "19 interest grub-install work with / be ext3 , fa... \n", "20 2.8 be fix them iirc \n", "21 tell me to come here suggest thursday as a go... \n", "22 thats the one \n", "23 i 've get a better one now too , give me a mi... \n", "24 i think experimental be get 2.8 too let him w... \n", "25 i want it on in sarge too but nobody else agree \n", "26 and because python give mark a woody \n", "27 and i think we be a `` pant off '' kind of co... \n", "28 there be an accompany irc conversation to tha... \n", "29 notwarty , hth , hand , kthxbye < g > everyon... \n", ".. ... \n", "170 this mornings run fine . \n", "171 do - i assume that you 'll poke elmo to fresh... \n", "172 know bug . check bugs.debian.org/src : xfree86... \n", "173 setuid /bin/mount be go to be disable in favou... \n", "174 i would say so \n", "175 i will accept responsibility for the addition... \n", "176 we need to make sure that cdroms ( and other r... \n", "177 yes \n", "178 sysvinit usplash will also check for it and n... \n", "179 if it work , can you patch it and upload it ? \n", "180 np \n", "181 pmount just wrap mount , so long as you be a.... \n", "182 i 'll double check that thats the whole reaso... \n", "183 thats a little difficult with the way it be c... \n", "184 what do the fb corruption look like ? \n", "185 which package ? \n", "186 they build 'em sturdy down there , apparently... \n", "187 try apt-get clean ? \n", "188 that issue should n't affect upgrade from woo... \n", "189 one difference be that some pcs have a line o... \n", "190 i think we nail the issue ( executable permis... \n", "191 hmm , good point nono , ( b ) give the cd to ... \n", "192 poke \n", "193 yeah , series 1 h8 that debconf should be con... \n", "194 you ping the other day ? ( i only just get to ... \n", "195 right click on the desktop be not work for me \n", "196 anybody else see fb corruption during boot ? g... \n", "197 no , it 's my home desktop \n", "198 that typically mean that apt be see multiple p... \n", "199 stock warty apt-get install `debootstrap -- p... \n", "\n", " UserTwo \n", "0 it would be very easy to keep a hash db of me... \n", "1 version ? \n", "2 not yet it be cover by your insurance ? \n", "3 you will be move into your house soon ? post ... \n", "4 not particularly urgent , but a policy violat... \n", "5 ok \n", "6 context ? \n", "7 split the source package you mean ? \n", "8 i would prefer to avoid it at this stage . th... \n", "9 ok , it sound like you 're agree with me , th... \n", "10 here \n", "11 and apparently gnome be suddently almost perf... \n", "12 be you use alt ? or the windows key ? wait fo... \n", "13 do you think we have any interest to have hal... \n", "14 somebody should really kick that guy *hard* i... \n", "15 we have plan to speak about menu organisation... \n", "16 the warty repository ok , fine . thanks nice ... \n", "17 i 've upload the gnome-vfs without hal suppor... \n", "18 we 'll have a bof about this so you 're come t... \n", "19 more like osx than debian ; ) we have a selec... \n", "20 pong vino will be in enjoy ubuntu ? \n", "21 we freeze versions a while back : ) you come ... \n", "22 so i saw your email with the mockup at the ai... \n", "23 aha ! no , the gui thingy it 's more wizardy ... \n", "24 we call it 'universe ' ; ) haha ooh , totally \n", "25 i fully endorse this suggestion < /quimby > ho... \n", "26 i 'm not sure if we 're mean to talk about th... \n", "27 mono 1.0 ? dude , that 's go to be a barrel o... \n", "28 but debian/ be also part of diff.gz ... you c... \n", "29 which ? the best feature of the new imac be t... \n", ".. ... \n", "170 yep , it be . could you add hurd-i386 amd64 t... \n", "171 do n't know i have to i 'll remind him next ti... \n", "172 i 'm wait approval to join the sounder list .... \n", "173 under all circumstances , i take it ? \n", "174 do \n", "175 indeed . it 's a recommends : thing , fix act... \n", "176 presumably i should make the same quietinit- ... \n", "177 do ( be the actual option change in sysvinit ... \n", "178 the patch as post be wrong , but i 've test w... \n", "179 sure , let 's make it tomorrow though : - ) \n", "180 hm , that eject change be go to need some tes... \n", "181 that 's not my point at all \n", "182 maybe just fall back to something like the ol... \n", "183 do n't have to be exact by any mean be it imp... \n", "184 lot of dot and squggles , text be partly read... \n", "185 ^^^ \n", "186 over here they install fine , but then apt wa... \n", "187 that fix it , thank \n", "188 pitti : i 'm in group plugdev , it 's still n... \n", "189 removable devices have be bad for me , but it... \n", "190 it 's copy into their cache already , be n't ... \n", "191 if we be use grub only , should we turn off do... \n", "192 try to remember if i ask if you be ppc or i38... \n", "193 what kind of puppies ? awesome \n", "194 i ping a few minutes ago do you make a usplas... \n", "195 nautilus manage the desktop ? the icons be di... \n", "196 which video card ? \n", "197 i remember fb break on that laptop and iirc it... \n", "198 there 's something definitely screwy with the... \n", "199 what kernel be you run ? # 268154 , yeah , re... \n", "\n", "[200 rows x 2 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#df_merged = pd.DataFrame(df_train['Context'].map(str) + df_train['Utterance'])\n", "userOne, userTwo = get_user_arrays(df_train)\n", "df_turns = pd.DataFrame({'UserOne': userOne, 'UserTwo': userTwo})\n", "df_turns.head(200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Sentence-Based DataFrame" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'i think we could import the old comment via rsync , but from there we need to go via email . I think it be easier than cache the status on each bug and than import bits here and there '" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "userOne[0]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mdecoder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdec\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mencoder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdecoder\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m \u001b[0mencoder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdecoder\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_sentences\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserOne\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muserTwo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 22\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'done'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mget_sentences\u001b[0;34m(userOne, userTwo)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32massert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserOne\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserTwo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserOne\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnltk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msent_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserOne\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mone\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'.'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mtwo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnltk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msent_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muserTwo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/__init__.py\u001b[0m in \u001b[0;36msent_tokenize\u001b[0;34m(text, language)\u001b[0m\n\u001b[1;32m 92\u001b[0m \"\"\"\n\u001b[1;32m 93\u001b[0m \u001b[0mtokenizer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'tokenizers/punkt/{0}.pickle'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlanguage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;31m# Standard word tokenizer.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36mtokenize\u001b[0;34m(self, text, realign_boundaries)\u001b[0m\n\u001b[1;32m 1235\u001b[0m \u001b[0mGiven\u001b[0m \u001b[0ma\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturns\u001b[0m \u001b[0ma\u001b[0m \u001b[0mlist\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0msentences\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mthat\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1236\u001b[0m \"\"\"\n\u001b[0;32m-> 1237\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msentences_from_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1238\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1239\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdebug_decisions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36msentences_from_text\u001b[0;34m(self, text, realign_boundaries)\u001b[0m\n\u001b[1;32m 1283\u001b[0m \u001b[0mfollows\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mperiod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1284\u001b[0m \"\"\"\n\u001b[0;32m-> 1285\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mspan_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1286\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1287\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_slices_from_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36mspan_tokenize\u001b[0;34m(self, text, realign_boundaries)\u001b[0m\n\u001b[1;32m 1274\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1275\u001b[0m \u001b[0mslices\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_realign_boundaries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslices\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1276\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mslices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1278\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msentences_from_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1274\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1275\u001b[0m \u001b[0mslices\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_realign_boundaries\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslices\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1276\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0msl\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mslices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1278\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0msentences_from_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtext\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrealign_boundaries\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36m_realign_boundaries\u001b[0;34m(self, text, slices)\u001b[0m\n\u001b[1;32m 1314\u001b[0m \"\"\"\n\u001b[1;32m 1315\u001b[0m \u001b[0mrealign\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1316\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0msl1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msl2\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_pair_iter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mslices\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1317\u001b[0m \u001b[0msl1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msl1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstart\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mrealign\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msl1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstop\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1318\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msl2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36m_pair_iter\u001b[0;34m(it)\u001b[0m\n\u001b[1;32m 309\u001b[0m \u001b[0mit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 310\u001b[0m \u001b[0mprev\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 311\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mel\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mit\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 312\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mprev\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 313\u001b[0m \u001b[0mprev\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/nltk/tokenize/punkt.py\u001b[0m in \u001b[0;36m_slices_from_text\u001b[0;34m(self, text)\u001b[0m\n\u001b[1;32m 1290\u001b[0m \u001b[0mcontext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'after_tok'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1291\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtext_contains_sentbreak\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1292\u001b[0;31m \u001b[0;32myield\u001b[0m \u001b[0mslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlast_break\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1293\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmatch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'next_tok'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1294\u001b[0m \u001b[0;31m# next sentence starts after whitespace\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "\n", "def get_sentences(userOne, userTwo):\n", " encoder = []\n", " decoder = []\n", " assert(len(userOne) == len(userTwo))\n", " for i in range(len(userOne)):\n", " one = nltk.sent_tokenize(userOne[i])\n", " one = [s for s in one if s != '.']\n", " two = nltk.sent_tokenize(userTwo[i])\n", " two = [s for s in two if s != '.']\n", " combine = one + two\n", " assert(len(combine) == len(one) + len(two))\n", " if len(combine) % 2 != 0:\n", " combine = combine[:-1]\n", " enc = combine[0::2]\n", " dec = combine[1::2]\n", " assert(len(enc) == len(dec))\n", " encoder.append(enc)\n", " decoder.append(dec)\n", " return encoder, decoder\n", "encoder, decoder = get_sentences(userOne, userTwo)\n", "print('done')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "encoder = [nltk.word_tokenize(s[0]) for s in encoder]\n", "decoder = [nltk.word_tokenize(s[0]) for s in decoder]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "max_enc_len = max([len(s) for s in encoder])\n", "max_dec_len = max([len(s) for s in decoder])\n", "print(max_enc_len)\n", "print(max_dec_len)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Analyzing Sentence Lengths" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "encoder_lengths = [len(s) for s in encoder]\n", "decoder_lengths = [len(s) for s in decoder]\n", "df_lengths = pd.DataFrame({'EncoderSentLength': encoder_lengths, 'DecoderSentLengths': decoder_lengths})\n", "df_lengths.describe()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')\n", "plt.rcParams['figure.figsize'] = 9, 5\n", "fig, axes = plt.subplots(nrows=1, ncols=2)\n", "plt.subplot(1, 2, 1)\n", "plt.hist(encoder_lengths)\n", "plt.subplot(1, 2, 2)\n", "plt.hist(decoder_lengths, color='b')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "save_to_file(\"train_from.txt\", userOne)\n", "save_to_file(\"train_to.txt\", userTwo)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Validation Data" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "df_valid has 19560 rows.\n" ] }, { "data": { "text/html": [ "
\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", "
ContextUtterance
0Any ideas on how lts will be release ? __eou__...We be talk 12.04 not 10.04 __eou__
1how much hdd use ubuntu default install ? __eo...thats why i ask how much be default install ? ...
2in my country its nearly the 27th __eou__ when...thanx __eou__
3it 's not out __eou__ __eot__ they probabaly b...wait for many things to be setup __eou__ final...
4be the ext4 drivers stable ? __eou__ __eot__ I...you sound like it 's update to skynet . ; ) __...
\n", "
" ], "text/plain": [ " Context \\\n", "0 Any ideas on how lts will be release ? __eou__... \n", "1 how much hdd use ubuntu default install ? __eo... \n", "2 in my country its nearly the 27th __eou__ when... \n", "3 it 's not out __eou__ __eot__ they probabaly b... \n", "4 be the ext4 drivers stable ? __eou__ __eot__ I... \n", "\n", " Utterance \n", "0 We be talk 12.04 not 10.04 __eou__ \n", "1 thats why i ask how much be default install ? ... \n", "2 thanx __eou__ \n", "3 wait for many things to be setup __eou__ final... \n", "4 you sound like it 's update to skynet . ; ) __... " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"df_valid has\", len(df_valid), \"rows.\")\n", "df_valid.head()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "userOne, userTwo = get_user_arrays(df_valid)\n", "save_to_file(\"valid_from.txt\", userOne)\n", "save_to_file(\"valid_to.txt\", userTwo)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "done\n" ] } ], "source": [ "print('done')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualization" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "855 at 1330067\n", "Sentence:\n", " thanks : ) i know , it use .deb , but read my word , they say that nothing like .deb or source be there . that be know to me , so iam think of use alien to build the deb i have see the entire internet , and even the sdl developers tell me , that they do n't exist . lol , what be you say ? there be no .deb yet for wesnoth 1.8 , also , i know i need to compile it , but the source be not available for sdl11-config , i instal them all , no result yes , the older ones be available . sorry , but make the previous version be different . the previous versions of wesnoth do not need all sdl libraries , lol , thank , but that be for wesnoth 1.6.1 , at least 2 years older , but i say 1.8 , anyway . thanks for the help . i be search for a source , and let me compile it . lol , still a formidable game can be make , against age of empires series , : d penumbra if commercial , but o a.d be not , : d a demo be not open-source , and also , the what i like be a rts , like the fan of age of mythology and aok , also , from the screenthots of o a.d , it appear as if it be a jewel to ubuntu . the debate continue , if you consider java too , and i do have them . but , the thing be that , commercial < free < open-source , so flash be better than commercial softwares like penumbra what we want to advocate ubuntu for , be freedom and open-source . so , commercial game be not welcome here . the best way be to use free and open-source softwares . is n't our discussion go a bite offtopic ? also , non-free softwares be mean for profit , which clash with the nature of ubuntu . a mutual profit be always welcome , when it benefit the ideology of the user and the developer . and i have research nicely enough , but you seem to challenge the nature of linux , and also , drag the discussion offtopic . in addition , things like non-free softwares cause a flow of money from the pocket of the users to the developers . but open-source be what allow users to be developers . there be , base on user experience . and ubuntu be the best . fame come from others individual judgements , and people accept ubuntu , since it be the best . also , ubuntu be the most user-friendly linux for pcs . anything *buntu , whether lubuntu , kubuntu or xubuntu be the best . the talk be relate to open-source , but windows be not . also , many people use windows , but they be switch to ubuntu now . and it be ubuntu who challenge microsoft in a bold way . computing world be not only for game . for game , get a xbox or playstation . computer be mainly for learn and development . it be for better use . and in all field , ubuntu be the best . for everyday use , puppy be a joke . ubuntu and puppy 's goals differ . ubuntu jeos can do the same . lubuntu be also nicer than puppy in many ways . in the modern world , people who be in computing , should upgrade their systems . and for low-end systems , any linux with low de can do . why only puppy ? dsl can do the same , and lubuntu too . the `` best '' be count as a basis on `` how many field a thing be better than others '' , and ubuntu be much better in most case . so , it be the best . check out the ubuntu synaptic , and you can get anything like that , low-end system maintainance and so . so , lxde can be use in ubuntu , and so can be icewm , so ubuntu can perform much better than puppy . also , where be the package manager for puppy ? nowhere , ubuntu have strongest support , because check the support of both . nice to know it , but then , community of ubuntu need centralization , not fragmentation . i be among ubuntu sideline developers too ( the default version ) i know , but be it really nicer than synaptic ? no , discussing about puppy be not welcome here . it be he ubuntu support channel . as per my question 's answer , you seem to start debate on the main support channel . please do n't do so . lol , : d it be not so bad , and if you hate google , try www.bing.com , : ) by microsoft , : ) lol , nice \n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "userOne, userTwo = get_user_arrays(df_train)\n", "# Regular expressions used to tokenize.\n", "_WORD_SPLIT = re.compile(b\"([.,!?\\\"':;)(])\")\n", "_DIGIT_RE = re.compile(br\"\\d\")\n", "lengths = np.array([len(t.strip().split()) for t in userOne])\n", "\n", "max_ind = lengths.argmax()\n", "print(max(lengths), \"at\", max_ind)\n", "print(\"Sentence:\\n\", userOne[max_ind])" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(array([ 1.85629000e+06, 2.48062000e+05, 4.06420000e+04,\n", " 8.01600000e+03, 2.06200000e+03, 6.29000000e+02,\n", " 1.99000000e+02, 8.00000000e+01, 3.90000000e+01,\n", " 1.50000000e+01]),\n", " array([ 0. , 39.3, 78.6, 117.9, 157.2, 196.5, 235.8, 275.1,\n", " 314.4, 353.7, 393. ]),\n", " )" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nHAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.hist(sorted(lengths)[:-20])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2134602 out of 2156054 (0.9900503419673162\\%)\n" ] } ], "source": [ "n_under_20 = sum([1 if l < 100 else 0 for l in lengths])\n", "print(n_under_20, \"out of\", len(lengths), \"({}\\%)\".format(float(n_under_20)/len(lengths)))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_lengths = pd.DataFrame(lengths)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\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", " \n", " \n", "
0
count2.156054e+06
mean2.171190e+01
std2.074356e+01
min0.000000e+00
25%8.000000e+00
50%1.600000e+01
75%2.800000e+01
max8.550000e+02
\n", "
" ], "text/plain": [ " 0\n", "count 2.156054e+06\n", "mean 2.171190e+01\n", "std 2.074356e+01\n", "min 0.000000e+00\n", "25% 8.000000e+00\n", "50% 1.600000e+01\n", "75% 2.800000e+01\n", "max 8.550000e+02" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_lengths.describe()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## Relationship between Accuracy, Loss, and Others\n", "\n", "$$\n", "\\text{Loss} = - \\frac{1}{N} \\sum_{i = 1}^{N} \\ln\\left(p_{target_i}\\right)\n", "$$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loss for uniformly random guessing is 10.5966347331\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.5/dist-packages/ipykernel/__main__.py:16: RuntimeWarning: divide by zero encountered in true_divide\n" ] }, { "data": { "text/plain": [ "[]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nCncRkRj6//EIu1w3eV/GAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "%matplotlib inline\n", "\n", "# Number of gradient descent steps, each over a batch_size amount of data.\n", "vocab_size = 40000\n", "\n", "# Uniform chance of guessing any word. \n", "loss_random_guess = np.log(float(vocab_size))\n", "print(\"Loss for uniformly random guessing is\", loss_random_guess)\n", "\n", "sent_length = [5, 10, 25]\n", "# Outputs correct target x percent of the time. \n", "pred_accuracy = np.arange(100)\n", "\n", "plt.plot(pred_accuracy, [1./p for p in pred_accuracy])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "99\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "%matplotlib inline\n", "plt.style.use('ggplot')\n", "plt.rcParams['figure.figsize'] = 10, 8\n", "def _sample(logits, t):\n", " res = logits / t\n", " res = np.exp(res) / np.sum(np.exp(res))\n", " return res\n", "\n", "N = 100\n", "x = np.arange(N)\n", "before = np.array([1.0+i**2 for i in range(N)])\n", "before /= before.sum()\n", "\n", "plt.plot(x, before, 'b--', label='before')\n", "\n", "after = _sample(before, 0.1)\n", "plt.plot(x, after, 'g--', label='temp=0.01')\n", "\n", "after = _sample(before, 0.2)\n", "print(after.argmax())\n", "plt.plot(x, after, 'r--', label='temp=0.001')\n", "\n", "\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " plot(*args, **kwargs)\n", "\n", "Plot lines and/or markers to the\n", ":class:`~matplotlib.axes.Axes`. *args* is a variable length\n", "argument, allowing for multiple *x*, *y* pairs with an\n", "optional format string. For example, each of the following is\n", "legal::\n", "\n", " plot(x, y) # plot x and y using default line style and color\n", " plot(x, y, 'bo') # plot x and y using blue circle markers\n", " plot(y) # plot y using x as index array 0..N-1\n", " plot(y, 'r+') # ditto, but with red plusses\n", "\n", "If *x* and/or *y* is 2-dimensional, then the corresponding columns\n", "will be plotted.\n", "\n", "If used with labeled data, make sure that the color spec is not\n", "included as an element in data, as otherwise the last case\n", "``plot(\"v\",\"r\", data={\"v\":..., \"r\":...)``\n", "can be interpreted as the first case which would do ``plot(v, r)``\n", "using the default line style and color.\n", "\n", "If not used with labeled data (i.e., without a data argument),\n", "an arbitrary number of *x*, *y*, *fmt* groups can be specified, as in::\n", "\n", " a.plot(x1, y1, 'g^', x2, y2, 'g-')\n", "\n", "Return value is a list of lines that were added.\n", "\n", "By default, each line is assigned a different style specified by a\n", "'style cycle'. To change this behavior, you can edit the\n", "axes.prop_cycle rcParam.\n", "\n", "The following format string characters are accepted to control\n", "the line style or marker:\n", "\n", "================ ===============================\n", "character description\n", "================ ===============================\n", "``'-'`` solid line style\n", "``'--'`` dashed line style\n", "``'-.'`` dash-dot line style\n", "``':'`` dotted line style\n", "``'.'`` point marker\n", "``','`` pixel marker\n", "``'o'`` circle marker\n", "``'v'`` triangle_down marker\n", "``'^'`` triangle_up marker\n", "``'<'`` triangle_left marker\n", "``'>'`` triangle_right marker\n", "``'1'`` tri_down marker\n", "``'2'`` tri_up marker\n", "``'3'`` tri_left marker\n", "``'4'`` tri_right marker\n", "``'s'`` square marker\n", "``'p'`` pentagon marker\n", "``'*'`` star marker\n", "``'h'`` hexagon1 marker\n", "``'H'`` hexagon2 marker\n", "``'+'`` plus marker\n", "``'x'`` x marker\n", "``'D'`` diamond marker\n", "``'d'`` thin_diamond marker\n", "``'|'`` vline marker\n", "``'_'`` hline marker\n", "================ ===============================\n", "\n", "\n", "The following color abbreviations are supported:\n", "\n", "========== ========\n", "character color\n", "========== ========\n", "'b' blue\n", "'g' green\n", "'r' red\n", "'c' cyan\n", "'m' magenta\n", "'y' yellow\n", "'k' black\n", "'w' white\n", "========== ========\n", "\n", "In addition, you can specify colors in many weird and\n", "wonderful ways, including full names (``'green'``), hex\n", "strings (``'#008000'``), RGB or RGBA tuples (``(0,1,0,1)``) or\n", "grayscale intensities as a string (``'0.8'``). Of these, the\n", "string specifications can be used in place of a ``fmt`` group,\n", "but the tuple forms can be used only as ``kwargs``.\n", "\n", "Line styles and colors are combined in a single format string, as in\n", "``'bo'`` for blue circles.\n", "\n", "The *kwargs* can be used to set line properties (any property that has\n", "a ``set_*`` method). You can use this to set a line label (for auto\n", "legends), linewidth, anitialising, marker face color, etc. Here is an\n", "example::\n", "\n", " plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2)\n", " plot([1,2,3], [1,4,9], 'rs', label='line 2')\n", " axis([0, 4, 0, 10])\n", " legend()\n", "\n", "If you make multiple lines with one plot command, the kwargs\n", "apply to all those lines, e.g.::\n", "\n", " plot(x1, y1, x2, y2, antialiased=False)\n", "\n", "Neither line will be antialiased.\n", "\n", "You do not need to use format strings, which are just\n", "abbreviations. All of the line properties can be controlled\n", "by keyword arguments. For example, you can set the color,\n", "marker, linestyle, and markercolor with::\n", "\n", " plot(x, y, color='green', linestyle='dashed', marker='o',\n", " markerfacecolor='blue', markersize=12).\n", "\n", "See :class:`~matplotlib.lines.Line2D` for details.\n", "\n", "The kwargs are :class:`~matplotlib.lines.Line2D` properties:\n", "\n", " agg_filter: unknown\n", " alpha: float (0.0 transparent through 1.0 opaque) \n", " animated: [True | False] \n", " antialiased or aa: [True | False] \n", " axes: an :class:`~matplotlib.axes.Axes` instance \n", " clip_box: a :class:`matplotlib.transforms.Bbox` instance \n", " clip_on: [True | False] \n", " clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] \n", " color or c: any matplotlib color \n", " contains: a callable function \n", " dash_capstyle: ['butt' | 'round' | 'projecting'] \n", " dash_joinstyle: ['miter' | 'round' | 'bevel'] \n", " dashes: sequence of on/off ink in points \n", " drawstyle: ['default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post'] \n", " figure: a :class:`matplotlib.figure.Figure` instance \n", " fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top' | 'none'] \n", " gid: an id string \n", " label: string or anything printable with '%s' conversion. \n", " linestyle or ls: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) | ``'-'`` | ``'--'`` | ``'-.'`` | ``':'`` | ``'None'`` | ``' '`` | ``''``]\n", " linewidth or lw: float value in points \n", " marker: :mod:`A valid marker style `\n", " markeredgecolor or mec: any matplotlib color \n", " markeredgewidth or mew: float value in points \n", " markerfacecolor or mfc: any matplotlib color \n", " markerfacecoloralt or mfcalt: any matplotlib color \n", " markersize or ms: float \n", " markevery: [None | int | length-2 tuple of int | slice | list/array of int | float | length-2 tuple of float]\n", " path_effects: unknown\n", " picker: float distance in points or callable pick function ``fn(artist, event)`` \n", " pickradius: float distance in points \n", " rasterized: [True | False | None] \n", " sketch_params: unknown\n", " snap: unknown\n", " solid_capstyle: ['butt' | 'round' | 'projecting'] \n", " solid_joinstyle: ['miter' | 'round' | 'bevel'] \n", " transform: a :class:`matplotlib.transforms.Transform` instance \n", " url: a url string \n", " visible: [True | False] \n", " xdata: 1D array \n", " ydata: 1D array \n", " zorder: any number \n", "\n", "kwargs *scalex* and *scaley*, if defined, are passed on to\n", ":meth:`~matplotlib.axes.Axes.autoscale_view` to determine\n", "whether the *x* and *y* axes are autoscaled; the default is\n", "*True*.\n", "\n", ".. note::\n", " In addition to the above described arguments, this function can take a\n", " **data** keyword argument. If such a **data** argument is given, the\n", " following arguments are replaced by **data[]**:\n", "\n", " * All arguments with the following names: 'x', 'y'.\n" ] } ], "source": [ "np.info(plt.plot)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: requirements.txt ================================================ Pympler==0.5 setuptools==35.0.1 PyYAML==3.12 nltk>=3.2.2 numpy>=1.11.0 pandas>=0.19.2 tensorflow==1.2.0rc2 ================================================ FILE: setup.py ================================================ from setuptools import setup setup(name='DeepChatModels', description='Conversation Models in TensorFlow', url='http://github.com/mckinziebrandon/DeepChatModels', author_email='mckinziebrandon@berkeley.edu', license='MIT', install_requires=[ 'numpy', 'matplotlib', 'pandas', 'pyyaml', ], extras_require={'tensorflow': ['tensorflow'], 'tensorflow gpu': ['tensorflow-gpu']}, zip_safe=False) ================================================ FILE: tests/__init__.py ================================================ ================================================ FILE: tests/test_config.py ================================================ """Tests for various operations done on config (yaml) dictionaries in project.""" import os import pydoc import yaml import logging import unittest import tensorflow as tf from utils import io_utils import chatbot import data dir = os.path.dirname(os.path.realpath(__file__)) from tests.utils import * class TestConfig(unittest.TestCase): """Test behavior of tf.contrib.rnn after migrating to r1.0.""" def setUp(self): with open(TEST_CONFIG_PATH) as f: # So we can always reference default vals. self.test_config = yaml.load(f) def test_merge_params(self): """Checks how parameters passed to TEST_FLAGS interact with parameters from yaml files. Expected behavior is that any params in TEST_FLAGS will override those from files, but that all values from file will be used if not explicitly passed to TEST_FLAGS. """ config = io_utils.parse_config(flags=TEST_FLAGS) # ============================================================== # Easy tests. # ============================================================== # Change model in test_flags and ensure merged config uses that model. config = update_config(config, model='ChatBot') self.assertEqual(config['model'], 'ChatBot') # Also ensure that switching back works too. config = update_config(config, model='DynamicBot') self.assertEqual(config['model'], 'DynamicBot') # Do the same for changing the dataset. config = update_config(config, dataset='TestData') self.assertEqual(config['dataset'], 'TestData') # ============================================================== # Medium tests. # ============================================================== # Ensure recursive merging works. config = update_config( config, batch_size=123, dropout_prob=0.8) logging.info(config) self.assertEqual(config['model'], self.test_config['model']) self.assertEqual(config['dataset'], self.test_config['dataset']) self.assertNotEqual(config['model_params'], self.test_config['model_params']) def test_optimize(self): """Ensure the new optimize config flag works. Right now, 'works' means it correctly determiens the true vocab size, updates it in the config file, and updates any assoc. file names. """ config = io_utils.parse_config(flags=TEST_FLAGS) logging.info(config) # Manually set vocab size to huge (non-optimal for TestData) value. config = io_utils.update_config(config=config, vocab_size=99999) self.assertEqual(config['dataset_params']['vocab_size'], 99999) self.assertEqual(config['dataset_params']['config_path'], TEST_CONFIG_PATH) # Instantiate a new dataset. # This where the 'optimize' flag comes into play, since # the dataset object is responsible for things like checking # data file paths and unique words. logging.info("Setting up %s dataset.", config['dataset']) logging.info("Passing %r for dataset_params", config['dataset_params']) dataset_class = pydoc.locate(config['dataset']) \ or getattr(data, config['dataset']) dataset = dataset_class(config['dataset_params']) self.assertIsInstance(dataset, data.TestData) self.assertNotEqual(dataset.vocab_size, 99999) def test_update_config(self): """Test the new function in io_utils.py""" logging.info(os.getcwd()) config = io_utils.get_yaml_config(TEST_CONFIG_PATH) config['model_params']['ckpt_dir'] = TEST_FLAGS.model_params['ckpt_dir'] self.assertIsInstance(config, dict) self.assertTrue('model' in config) self.assertTrue('dataset' in config) self.assertTrue('dataset_params' in config) self.assertTrue('model_params' in config) config = io_utils.update_config( config_path=TEST_CONFIG_PATH, return_config=True, vocab_size=1234) self.assertEqual(config['dataset_params']['vocab_size'], 1234) if __name__ == '__main__': unittest.main() ================================================ FILE: tests/test_config.yml ================================================ dataset: TestData dataset_params: config_path: /home/brandon/Documents/DeepChatModels/tests/test_config.yml max_seq_len: 15 optimize_params: true vocab_size: 121 model: DynamicBot model_params: base_cell: GRUCell batch_size: 16 decode: false embed_size: 32 learning_rate: 0.002 max_steps: 100 num_layers: 1 reset_model: true state_size: 128 steps_per_ckpt: 25 ================================================ FILE: tests/test_data/train_from.txt ================================================ One. Two. Three. Four. Five. Six. Seven. Eight. Nine. Hello. What is your name? Do you like ice cream? Who is the president of the United States? Who is your favorite president? Please be nice. Are you intelligent? Tell me your favorite color. Count to five. Hi. What's up? How's it going? What are you up to? Are you okay? I like cats. Say firetruck. Say lasagne. Do robots have free will? You aren't very talkative. Cows say moo. What sound does a duck make? Who did you vote for? Do you watch TV? Sorry. Thank you. Have a nice day. Do you think? Where can I hide a dead body? ================================================ FILE: tests/test_data/train_from.txt.ids121 ================================================ 36 4 23 4 20 4 27 4 18 4 58 4 47 4 51 4 44 4 46 4 13 12 24 106 5 11 6 42 54 35 5 28 12 14 16 31 14 41 38 5 28 12 24 17 16 5 97 30 19 4 10 6 107 5 99 117 24 17 55 4 69 53 18 4 33 4 13 9 26 32 5 45 9 26 40 94 5 13 10 6 32 53 5 10 6 43 5 8 42 67 4 25 52 4 25 56 4 11 101 22 70 50 5 6 72 9 15 74 96 4 80 25 77 4 13 76 98 21 95 91 5 28 90 6 92 116 5 11 6 86 82 5 79 4 62 6 4 22 21 19 112 4 11 6 49 5 81 109 8 64 21 103 87 5 ================================================ FILE: tests/test_data/train_to.txt ================================================ Two. Three. Four. Five. Six. Seven. Eight. Nine. Ten. Hi. I am Groot. I hate ice cream. Satan is the president of the United States. Barack Obama is my favorite president. Okay, I will be nice. I don't know. My favorite color is blue. One, two, three, four, five. Hello. Not much, you? Good, how about you? Just hanging out. Yeah, I'm fine. Dogs are better. Firetruck. Lasagne. I don't know. Neither are you. No, they do not. Quack. Watson. No, I don't have eyes. It's fine. You are welcome. Thanks, you too. Do I think what? The scrapyard, with everyone else. ================================================ FILE: tests/test_data/train_to.txt.ids121 ================================================ 23 4 20 4 27 4 18 4 58 4 47 4 51 4 44 4 113 4 33 4 8 115 104 4 8 75 54 35 4 118 12 14 16 31 14 41 38 4 68 108 12 48 17 16 4 43 7 8 50 30 19 4 8 29 9 15 57 4 48 17 55 12 65 4 36 7 23 7 20 7 27 7 18 4 46 4 34 100 7 6 5 60 7 45 61 6 5 114 78 59 4 83 7 8 9 71 37 4 102 10 120 4 52 4 56 4 8 29 9 15 57 4 84 10 6 4 39 7 111 11 34 4 88 4 110 4 39 7 8 29 9 15 22 105 4 40 9 26 37 4 6 10 66 4 93 7 6 63 4 11 8 49 13 5 14 85 7 73 89 119 4 ================================================ FILE: tests/test_data/valid_from.txt ================================================ Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? ================================================ FILE: tests/test_data/valid_from.txt.ids121 ================================================ 10 6 3 5 62 6 4 28 12 21 60 3 5 10 67 120 3 102 5 10 6 3 5 62 6 4 28 12 21 60 3 5 10 67 120 3 102 5 10 6 3 5 62 6 4 28 12 21 60 3 5 10 67 120 3 102 5 10 6 3 5 62 6 4 28 12 21 60 3 5 10 67 120 3 102 5 ================================================ FILE: tests/test_data/valid_to.txt ================================================ No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. ================================================ FILE: tests/test_data/valid_to.txt.ids121 ================================================ 39 7 8 115 34 3 4 6 10 66 4 8 115 21 60 3 4 3 7 67 10 120 3 102 4 39 7 8 115 34 3 4 6 10 66 4 8 115 21 60 3 4 3 7 67 10 120 3 102 4 39 7 8 115 34 3 4 6 10 66 4 8 115 21 60 3 4 3 7 67 10 120 3 102 4 39 7 8 115 34 3 4 6 10 66 4 8 115 21 60 3 4 3 7 67 10 120 3 102 4 ================================================ FILE: tests/test_data/vocab121.txt ================================================ _PAD _GO _EOS _UNK . ? you , i ' are is do what the t favorite five president s three have four who nice your don say a two one be to up my think no will it hello firetruck color okay know cream seven eight hi states of like fine six not how ice united lasagne nine thank m good tv me free better am satan yeah they day groot name sorry welcome moo thanks did sound count cows scrapyard aren hanging eyes where going dead please about neither intelligent dogs can out blue for too with watson barack make everyone tell talkative duck hide ten much robots just does very quack obama hate vote else body watch cats ================================================ FILE: tests/test_data.py ================================================ import logging import pdb import sys sys.path.append("..") import os import unittest import tensorflow as tf from pydoc import locate import chatbot from utils import io_utils import data from chatbot.globals import DEFAULT_FULL_CONFIG dir = os.path.dirname(os.path.realpath(__file__)) from tests.utils import * class TestData(unittest.TestCase): """Tests for the datsets.""" def setUp(self): logging.basicConfig(level=logging.INFO) tf.logging.set_verbosity('ERROR') self.supported_datasets = ['Reddit', 'Ubuntu', 'Cornell'] self.default_flags = { 'pretrained_dir': TEST_FLAGS.pretrained_dir, 'config': TEST_FLAGS.config, 'model': TEST_FLAGS.model, 'debug': TEST_FLAGS.debug} def test_basic(self): """Instantiate all supported datasets and check they satisfy basic conditions. THIS MAY TAKE A LONG TIME TO COMPLETE. Since we are testing that the supported datasets can be instantiated successfully, it necessarily means that the data must exist in proper format. Since the program will generate the proper format(s) if not found, this will take about 15 minutes if run from a completely fresh setup. Otherwise, a few seconds. :) """ if os.getenv('DATA') is None \ and not os.path.exists('/home/brandon/Datasets'): print('To run this test, please enter the path to your datasets: ') data_dir = input() else: data_dir = '/home/brandon/Datasets' for dataset_name in self.supported_datasets: logging.info('Testing %s', dataset_name) incomplete_params = { 'vocab_size': 40000, 'max_seq_len': 10} self.assertIsNotNone(incomplete_params) dataset_class = getattr(data, dataset_name) # User must specify data_dir, which we have not done yet. self.assertRaises(ValueError, dataset_class, incomplete_params) config = io_utils.parse_config(flags=TEST_FLAGS) dataset_params = config.get('dataset_params') dataset_params['data_dir'] = os.path.join( data_dir, dataset_name.lower()) dataset = dataset_class(dataset_params) # Ensure all params from DEFAULT_FULL_CONFIG['dataset_params'] # are set to a value in our dataset object. for default_key in DEFAULT_FULL_CONFIG['dataset_params']: self.assertIsNotNone(getattr(dataset, default_key)) # Check that all dataset properties exist. self.assertIsNotNone(dataset.name) self.assertIsNotNone(dataset.word_to_idx) self.assertIsNotNone(dataset.idx_to_word) self.assertIsNotNone(dataset.vocab_size) self.assertIsNotNone(dataset.max_seq_len) # Check that the properties satisfy basic expectations. self.assertEqual(len(dataset.word_to_idx), len(dataset.idx_to_word)) self.assertEqual(len(dataset.word_to_idx), dataset.vocab_size) self.assertEqual(len(dataset.idx_to_word), dataset.vocab_size) incomplete_params.clear() dataset_params.clear() def test_cornell(self): """Train a bot on cornell and display responses when given training data as input -- a sanity check that the data is clean. """ flags = Flags( model_params=dict( ckpt_dir='out/tests/test_cornell', reset_model=True, steps_per_ckpt=50, base_cell='GRUCell', num_layers=1, state_size=128, embed_size=64, max_steps=50), dataset_params=dict( vocab_size=50000, max_seq_len=8, data_dir='/home/brandon/Datasets/cornell'), dataset='Cornell', **self.default_flags) bot, dataset = create_bot(flags=flags, return_dataset=True) bot.train() del bot # Recreate bot (its session is automatically closed after training). flags.model_params['reset_model'] = False flags.model_params['decode'] = True bot, dataset = create_bot(flags, return_dataset=True) for inp_sent, resp_sent in dataset.pairs_generator(100): print('\nHuman:', inp_sent) response = bot.respond(inp_sent) if response == resp_sent: print('Robot: %s\nCorrect!' % response) else: print('Robot: %s\nExpected: %s' % ( response, resp_sent)) if __name__ == '__main__': tf.logging.set_verbosity('ERROR') unittest.main() ================================================ FILE: tests/test_dynamic_models.py ================================================ """Trial runs on DynamicBot with the TestData Dataset.""" import time import logging import unittest import numpy as np import tensorflow as tf import pydoc from pydoc import locate import data import chatbot from utils import io_utils, bot_freezer from tests.utils import * class TestDynamicModels(unittest.TestCase): def setUp(self): tf.logging.set_verbosity('ERROR') def test_create_bot(self): """Ensure bot constructor is error-free.""" logging.info("Creating bot . . . ") bot = create_bot() self.assertIsInstance(bot, chatbot.DynamicBot) def test_save_bot(self): """Ensure we can save to bot ckpt dir.""" bot = create_bot() self.assertIsInstance(bot, chatbot.DynamicBot) def test_save_bot(self): """Ensure teardown operations are working.""" bot = create_bot() self.assertIsInstance(bot, chatbot.DynamicBot) logging.info("Closing bot . . . ") bot.close() def test_train(self): """Simulate a brief training session.""" flags = TEST_FLAGS flags = flags._replace(model_params=dict( **flags.model_params, reset_model=True, steps_per_ckpt=10)) bot = create_bot(flags) self._quick_train(bot) def test_base_methods(self): """Call each method in chatbot._models.Model, checking for errors.""" bot = create_bot() logging.info('Calling bot.save() . . . ') bot.save() logging.info('Calling bot.freeze() . . . ') bot.freeze() logging.info('Calling bot.close() . . . ') bot.close() def test_manual_freeze(self): """Make sure we can freeze the bot, unfreeze, and still chat.""" # ================================================ # 1. Create & train bot. # ================================================ flags = TEST_FLAGS flags = flags._replace(model_params=dict( ckpt_dir=os.path.join(TEST_DIR, 'out'), reset_model=True, steps_per_ckpt=20, max_steps=40)) bot = create_bot(flags) self.assertEqual(bot.reset_model, True) # Simulate small train sesh on bot. bot.train() # ================================================ # 2. Recreate a chattable bot. # ================================================ # Recreate bot from scratch with decode set to true. logging.info("Resetting default graph . . . ") tf.reset_default_graph() flags = flags._replace(model_params={ **flags.model_params, 'reset_model': False, 'decode': True, 'max_steps': 100, 'steps_per_ckpt': 50}) self.assertTrue(flags.model_params.get('decode')) bot = create_bot(flags) self.assertTrue(bot.is_chatting) self.assertTrue(bot.decode) print("Testing quick chat sesh . . . ") config = io_utils.parse_config(flags=flags) dataset_class = pydoc.locate(config['dataset']) \ or getattr(data, config['dataset']) dataset = dataset_class(config['dataset_params']) test_input = "How's it going?" encoder_inputs = io_utils.sentence_to_token_ids( tf.compat.as_bytes(test_input), dataset.word_to_idx) encoder_inputs = np.array([encoder_inputs[::-1]]) bot.pipeline._feed_dict = { bot.pipeline.user_input: encoder_inputs} # Get output sentence from the chatbot. _, _, response = bot.step(forward_only=True) print("Robot:", dataset.as_words(response[0][:-1])) # ================================================ # 3. Freeze the chattable bot. # ================================================ logging.info("Calling bot.freeze() . . . ") bot.freeze() # ================================================ # 4. Try to unfreeze and use it. # ================================================ logging.info("Resetting default graph . . . ") tf.reset_default_graph() logging.info("Importing frozen graph into default . . . ") frozen_graph = bot_freezer.load_graph(bot.ckpt_dir) logging.info("Extracting input/output tensors.") tensors, frozen_graph = bot_freezer.unfreeze_bot(bot.ckpt_dir) self.assertIsNotNone(tensors['inputs']) self.assertIsNotNone(tensors['outputs']) with tf.Session(graph=frozen_graph) as sess: raw_input = "How's it going?" encoder_inputs = io_utils.sentence_to_token_ids( tf.compat.as_bytes(raw_input), dataset.word_to_idx) encoder_inputs = np.array([encoder_inputs[::-1]]) feed_dict = {tensors['inputs'].name: encoder_inputs} response = sess.run(tensors['outputs'], feed_dict=feed_dict) logging.info('Reponse: %s', response) def test_memorize(self): """Train a bot to memorize (overfit) the small test data, and show its responses to all train inputs when done. """ flags = TEST_FLAGS flags = flags._replace(model_params=dict( ckpt_dir='out/test_data', reset_model=True, steps_per_ckpt=300, state_size=128, embed_size=32, max_steps=300)) flags = flags._replace(dataset_params=dict( max_seq_len=20, data_dir=TEST_DATA_DIR)) print('TEST_FLAGS', flags.dataset) bot, dataset = create_bot(flags=flags, return_dataset=True) bot.train() # Recreate bot (its session is automatically closed after training). flags = flags._replace(model_params={ **flags.model_params, 'reset_model': False, 'decode': True}) bot, dataset = create_bot(flags, return_dataset=True) for inp_sent, resp_sent in dataset.pairs_generator(): print('\nHuman:', inp_sent) response = bot.respond(inp_sent) if response == resp_sent: print('Robot: %s\nCorrect!' % response) else: print('Robot: %s\nExpected: %s' % ( response, resp_sent)) def _quick_train(self, bot, num_iter=10): """Quickly train manually on some test data.""" coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=bot.sess, coord=coord) for _ in range(num_iter): bot.step() summaries, loss, _ = bot.step() bot.save(summaries=summaries) coord.request_stop() coord.join(threads) ================================================ FILE: tests/test_legacy_models.py ================================================ import os import tensorflow as tf import unittest import logging import sys from utils import io_utils import data import chatbot from tests.utils import TEST_FLAGS class TestLegacyModels(unittest.TestCase): """Test behavior of tf.contrib.rnn after migrating to r1.0.""" def setUp(self): self.seq_len = 20 self.config = io_utils.parse_config(flags=TEST_FLAGS) self.dataset = data.TestData(self.config['dataset_params']) self.batch_size = 2 logging.basicConfig(level=logging.INFO) self.log = logging.getLogger('TestLegacyModels') def test_create(self): """Test basic functionality of SimpleBot remains up-to-date with _models.""" simple_bot = chatbot.SimpleBot( dataset=self.dataset, params=self.config) self.assertIsInstance(simple_bot, chatbot.SimpleBot) chat_bot = chatbot.ChatBot( buckets=[(10, 10)], dataset=self.dataset, params=self.config) self.assertIsInstance(chat_bot, chatbot.ChatBot) def test_compile(self): """Test basic functionality of SimpleBot remains up-to-date with _models.""" buckets = [(10, 20)] # SimpleBot logging.info("Creating/compiling SimpleBot . . . ") bot = chatbot.SimpleBot( dataset=self.dataset, params=self.config) bot.compile() # ChatBot logging.info("Creating/compiling ChatBot . . . ") bot = chatbot.ChatBot( buckets=buckets, dataset=self.dataset, params=self.config) bot.compile() if __name__ == '__main__': unittest.main() ================================================ FILE: tests/utils.py ================================================ """Utility functions used by test modules.""" import logging import data import chatbot import os from pydoc import locate import pdb from utils import io_utils import tensorflow as tf from chatbot.globals import DEFAULT_FULL_CONFIG from collections import namedtuple TEST_DIR = os.path.dirname(os.path.realpath(__file__)) TEST_DATA_DIR = os.path.join(TEST_DIR, 'test_data') TEST_CONFIG_PATH = os.path.join(TEST_DIR, 'test_config.yml') logging.basicConfig(level=logging.INFO) _flag_names = ["pretrained_dir", "config", "debug", "model", "model_params", "dataset", "dataset_params"] Flags = namedtuple('Flags', _flag_names) TEST_FLAGS = Flags(pretrained_dir=None, config=TEST_CONFIG_PATH, debug=True, model='{}', dataset='{}', model_params={'ckpt_dir': os.path.join(TEST_DIR, 'out')}, dataset_params={'data_dir': TEST_DATA_DIR}) def create_bot(flags=TEST_FLAGS, return_dataset=False): """Chatbot factory: Creates and returns a fresh bot. Nice for testing specific methods quickly. """ # Wipe the graph and update config if needed. tf.reset_default_graph() config = io_utils.parse_config(flags=flags) io_utils.print_non_defaults(config) # Instantiate a new dataset. print("Setting up", config['dataset'], "dataset.") dataset_class = locate(config['dataset']) \ or getattr(data, config['dataset']) dataset = dataset_class(config['dataset_params']) # Instantiate a new chatbot. print("Creating", config['model'], ". . . ") bot_class = locate(config['model']) or getattr(chatbot, config['model']) bot = bot_class(dataset, config) if return_dataset: return bot, dataset else: return bot def update_config(config, **kwargs): new_config = {} for key in DEFAULT_FULL_CONFIG: for new_key in kwargs: if new_key in DEFAULT_FULL_CONFIG[key]: if new_config.get(key) is None: new_config[key] = {} new_config[key][new_key] = kwargs[new_key] elif new_key == key: new_config[new_key] = kwargs[new_key] return {**config, **new_config} ================================================ FILE: utils/__init__.py ================================================ from utils import io_utils from utils import bot_freezer ================================================ FILE: utils/bot_freezer.py ================================================ """Utilities for freezing and unfreezing model graphs and variables on the fly.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import numpy as np import tensorflow as tf from utils import io_utils import os import re from pydoc import locate def load_graph(frozen_model_dir): """Load frozen tensorflow graph into the default graph. Args: frozen_model_dir: location of protobuf file containing frozen graph. Returns: tf.Graph object imported from frozen_model_path. """ # Prase the frozen graph definition into a GraphDef object. frozen_file = os.path.join(frozen_model_dir, "frozen_model.pb") with tf.gfile.GFile(frozen_file, "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # Load the graph def into the default graph and return it. with tf.Graph().as_default() as graph: tf.import_graph_def( graph_def, input_map=None, return_elements=None, op_dict=None, producer_op_list=None ) return graph def unfreeze_bot(frozen_model_path): """Restores the frozen graph from file and grabs input/output tensors needed to interface with a bot for conversation. Args: frozen_model_path: location of protobuf file containing frozen graph. Returns: outputs: tensor that can be run in a session. """ bot_graph = load_graph(frozen_model_path) tensors = {'inputs': bot_graph.get_tensor_by_name('import/input_pipeline/user_input:0'), 'outputs': bot_graph.get_tensor_by_name('import/outputs:0')} return tensors, bot_graph def unfreeze_and_chat(frozen_model_path): """Summon a bot back from the dead and have a nice lil chat with it.""" tensor_dict, graph = unfreeze_bot(frozen_model_path) config = io_utils.parse_config(pretrained_dir=frozen_model_path) word_to_idx, idx_to_word = get_frozen_vocab(config) def as_words(sentence): return " ".join([tf.compat.as_str(idx_to_word[i]) for i in sentence]) with tf.Session(graph=graph) as sess: def respond_to(sentence): """Outputs response sentence (string) given input (string).""" # Convert input sentence to token-ids. sentence_tokens = io_utils.sentence_to_token_ids( tf.compat.as_bytes(sentence), word_to_idx) sentence_tokens = np.array([sentence_tokens[::-1]]) # Get output sentence from the chatbot. fetches = tensor_dict['outputs'] feed_dict={tensor_dict['inputs']: sentence_tokens} response = sess.run(fetches=fetches, feed_dict=feed_dict) return as_words(response[0][:-1]) sentence = io_utils.get_sentence() while sentence != 'exit': resp = respond_to(sentence) print("Robot:", resp) sentence = io_utils.get_sentence() print("Farewell, human.") def get_frozen_vocab(config): """Helper function to get dictionaries for translating between tokens and words.""" data_dir = config['dataset_params']['data_dir'] vocab_size = config['dataset_params']['vocab_size'] vocab_path = os.path.join(data_dir, 'vocab{}.txt'.format(vocab_size)) word_to_idx, idx_to_word = io_utils.get_vocab_dicts(vocab_path) return word_to_idx, idx_to_word class FrozenBot: def __init__(self, frozen_model_dir, vocab_size): print(frozen_model_dir) print(type(frozen_model_dir)) self.tensor_dict, self.graph = unfreeze_bot(frozen_model_dir) self.sess = tf.Session(graph=self.graph) self.config = {'dataset_params': { 'data_dir': frozen_model_dir, 'vocab_size': vocab_size}} self.word_to_idx, self.idx_to_word = self.get_frozen_vocab() def as_words(self, sentence): return " ".join([tf.compat.as_str(self.idx_to_word[i]) for i in sentence]) def __call__(self, sentence): """Outputs response sentence (string) given input (string).""" # Convert input sentence to token-ids. sentence_tokens = io_utils.sentence_to_token_ids( tf.compat.as_bytes(sentence), self.word_to_idx) sentence_tokens = np.array([sentence_tokens[::-1]]) # Get output sentence from the chatbot. fetches = self.tensor_dict['outputs'] feed_dict={self.tensor_dict['inputs']: sentence_tokens} response = self.sess.run(fetches=fetches, feed_dict=feed_dict) return self.as_words(response[0][:-1]) ================================================ FILE: utils/io_utils.py ================================================ """Utilities for downloading data from various datasets, tokenizing, vocabularies.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import re import sys import yaml import copy import pandas as pd import logging import tensorflow as tf from collections import Counter, namedtuple from tensorflow.python.platform import gfile from subprocess import Popen, PIPE from chatbot.globals import DEFAULT_FULL_CONFIG # Special vocabulary symbols. _PAD = b"_PAD" # Append to unused space for both encoder/decoder. _GO = b"_GO" # Prepend to each decoder input. _EOS = b"_EOS" # Append to outputs only. Stopping signal when decoding. _UNK = b"_UNK" # For any symbols not in our vocabulary. _START_VOCAB = [_PAD, _GO, _EOS, _UNK] # Enumerations for ease of use by this and other files. PAD_ID = 0 GO_ID = 1 EOS_ID = 2 UNK_ID = 3 # Regular expressions used to tokenize. _WORD_SPLIT = re.compile(b"([.,!?\"':;)(])") _DIGIT_RE = re.compile(br"\d") # Build mock FLAGS object for utils to wrap info around if needed. # This makes the API more user-friendly, since it takes care of # formatting data if the user doesn't do it exactly as expected. # Note: I did initially try this with an actual tf.app.flags object, # but it was a nightmare. _flag_names = ["pretrained_dir", "config", "debug", "model", "model_params", "dataset", "dataset_params"] Flags = namedtuple('Flags', _flag_names) _FLAGS = Flags(pretrained_dir=None, config=None, debug=None, model='{}', dataset='{}', model_params='{}', dataset_params='{}') def save_hyper_params(hyper_params, fname): # Append to file if exists, else create. df = pd.DataFrame(hyper_params) with open(fname, 'a+') as f: df.to_csv(f, header=False) def get_sentence(lower=True): """Simple function to prompt user for input and return it w/o newline. Frequently used in chat sessions, of course. """ sys.stdout.write("Human: ") sys.stdout.flush() sentence = input() if lower: return sentence.lower() return sentence def update_config(config=None, config_path=None, return_config=True, **kwargs): """Update contents of a config file, overwriting any that match those in kwargs. Args: config: (dict) subset of DEFAULT_FULL_CONFIG. config_path: (str) location of a yaml config file. return_config: (bool) whether or not to return the config dictionary. kwargs: key-value pairs to update in the config dictionary and/or file. At least one of {config, config_path} must be not None. If both are not None, then we update the config dictionary with the kwargs, and then set the file at config_path to match updated dictionary contents. In other words, if config is not None, we do won't consider the contents of config_path when doing the updates. """ if config is None and config_path is None: raise ValueError("Configuration info not given to update_config.") if config is None: # Grab the current config file contents into a dictionary. config = get_yaml_config(config_path) logging.info("Updating config values %r for %s", list(kwargs.keys()), config_path) # Update its values with those in kwargs. for top_level_key in DEFAULT_FULL_CONFIG: for update_key in kwargs: if update_key == top_level_key: config[update_key] = kwargs[update_key] elif update_key in DEFAULT_FULL_CONFIG[top_level_key]: if config.get(top_level_key) is None: config[top_level_key] = {} config[top_level_key][update_key] = kwargs[update_key] # Rewrite the config file. if config_path is not None: with open(os.path.join(config_path), 'w') as f: yaml.dump(config, f, default_flow_style=False) # Return the dictionary if requested. if return_config: return config def get_yaml_config(path, save_path=True): with open(path) as file: config = yaml.load(file) if save_path: if config.get('dataset_params') is not None: config['dataset_params']['config_path'] = path return config def load_pretrained_config(pretrained_dir): """Get the full configuration dictionary for a pretrained model. Args: pretrained_dir: path (relative to project root) that is assumed to contain: - config.yml: full configuration file (automatically saved by all models). - checkpoint(s) from training session (also saved automatically). Returns: config: dictionary loaded from config.yml, and with all training flags reset to chat session flags, since the only time this is called is for chatting. """ config_path = os.path.join(pretrained_dir, "config.yml") config = get_yaml_config(config_path) # The loaded config will have "training" values, so we need # to set some of them to "chatting" values, instead of requiring # user to specify them (since they are mandatory for any chat sesion). config['model_params']['decode'] = True config['model_params']['is_chatting'] = True # alias config['model_params']['reset_model'] = False config['model_params']['ckpt_dir'] = pretrained_dir return config def print_non_defaults(config): """Prints all values in config that aren't the default values in DEFAULT_FULL_CONFIG. Args: config: dict of parameters with same structure as DEFAULT_FULL_CONFIG. """ print("\n---------- Your non-default parameters: ----------") if config['model'] != DEFAULT_FULL_CONFIG['model']: print("{}: {}".format('model', config['model'])) if config['dataset'] != DEFAULT_FULL_CONFIG['dataset']: print("{}: {}".format('dataset', config['dataset'])) for dict_id in ['model_params', 'dataset_params']: print(dict_id, end=":\n") for key, val in config[dict_id].items(): # First check if key isn't even specified by defaults. if key not in DEFAULT_FULL_CONFIG[dict_id]: print("\t{}: {}".format(key, val)) elif DEFAULT_FULL_CONFIG[dict_id][key] != val: print("\t{}: {}".format(key, val)) print("--------------------------------------------------\n") def flags_to_dict(flags): """Builds and return a dictionary from flags keys, namely 'model', 'dataset', 'model_params', 'dataset_params'. """ if isinstance(flags, dict): logging.warning('The `flags` object is already a dictionary!') return flags if flags.pretrained_dir is not None: config = load_pretrained_config(flags.pretrained_dir) config['model_params'] = {**config['model_params'], **yaml.load(getattr(flags, 'model_params'))} return config flags_dict = {} # Grab any values under supported keys defined in default config. for stream in DEFAULT_FULL_CONFIG: stream_attr = getattr(flags, stream) if not isinstance(stream_attr, dict): yaml_stream = yaml.load(getattr(flags, stream)) else: yaml_stream = stream_attr if yaml_stream: flags_dict.update({stream: yaml_stream}) elif stream in ['model_params', 'dataset_params']: # Explicitly set it as empty for merging with default later. flags_dict[stream] = {} # If provided, incorporate yaml config file as well. # Give preference to values in flags_dict, since those are # values provided by user on command-line. if flags.config is not None: yaml_config = get_yaml_config(flags.config) flags_dict = merge_dicts( default_dict=yaml_config, preference_dict=flags_dict) return flags_dict def merge_dicts(default_dict, preference_dict): """Preferentially (and recursively) merge input dictionaries. Ensures that all values in preference dict are used, and all other (i.e. unspecified) items are from default dict. """ merged_dict = copy.deepcopy(default_dict) for pref_key in preference_dict: if isinstance(preference_dict[pref_key], dict) and pref_key in merged_dict: # Dictionaries are expected to have the same type structure. # So if any preference_dict[key] is a dict, then require default_dict[key] # must also be a dict (if it exists, that is). assert isinstance(merged_dict[pref_key], dict), \ "Expected default_dict[%r]=%r to have type dict." % \ (pref_key, merged_dict[pref_key]) # Since these are both dictionaries, can just recurse. merged_dict[pref_key] = merge_dicts(merged_dict[pref_key], preference_dict[pref_key]) else: merged_dict[pref_key] = preference_dict[pref_key] return merged_dict def parse_config(flags=None, pretrained_dir=None, config_path=None): """Get custom configuration dictionary from either a tensorflow flags object, a path to a training directory, or a path to a yaml file. Only pass one of these. See "Args" below for more details. The result is a dictionary of the same key-val structure as seen in chatbot.globals.DEFAULT_FULL_CONFIG. For any key-value pair not found from the (single) argument passed, it will be set to the default found in DEFAULT_FULL_CONFIG. Args: flags: A tf.app.flags.FLAGS object. See FLAGS in main.py. pretrained_dir: relative [to project root] path to a pretrained model directory, i.e. a directory where a chatbot was previously saved/trained (a ckpt_dir). config_path: relative [to project root] path to a valid yaml configuration file. For example: 'configs/my_config.yml'. Returns: config: dictionary of merged config info, where precedence is given to user-specified params on command-line (over .yml config files). """ # Only pass one of the options! assert sum(x is not None for x in [flags, pretrained_dir, config_path]) == 1 # Build a flags object from other params, if it doesn't exist. if flags is None: # Get the config_path from the pretrained directory. if config_path is None: config_path = os.path.join(pretrained_dir, 'config.yml') assert gfile.Exists(config_path), \ "Cannot parse from %s. No config.yml." % config_path # Wrap flags string inside an actual tf.app.flags object. flags = _FLAGS flags = flags._replace(config=config_path) assert flags is not None # Get configuration dictionary containing user-specified parameters. config = flags_to_dict(flags) # Sanity check: make sure we have values that don't have defaults. if 'ckpt_dir' not in config['model_params']: print('Robot: Please enter a directory for saving checkpoints:') config['model_params']['ckpt_dir'] = get_sentence(lower=False) if 'data_dir' not in config['dataset_params']: print('Robot: Please enter full path to directory containing data:') config['dataset_params']['data_dir'] = get_sentence(lower=False) # Then, fill in any blanks with the full default config. config = merge_dicts(default_dict=DEFAULT_FULL_CONFIG, preference_dict=config) return config def basic_tokenizer(sentence): """Very basic tokenizer: split the sentence into a list of tokens.""" words = [] for space_separated_fragment in sentence.strip().lower().split(): words.extend(_WORD_SPLIT.split(space_separated_fragment)) return [w for w in words if w] def num_lines(file_path): """Return the number of lines in file given by its absolute path.""" (num_samples, stderr) = Popen(['wc', '-l', file_path], stdout=PIPE).communicate() return int(num_samples.strip().split()[0]) def get_word_freqs(path, counter, norm_digits=True): """Extract word-frequency mapping from file given by path. Args: path: data file of words we wish to extract vocab counts from. counter: collections.Counter object for mapping word -> frequency. norm_digits: Boolean; if true, all digits are replaced by 0s. Returns: The counter (dict), updated with mappings from word -> frequency. """ print("Creating vocabulary for data", path) with gfile.GFile(path, mode="rb") as f: for i, line in enumerate(f): if (i + 1) % 100000 == 0: print("\tProcessing line", (i + 1)) line = tf.compat.as_bytes(line) tokens = basic_tokenizer(line) # Update word frequency counts in vocab counter dict. for w in tokens: word = _DIGIT_RE.sub(b"0", w) if norm_digits else w counter[word] += 1 return counter def create_vocabulary(vocab_path, from_path, to_path, max_vocab_size, norm_digits=True): """Create vocabulary file (if it does not exist yet) from data file. Data file is assumed to contain one sentence per line. Each sentence is tokenized and digits are normalized (if norm_digits is set). Vocabulary contains the most-frequent tokens up to max_vocab_size. We write it to vocabulary_path in a one-token-per-line format, so that later token in the first line gets id=0, second line gets id=1, and so on. Args: vocab_path: path where the vocabulary will be created. from_path: data file for encoder inputs. to_path: data file for decoder inputs. max_vocab_size: limit on the size of the created vocabulary. norm_digits: Boolean; if true, all digits are replaced by 0s. """ if gfile.Exists(vocab_path): return num_lines(vocab_path) vocab = Counter() # Pool all data words together to reflect the data distribution well. vocab = get_word_freqs(from_path, vocab, norm_digits) vocab = get_word_freqs(to_path, vocab, norm_digits) # Get sorted vocabulary, from most frequent to least frequent. vocab_list = _START_VOCAB + sorted(vocab, key=vocab.get, reverse=True) vocab_list = vocab_list[:max_vocab_size] # Write the list to a file. with gfile.GFile(vocab_path, mode="wb") as vocab_file: for w in vocab_list: vocab_file.write(w + b"\n") return len(vocab_list) def get_vocab_dicts(vocabulary_path): """Returns word_to_idx, idx_to_word dictionaries given vocabulary. Args: vocabulary_path: path to the file containing the vocabulary. Returns: a pair: the vocabulary (a dictionary mapping string to integers), and the reversed vocabulary (a list, which reverses the vocabulary mapping). Raises: ValueError: if the provided vocabulary_path does not exist. """ if gfile.Exists(vocabulary_path): rev_vocab = [] with gfile.GFile(vocabulary_path, mode="rb") as f: rev_vocab.extend(f.readlines()) rev_vocab = [tf.compat.as_bytes(line.strip()) for line in rev_vocab] vocab = dict([(x, y) for (y, x) in enumerate(rev_vocab)]) return vocab, rev_vocab else: raise ValueError("Vocabulary file %s not found.", vocabulary_path) def sentence_to_token_ids(sentence, vocabulary, normalize_digits=True): """Convert a string to list of integers representing token-ids. For example, a sentence "I have a dog" may become tokenized into ["I", "have", "a", "dog"] and with vocabulary {"I": 1, "have": 2, "a": 4, "dog": 7"} this function will return [1, 2, 4, 7]. Args: sentence: the sentence in bytes format to convert to token-ids. vocabulary: a dictionary mapping tokens to integers. normalize_digits: Boolean; if true, all digits are replaced by 0s. Returns: a list of integers, the token-ids for the sentence. """ words = basic_tokenizer(sentence) if not normalize_digits: return [vocabulary.get(w, UNK_ID) for w in words] # Normalize digits by 0 before looking words up in the vocabulary. return [vocabulary.get(_DIGIT_RE.sub(b"0", w), UNK_ID) for w in words] def data_to_token_ids(data_path, target_path, vocabulary_path, normalize_digits=True): """Tokenize data file and turn into token-ids using given vocabulary file. This function loads data line-by-line from data_path, calls the above sentence_to_token_ids, and saves the result to target_path. Args: data_path: path to the data file in one-sentence-per-line format. target_path: path where the file with token-ids will be created. vocabulary_path: path to the vocabulary file. normalize_digits: Boolean; if true, all digits are replaced by 0s. """ if not gfile.Exists(target_path): print("Tokenizing data in %s" % data_path) vocab, _ = get_vocab_dicts(vocabulary_path=vocabulary_path) with gfile.GFile(data_path, mode="rb") as data_file: with gfile.GFile(target_path, mode="w") as tokens_file: counter = 0 for line in data_file: counter += 1 if counter % 100000 == 0: print(" tokenizing line %d" % counter) token_ids = sentence_to_token_ids( tf.compat.as_bytes(line), vocab, normalize_digits) tokens_file.write(" ".join([str(tok) for tok in token_ids]) + "\n") def prepare_data(data_dir, vocab_size, from_train_path=None, to_train_path=None, from_valid_path=None, to_valid_path=None, optimize=True, config_path=None): """Prepare all necessary files that are required for the training. Args: data_dir: directory in which the data sets will be stored. from_train_path: path to the file that includes "from" training samples. to_train_path: path to the file that includes "to" training samples. from_valid_path: path to the file that includes "valid_from" samples. to_valid_path: path to the file that includes "valid_to" samples. vocab_size: preferred number of words to use in vocabulary. optimize: if True, allow program to rest this value if the actual vocab_size (num unique words in data) < preferred vocab_size. This would decrease computational cost, should the situation arise. config_path: (required if optimize==True) location of config file. Note on optimize: - It will only have an effect if the following conditions are ALL met: - config_path is not None (and is a valid path) - optimize == True (of course) - true vocab size != [preferred] vocab_size Returns: Tuple of: (1) path to the token-ids for "from language" training data-set, (2) path to the token-ids for "to language" training data-set, (3) path to the token-ids for "from language" development data-set, (4) path to the token-ids for "to language" development data-set, (5) path to the vocabulary file, (6) the true vocabulary size (less than or equal to max allowed) """ if optimize is None: logging.warning("You have not requested that your choice for " "vocab_size be optimized. This can lead to slower " "training times.\nSet 'optimize_params: true' under " "dataset_params in your yaml config to enable.") def maybe_set_param(param, file_name): if param is None: param = os.path.join(data_dir, file_name) logging.info('Set path from None to %s', param) return param def get_vocab_path(vocab_size): return os.path.join(data_dir, "vocab%d.txt" % vocab_size) def append_to_paths(s, **paths): return {name: path + s for name, path in paths.items()} # Set any paths that are None to default values. from_train_path = maybe_set_param(from_train_path, 'train_from.txt') to_train_path = maybe_set_param(to_train_path, 'train_to.txt') from_valid_path = maybe_set_param(from_valid_path, 'valid_from.txt') to_valid_path = maybe_set_param(to_valid_path, 'valid_to.txt') # Create vocabularies of the appropriate sizes. vocab_path = get_vocab_path(vocab_size) true_vocab_size = create_vocabulary( vocab_path, from_train_path, to_train_path, vocab_size) assert true_vocab_size <= vocab_size # User-permitted, we reset the config file's vocab size and rename the # vocabulary path name to the optimal values. should_optimize = config_path is not None should_optimize = (vocab_size != true_vocab_size) and should_optimize should_optimize = optimize and should_optimize if should_optimize: logging.info('Optimizing vocab size in config and renaming files.') # Necessary when we overestimate the number of unique words in the data. # e.g. we set vocab_size = 40k but our data only has 5 unique words, # it would be wasteful to train a model on 40k. # Thus, we rename vocab filenames to have the true vocab size. vocab_size = true_vocab_size old_vocab_path = vocab_path vocab_path = get_vocab_path(true_vocab_size) if old_vocab_path != vocab_path: Popen(['mv', old_vocab_path, vocab_path], stdout=PIPE).communicate() # Reset the value of 'vocab_size' in the configuration file, so that # we won't need to regenerate everything again if the user wants to # resume training/chat/etc. update_config(config_path=config_path, vocab_size=true_vocab_size) id_paths = append_to_paths( '.ids%d' % vocab_size, from_train=from_train_path, to_train=to_train_path, from_valid=from_valid_path, to_valid=to_valid_path) # Create token ids for all training and validation data. for name in id_paths: data_to_token_ids( eval(name + '_path'), id_paths[name], vocab_path) return id_paths, vocab_path, vocab_size ================================================ FILE: webpage/__init__.py ================================================ ================================================ FILE: webpage/app.yaml ================================================ runtime: python env: flex threadsafe: false entrypoint: gunicorn -b :$PORT manage:app resources: cpu: 2 # Number of cores. Default: 1 memory_gb: 4. # RAM in GB. Default: 0.6 GB runtime_config: python_version: 3.5 # Define environment vars for app configuration. env_variables: APPENGINE_CONFIG: 'production' ================================================ FILE: webpage/config.py ================================================ import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config: DEFAULT_THEME = 'lumen' # Boolean: True if you == Brandon McKinze; False otherwise :) FLASK_PRACTICE_ADMIN = os.getenv('true') # Activates the cross-site request forgery prevention. WTF_CSRF_ENABLED = True # Used to create cryptographic token used to valide a form. SECRET_KEY = os.getenv('SECRET_KEY', 'not-really-a-secret-now') # SQLAlchemy configuration. SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_COMMIT_ON_TEARDOWN = True # Username/password for flask admin access. # COVER YOUR EYES - LOOK AWAY - NOTHING TO SEE HERE BASIC_AUTH_USERNAME = os.getenv('BASIC_AUTH_USERNAME', 'admin') BASIC_AUTH_PASSWORD = os.getenv('BASIC_AUTH_PASSWORD', 'password') @staticmethod def init_app(app): pass class DevelopmentConfig(Config): DEBUG = True # Path of our db file. Required by Flask-SQLAlchemy extension. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data_dev.db') class TestingConfig(Config): TESTING = True # Path of our db file. Required by Flask-SQLAlchemy extension. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data_test.db') class ProductionConfig(Config): # Path of our db file. Required by Flask-SQLAlchemy extension. SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.db') SESSION_COOKIE_HTTPONLY = False PREFERRED_URL_SCHEME = 'https' config = { 'development': DevelopmentConfig, 'testing': TestingConfig, 'production': ProductionConfig, 'default': DevelopmentConfig } ================================================ FILE: webpage/deepchat/__init__.py ================================================ """deepchat/__init__.py: Initialize session objects.""" import os from flask import Flask from flask_wtf import CSRFProtect from flask_moment import Moment from flask_restful import Resource, Api from flask_basicauth import BasicAuth from flask_pagedown import PageDown from flask_sqlalchemy import SQLAlchemy from flask_admin import Admin from config import config csrf = CSRFProtect() # Initialize our database. db = SQLAlchemy() # Nice thingy for displaying dates/times. moment = Moment() # Client-sdie Markdown-to-HTML converter implemented in JS. pagedown = PageDown() # Flask-restful api interface. api = Api() # Database visualizer. #name=os.getenv('APPENGINE_CONFIG', 'Development').title(), admin = Admin(template_mode='bootstrap3') # Basic authentication (mainly for using flask-admin). basic_auth = BasicAuth() class ReverseProxied(object): '''Wrap the application in this middleware and configure the front-end server to add these headers, to let you quietly bind this to a URL other than / and to an HTTP scheme that is different than what is used locally. In nginx: location /myprefix { proxy_pass http://192.168.0.1:5001; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Scheme $scheme; proxy_set_header X-Script-Name /myprefix; } :param app: the WSGI application ''' def __init__(self, app): self.app = app def __call__(self, environ, start_response): script_name = environ.get('HTTP_X_SCRIPT_NAME', '') if script_name: environ['SCRIPT_NAME'] = script_name path_info = environ['PATH_INFO'] if path_info.startswith(script_name): environ['PATH_INFO'] = path_info[len(script_name):] scheme = environ.get('HTTP_X_SCHEME', '') if scheme: environ['wsgi.url_scheme'] = scheme server = environ.get('HTTP_X_FORWARDED_SERVER', '') if server: environ['HTTP_HOST'] = server return self.app(environ, start_response) def create_app(config_name): """The application factory, which allows the app to be created at runtime. This is in contrast to before, where it was created in the global scope (i.e. no way to apply configuration changes dynamically). Returns: app: the created application instance. Note that the app is still missing routes and custom error page handlers, which will be handled by blueprints. """ from .main import main as main_blueprint # Create flask application object, and # read/use info in config.py. app = Flask(__name__) #if config_name == 'production': # app.wsgi_app = ReverseProxied(app.wsgi_app) csrf.init_app(app) app.config.from_object(config[config_name]) config[config_name].init_app(app) # Initialize our database. db.init_app(app) # Nice thingy for displaying dates/times. moment.init_app(app) # Client-sdie Markdown-to-HTML converter implemented in JS. pagedown.init_app(app) # admin.name = config_name.title() admin.init_app(app) basic_auth.init_app(app) api.init_app(app) app.register_blueprint(main_blueprint) return app ================================================ FILE: webpage/deepchat/main/__init__.py ================================================ """Package constructor file for creating blueprint(s).""" from flask import Blueprint from flask_cors import CORS # Blueprint(, ). # Note: The (main for us) defines the blueprint namespace. main = Blueprint('main', __name__) CORS(main, supports_credentials=True) # By importing views and errors here, we cause the routes and error handlers # to be associated with the blueprint. from . import views, errors ================================================ FILE: webpage/deepchat/main/errors.py ================================================ """Routes for error pages.""" from flask import render_template from . import main @main.app_errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @main.app_errorhandler(500) def internal_server_error(e): # TODO return "Server error. I should really make a template for this . . . " ================================================ FILE: webpage/deepchat/main/forms.py ================================================ """apps/forms.py: """ from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, \ TextField, TextAreaField, HiddenField from wtforms.validators import DataRequired, InputRequired from wtforms.validators import ValidationError def bad_chars(form, string_field): for c in r";'`": if c in string_field.data: raise ValidationError('DONT TYPE DAT') class ChatForm(FlaskForm): """Creates a chat_form for users to enter input.""" message = StringField('message', validators=[DataRequired()]) submit = SubmitField('Submit') class UserForm(FlaskForm): """Form for creating/editing a user.""" name = StringField(label='name', id='user-name', validators=[DataRequired(), bad_chars]) submit = SubmitField(label='Submit') class SentencePairForm(FlaskForm): input_sentence = StringField( label='input-sentence', id='input-sentence', validators=[DataRequired()]) response_sentence = StringField( label='response-sentence', id='response-sentence', validators=[DataRequired()]) submit = SubmitField(label='Submit') ================================================ FILE: webpage/deepchat/main/views.py ================================================ from datetime import datetime import os import yaml import json from flask import make_response, flash from werkzeug.exceptions import HTTPException from flask_admin.contrib import sqla from . import main from .. import db, web_bot, admin, basic_auth, api from flask import redirect, current_app from flask import render_template from flask import session, url_for, request from flask_cors import cross_origin from flask_restful import Resource, fields from .forms import ChatForm, UserForm from ..models import User, Chatbot, Conversation, Turn from .. import models from pydoc import locate @main.context_processor def inject_enumerate(): return dict(enumerate=enumerate) @main.before_app_first_request def load_gloabal_data(): """Create the cornell_bot to be used for chat session.""" session['start_time'] = None @main.route('/') @main.route('/index') @cross_origin() def index(): # Create the (empty) forms that user can fill with info. user_form = UserForm() chat_form = ChatForm() return render_template('index.html', user=session.get('user'), user_form=user_form, chat_form=chat_form) @main.route('/about') @cross_origin() def about(): return render_template('about.html', user=session.get('user', 'Anon')) @main.route('/plots') def plots(): return render_template('plots.html', user=session.get('user', 'Anon')) def update_database(user_message, bot_response): """Fill database (db) with new input-response, and associated data.""" # 1. Get the User db.Model. user = get_database_model('User', filter=session.get('user', 'Anon')) # 2. Get the Chatbot db.Model. bot_name = ChatAPI.bot_name chatbot = get_database_model('Chatbot', filter=bot_name) # 3. Get the Conversation db.Model. if session.get('start_time') is None: session['start_time'] = datetime.utcnow() conversation = get_database_model('Conversation', filter=session.get('start_time'), user=user, chatbot=chatbot) # 4. Get the Turn db.model. (called get adds it to the db if not there). _ = get_database_model('Turn', user_message=user_message, chatbot_message=bot_response, conversation=conversation) db.session.commit() def get_database_model(class_name, filter=None, **kwargs): model_class = getattr(models, class_name) assert model_class is not None, 'db_model for %s is None.' % class_name if filter is not None: if class_name == 'Conversation': filter_kw = {'start_time': filter} else: filter_kw = {'name': filter} db_model = model_class.query.filter_by(**filter_kw).first() else: db_model = None filter_kw = {} if db_model is None: db_model = model_class(**filter_kw, **kwargs) db.session.add(db_model) return db_model # ------------------------------------------------------- # APIs # ------------------------------------------------------- class UserAPI(Resource): def post(self): name = request.values.get('name', 'Anon') session['user'] = name user_model = get_database_model('User', filter=name) return {'name': user_model.name} class ChatAPI(Resource): # Class attributes. This is convenient since we only want one active # bot at any given time. bot_name = 'Unk Bot' bot = None def __init__(self, data_name): if ChatAPI.bot_name != data_name: ChatAPI.bot_name = data_name ChatAPI.bot = web_bot.FrozenBot(frozen_model_dir=data_name, is_testing=current_app.testing) config = ChatAPI.bot.config _ = get_database_model('Chatbot', filter=ChatAPI.bot_name, dataset=config['dataset'], **config['model_params']) db.session.commit() # TODO: delete this after refactor rest of file. session['data_name'] = data_name def post(self): print('post received') print('request:', request) user_message = request.values.get('user_message') print('user_message = ', user_message) bot_response = self.bot(user_message) print('resp:', bot_response) update_database(user_message, bot_response) return {'response': bot_response, 'bot_name': ChatAPI.bot_name} class RedditAPI(ChatAPI): def __init__(self): super(RedditAPI, self).__init__('reddit') class CornellAPI(ChatAPI): def __init__(self): super(CornellAPI, self).__init__('cornell') class UbuntuAPI(ChatAPI): def __init__(self): super(UbuntuAPI, self).__init__('ubuntu') api.add_resource(UserAPI, '/user/') api.add_resource(RedditAPI, '/chat/reddit/') api.add_resource(CornellAPI, '/chat/cornell/') api.add_resource(UbuntuAPI, '/chat/ubuntu/') # ------------------------------------------------------- # ADMIN: Authentication for the admin (me) on /admin. # ------------------------------------------------------- class AuthException(HTTPException): def __init__(self, message): super().__init__(message, make_response( "You could not be authenticated. Please refresh the page.", 401, {'WWW-Authenticate': 'Basic realm="Login Required"'})) class ModelView(sqla.ModelView): def is_accessible(self): if not basic_auth.authenticate(): raise AuthException('Not authenticated.') else: return True def inaccessible_callback(self, name, **kwargs): return redirect(basic_auth.challenge()) admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Chatbot, db.session)) admin.add_view(ModelView(Conversation, db.session)) admin.add_view(ModelView(Turn, db.session)) ================================================ FILE: webpage/deepchat/models.py ================================================ """app/models.py: Tutorial IV - Databases. database models: collection of classes whose purpose is to represent the data that we will store in our database. The ORM layer (SQLAlchemy) will do the translations required to map objects created from these classes into rows in the proper database table. - ORM: Object Relational Mapper; links b/w tables corresp. to objects. """ from deepchat import db import json class User(db.Model): """A model that represents our users. Jargon/Parameters: - primary key: unique id given to each user. - varchar: a string. - db.Column parameter info: - index=True: allows for faster queries by associating a given column with its own index. Use for values frequently looked up. - unique=True: don't allow duplicate values in this column. Fields: id: (db.Integer) primary_key for identifying a user in the table. name: (str) posts: (db.relationship) """ # Fields are defined as class variables, but are used by super() in init. # Pass boolean args to indicate which fields are unique/indexed. # Note: 'unique' here means [a given user] 'has only one'. id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), index=True, unique=True) # Relationships are not actual database fields (not shown on a db diagram). # - backref: *defines* a field that will be added to the instances of # Posts that point back to this user. # - lazy='dynamic': "Instead of loading the items, return another query # object which we can refine before loading items. conversations = db.relationship('Conversation', backref='user', lazy='dynamic') def __repr__(self): return "".format(self.name) class Chatbot(db.Model): """Chatbot. Fields are the same as from yaml config files.""" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), index=True, unique=True) # TODO: make unique? dataset = db.Column(db.String(64)) base_cell = db.Column(db.String(64)) encoder = db.Column(db.String(64)) decoder = db.Column(db.String(64)) learning_rate = db.Column(db.Float) num_layers = db.Column(db.Integer) state_size = db.Column(db.Integer) conversations = db.relationship('Conversation', backref='chatbot', lazy='dynamic') def __init__(self, name, **bot_kwargs): self.name = (name or 'Unknown Bot') self.dataset = bot_kwargs['dataset'] self.base_cell = bot_kwargs['base_cell'] self.encoder = bot_kwargs['encoder'] self.decoder = bot_kwargs['decoder'] self.learning_rate = bot_kwargs['learning_rate'] self.num_layers = bot_kwargs['num_layers'] self.state_size = bot_kwargs['state_size'] def __repr__(self): return json.dumps("".format(self.name)) class Conversation(db.Model): id = db.Column(db.Integer, primary_key=True) start_time = db.Column(db.DateTime, index=True, unique=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) chatbot_id = db.Column(db.Integer, db.ForeignKey('chatbot.id')) turns = db.relationship('Turn', backref='conversation', lazy='dynamic') def __repr__(self): return ''.format(self.user_id, self.chatbot_id) class Turn(db.Model): id = db.Column(db.Integer, primary_key=True) user_message = db.Column(db.Text) chatbot_message = db.Column(db.Text) conversation_id = db.Column(db.Integer, db.ForeignKey('conversation.id')) def __repr__(self): return 'User: {0}\nChatBot: {1}'.format( self.user_message, self.chatbot_message) ================================================ FILE: webpage/deepchat/static/assets/plots/accuracy.json ================================================ {"id": "el10890140364661486200", "axes": [{"texts": [{"id": "el10890140364668459552", "v_baseline": "hanging", "position": [0.5, -0.086054610609196], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Iteration"}, {"id": "el10890140364661587864", "v_baseline": "auto", "position": [-0.06812277016023768, 0.5], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -90.0, "h_anchor": "middle", "text": "accuracy"}, {"id": "el10890140364662032984", "v_baseline": "auto", "position": [0.5, 1.015141573714228], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Accuracy"}, {"id": "el10890140364661369936", "v_baseline": "auto", "position": [0.07022562559824969, 0.9537636905062333], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 11.450999999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiGRU"}, {"id": "el10890140364662697600", "v_baseline": "auto", "position": [0.07022562559824969, 0.9140392671478322], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 11.450999999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicLSTM"}, {"id": "el10890140364662694296", "v_baseline": "auto", "position": [0.07022562559824969, 0.8743148437894311], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 11.450999999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiLSTM"}, {"id": "el10890140364670353704", "v_baseline": "auto", "position": [0.07022562559824969, 0.83459042043103], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 11.450999999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicGRU"}, {"id": "el10890140364658585384", "v_baseline": "auto", "position": [0.07022562559824969, 0.7948659970726291], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 11.450999999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicDeepGRU"}], "sharey": [], "paths": [{"xindex": 0, "id": "el10890140364661370552", "edgewidth": 0.26, "yindex": 1, "zorder": 1000000.0, "pathcodes": ["M", "L", "S", "L", "S", "L", "S", "L", "S", "Z"], "alpha": 0.8, "data": "data03", "facecolor": "#373E4B", "dasharray": "none", "coordinates": "axes", "edgecolor": "#CCCCCC"}], "axesbg": "#373E4B", "ylim": [0.0, 1.0], "zoomable": true, "markers": [], "xscale": "linear", "images": [], "ydomain": [0.0, 1.0], "id": "el10890140365871658208", "bbox": [0.10683333333333334, 0.1387301587301587, 0.8379479166666666, 0.7862301587301588], "yscale": "linear", "lines": [{"xindex": 0, "id": "el10890140365871130608", "alpha": 1, "yindex": 1, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140365914743192", "alpha": 1, "yindex": 2, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140364658076472", "alpha": 1, "yindex": 3, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364660400312", "alpha": 1, "yindex": 4, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364659191032", "alpha": 1, "yindex": 5, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}, {"xindex": 0, "id": "el10890140364661368592", "alpha": 1, "yindex": 1, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140364662695920", "alpha": 1, "yindex": 2, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140364662694464", "alpha": 1, "yindex": 3, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364670356840", "alpha": 1, "yindex": 4, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364658582920", "alpha": 1, "yindex": 5, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}], "sharex": [], "axes": [{"scale": "linear", "tickvalues": null, "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "bottom", "nticks": 6}, {"scale": "linear", "tickvalues": [0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9, 1.0], "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "left", "nticks": 11}], "axesbgalpha": null, "xlim": [0.0, 10000.0], "collections": [], "xdomain": [0.0, 10000.0]}], "plugins": [{"type": "reset"}, {"enabled": false, "type": "zoom", "button": true}, {"enabled": false, "type": "boxzoom", "button": true}], "data": {"data01": [[1.0, 6.375108774214766e-16, 2.914335439641036e-16, 2.498001805406602e-16, 6.938893903907228e-16, 5.204170427930421e-16], [417.6666666666667, 0.29977863823944084, 0.14559865964472238, 0.20314975490393888, 0.23860527150668315, 0.11916494056930464], [834.3333333333334, 0.24183280177197666, 0.18255822218539372, 0.1946690864614531, 0.2821539806067809, 0.26500375295000994], [1251.0, 0.3821935760615926, 0.21259751598892979, 0.2445860368618599, 0.3114716095409464, 0.32763609522070447], [1667.6666666666667, 0.32793957033977567, 0.20270677176008262, 0.2920194759893797, 0.3060232421420437, 0.2907044418283824], [2084.3333333333335, 0.3896591893423303, 0.229586234462288, 0.3053671095661233, 0.28270828386789165, 0.2456016638086732], [2501.0, 0.4328466777950236, 0.191885793620294, 0.24797410420864488, 0.39512036327722494, 0.25938442837648285], [2917.666666666667, 0.41391899955948686, 0.19252991473635517, 0.2519229590716383, 0.32047903777750436, 0.2763730992040809], [3334.3333333333335, 0.5321382737265304, 0.17727001210681875, 0.32353768649733233, 0.42987020991306507, 0.4677504831207277], [3751.0, 0.5342504996892232, 0.26703117824488154, 0.23700660778027915, 0.4867323221669429, 0.3363523147239528], [4167.666666666667, 0.5299335675892584, 0.22408564157661903, 0.37716281275189223, 0.4626267525115635, 0.5084210362442997], [4584.333333333334, 0.48401191798455623, 0.22792561751444687, 0.27422172928700356, 0.4619499795560751, 0.39144374078499455], [5001.0, 0.49502840638160694, 0.21949404478073076, 0.28053978085517783, 0.4669744968414299, 0.4016335308551779], [5417.666666666667, 0.44381992226883554, 0.21268251212372774, 0.2829408426124414, 0.689662803063867, 0.43655772919234964], [5834.333333333334, 0.5389360451561276, 0.23779442041445406, 0.4022967827200895, 0.7679466523694558, 0.4260193159415564], [6251.0, 0.5078195612893334, 0.23823135306716847, 0.40842477441980213, 0.7079175588842472, 0.4083044211834479], [6667.666666666667, 0.45979786457912875, 0.25047502732458155, 0.273514039517225, 0.5278397379747168, 0.4423537198428079], [7084.333333333334, 0.47080783917643043, 0.27756954102331116, 0.45381223801122245, 0.4616587496316319, 0.460811941561352], [7501.0, 0.4607930137210381, 0.28173243784186913, 0.2826692052203163, 0.6680329715291469, 0.5684363614528067], [7917.666666666667, 0.7954443614709525, 0.29055309237458044, 0.3845844384516942, 0.6819699464892792, 0.6816879591596695], [8334.333333333334, 0.7422504076642961, 0.32947849352457076, 0.4334284816052714, 0.7899650674745893, 0.48224819721915724], [8751.0, 0.8238829435727034, 0.23319039392118185, 0.3164542207444754, 0.4784462710991981, 0.5079541543828185], [9167.666666666668, 0.7467329677208957, 0.2529997860648542, 0.3172876328069489, 0.4615180630030777, 0.47188199191806174], [9584.333333333334, 0.6889364631613103, 0.2647802507648005, 0.3117450494476408, 0.8026776040620743, 0.47294378191309244], [10001.0, 0.48011362552642894, 0.3089488744735713, 0.3295454382896424, 0.5110085606575018, 0.4382102191448213]], "data02": [[0.017081908929303974, 0.9638778832079948, 0.9241534598495937, 0.8844290364911926, 0.8447046131327915, 0.8049801897743906], [0.05504170654997948, 0.9638778832079948, 0.9241534598495937, 0.8844290364911926, 0.8447046131327915, 0.8049801897743906]], "data03": [[0.013285929167236421, 0.7782597284611112], [0.20869253177197936, 0.7782597284611112], [0.21248851153404688, 0.7782597284611112], [0.21248851153404688, 0.7840392671478322], [0.21248851153404688, 0.9797716145964769], [0.21248851153404688, 0.9855511532831979], [0.20869253177197936, 0.9855511532831979], [0.013285929167236421, 0.9855511532831979], [0.009489949405168868, 0.9855511532831979], [0.009489949405168868, 0.9797716145964769], [0.009489949405168868, 0.7840392671478322], [0.009489949405168868, 0.7782597284611112], [0.013285929167236421, 0.7782597284611112]]}, "width": 720.0, "height": 504.0} ================================================ FILE: webpage/deepchat/static/assets/plots/configs.json ================================================ {"BidiGRU": {"dataset_params": {"config_path": "configs/cornellBasicBidi.yml"}, "model_params": {"encoder.class": "BidirectionalEncoder", "attention_size": null, "batch_size": 256, "base_cell": "GRUCell", "num_layers": 1}}, "BasicLSTM": {"dataset_params": {"config_path": "configs/example_cornell.yml"}, "model_params": {"encoder.class": "BasicEncoder", "batch_size": 256, "base_cell": "LSTMCell", "num_layers": 1}}, "BidiLSTM": {"dataset_params": {"config_path": "configs/example_cornell.yml"}, "model_params": {"encoder.class": "BidirectionalEncoder", "batch_size": 128, "base_cell": "LSTMCell", "num_layers": 1}}, "BasicGRU": {"dataset_params": {"config_path": "configs/cornellBasic.yml"}, "model_params": {"encoder.class": "BasicEncoder", "attention_size": null, "batch_size": 256, "base_cell": "GRUCell", "num_layers": 1}}, "BasicDeepGRU": {"dataset_params": {"config_path": "configs/cornell.yml"}, "model_params": {"encoder.class": "BasicEncoder", "attention_size": null, "batch_size": 256, "base_cell": "GRUCell", "num_layers": 3}}} ================================================ FILE: webpage/deepchat/static/assets/plots/training.json ================================================ {"id": "el10890140364660675304", "axes": [{"texts": [{"id": "el10890140364658041968", "v_baseline": "hanging", "position": [0.5, -0.086054610609196], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Iteration"}, {"id": "el10890140365913037288", "v_baseline": "auto", "position": [-0.06062392183849873, 0.5], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -90.0, "h_anchor": "middle", "text": "training loss"}, {"id": "el10890140364661259400", "v_baseline": "auto", "position": [0.5, 1.015141573714228], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Training Loss"}, {"id": "el10890140364658490504", "v_baseline": "auto", "position": [0.8195816450494322, 0.9410234442033009], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiGRU"}, {"id": "el10890140364658488488", "v_baseline": "auto", "position": [0.8195816450494322, 0.8883503255438349], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicLSTM"}, {"id": "el10890140365912918336", "v_baseline": "auto", "position": [0.8195816450494322, 0.8356772068843689], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiLSTM"}, {"id": "el10890140364668812648", "v_baseline": "auto", "position": [0.8195816450494322, 0.783004088224903], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicGRU"}, {"id": "el10890140364661856184", "v_baseline": "auto", "position": [0.8195816450494322, 0.730330969565437], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicDeepGRU"}], "sharey": [], "paths": [{"xindex": 0, "id": "el10890140364658553744", "edgewidth": 0.26, "yindex": 1, "zorder": 1000000.0, "pathcodes": ["M", "L", "S", "L", "S", "L", "S", "L", "S", "Z"], "alpha": 0.8, "data": "data03", "facecolor": "#373E4B", "dasharray": "none", "coordinates": "axes", "edgecolor": "#CCCCCC"}], "axesbg": "#373E4B", "ylim": [-0.3795666896864136, 12.0], "zoomable": true, "markers": [], "xscale": "linear", "images": [], "ydomain": [-0.3795666896864136, 12.0], "id": "el10890140364672271024", "bbox": [0.10090885416666667, 0.1387301587301587, 0.8438723958333332, 0.7862301587301588], "yscale": "linear", "lines": [{"xindex": 0, "id": "el10890140364662366448", "alpha": 1, "yindex": 1, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140364658583200", "alpha": 1, "yindex": 2, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140364658582416", "alpha": 1, "yindex": 3, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364658076864", "alpha": 1, "yindex": 4, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364658582192", "alpha": 1, "yindex": 5, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}, {"xindex": 0, "id": "el10890140364658489496", "alpha": 1, "yindex": 1, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140365872416696", "alpha": 1, "yindex": 2, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140365872416248", "alpha": 1, "yindex": 3, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364668810128", "alpha": 1, "yindex": 4, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364661855232", "alpha": 1, "yindex": 5, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}], "sharex": [], "axes": [{"scale": "linear", "tickvalues": null, "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "bottom", "nticks": 6}, {"scale": "linear", "tickvalues": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0], "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "left", "nticks": 13}], "axesbgalpha": null, "xlim": [0.0, 10000.0], "collections": [], "xdomain": [0.0, 10000.0]}], "plugins": [{"type": "reset"}, {"enabled": false, "type": "zoom", "button": true}, {"enabled": false, "type": "boxzoom", "button": true}], "data": {"data01": [[1.0, 10.931026458740234, 10.930654525756836, 10.931416511535648, 10.932717323303217, 10.930228233337402], [417.6666666666667, 3.7192071502735478, 4.78514583134435, 4.041068579228652, 4.503413501334764, 4.94506045130498], [834.3333333333334, 2.8424951821867444, 4.051080413929718, 3.773292835690037, 3.974460330402814, 4.299119388733177], [1251.0, 2.713660031157335, 3.9393891904484897, 3.233973124716775, 3.601196119602793, 2.968915866319403], [1667.6666666666667, 1.681830105867608, 3.4246609113898416, 3.431962514635258, 3.010554793974075, 3.3671229680562624], [2084.3333333333335, 1.2739312678264978, 3.6090097131889625, 3.2981296005069343, 2.377797485987102, 2.913252513721565], [2501.0, 0.9122327049839393, 3.405681849505195, 2.979592022193243, 2.0445058849315414, 2.482200223145383], [2917.666666666667, 0.6774180006052235, 3.48010185167094, 2.856909866202302, 1.383286089365269, 2.2499987335755938], [3334.3333333333335, 0.5807143687902826, 3.480587940759274, 2.857482197892144, 1.230240562612327, 2.091183635499535], [3751.0, 0.46334624416135706, 2.8067013536890975, 2.86515528969061, 0.9210155410992521, 1.6921178112570627], [4167.666666666667, 0.39790204875172563, 2.7419205310675965, 2.6395778502136173, 0.7348328189666147, 1.621430431843839], [4584.333333333334, 0.3898559703712418, 3.2530119051213036, 2.3863418409913346, 0.6146619092716578, 1.3015893867189163], [5001.0, 0.3740173578262302, 2.9660923480987536, 2.4250240325927708, 0.5694184303283664, 1.170769810676572], [5417.666666666667, 0.655875189992961, 3.0161664953240925, 2.3409751547130533, 0.5332949415425455, 0.5906001022373804], [5834.333333333334, 0.3786279626583705, 2.8088116281226423, 2.331705975903775, 0.4290601427721622, 0.9628210247731088], [6251.0, 0.34954926115764484, 2.5894927867045836, 2.3279168432296498, 0.3732577463669005, 0.8848502906126401], [6667.666666666667, 0.3218271777192904, 2.2884168279328394, 2.2459609546620563, 0.4627439871972425, 0.766978639586648], [7084.333333333334, 0.32244577646420247, 2.231317406642702, 2.188211019676833, 0.38194872487162, 0.699391852701138], [7501.0, 0.4200040336129234, 3.0576803851790815, 2.1975233978720254, 0.3077086596771045, 0.6650971435676152], [7917.666666666667, 0.2917338601775078, 2.953812410293118, 2.1247314756616436, 0.28344497331872004, 0.6619398137312942], [8334.333333333334, 0.35496596885405646, 2.668721350013396, 2.137977950208781, 0.2819794681866276, 0.674282358752951], [8751.0, 0.15911350140833072, 2.5331218540880296, 2.0085810999291485, 0.4110583596119077, 0.5942964997743032], [9167.666666666668, 0.18077621610469302, 2.4480855478626125, 2.0156513408317047, 0.33418636540786734, 0.49771934229267184], [9584.333333333334, 0.5680976524652864, 2.4490524130192375, 2.0113841353408213, 0.21779136149185904, 0.4917306322977495], [10001.0, 0.48779106140136475, 1.8378231525421125, 1.9577959775924683, 0.24810448288917297, 0.653302848339078]], "data02": [[0.7562416974492383, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907], [0.8014845171636624, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907]], "data03": [[0.7517174154777959, 0.7088859587139758], [0.9841650130999513, 0.7088859587139758], [0.9886892950713939, 0.7088859587139758], [0.9886892950713939, 0.7158230707111493], [0.9886892950713939, 0.9757201080098926], [0.9886892950713939, 0.9826572200070661], [0.9841650130999513, 0.9826572200070661], [0.7517174154777959, 0.9826572200070661], [0.7471931335063535, 0.9826572200070661], [0.7471931335063535, 0.9757201080098926], [0.7471931335063535, 0.7158230707111493], [0.7471931335063535, 0.7088859587139758], [0.7517174154777959, 0.7088859587139758]]}, "width": 720.0, "height": 504.0} ================================================ FILE: webpage/deepchat/static/assets/plots/validation.json ================================================ {"id": "el10890140364671015904", "axes": [{"texts": [{"id": "el10890140364662563784", "v_baseline": "hanging", "position": [0.5, -0.086054610609196], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Iteration"}, {"id": "el10890140364660127560", "v_baseline": "auto", "position": [-0.06062392183849873, 0.5], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -90.0, "h_anchor": "middle", "text": "validation loss"}, {"id": "el10890140365871532912", "v_baseline": "auto", "position": [0.5, 1.015141573714228], "color": "#B1BED6", "zorder": 3, "coordinates": "axes", "fontsize": 18.0, "alpha": 1, "rotation": -0.0, "h_anchor": "middle", "text": "Validation Loss"}, {"id": "el10890140364659727664", "v_baseline": "auto", "position": [0.8195816450494322, 0.9410234442033009], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiGRU"}, {"id": "el10890140364659725816", "v_baseline": "auto", "position": [0.8195816450494322, 0.8883503255438349], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicLSTM"}, {"id": "el10890140365872649384", "v_baseline": "auto", "position": [0.8195816450494322, 0.8356772068843689], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BidiLSTM"}, {"id": "el10890140364662298440", "v_baseline": "auto", "position": [0.8195816450494322, 0.783004088224903], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicGRU"}, {"id": "el10890140364662700016", "v_baseline": "auto", "position": [0.8195816450494322, 0.730330969565437], "color": "#B1BED6", "zorder": 1000003.0, "coordinates": "axes", "fontsize": 13.744499999999999, "alpha": 1, "rotation": -0.0, "h_anchor": "start", "text": "BasicDeepGRU"}], "sharey": [], "paths": [{"xindex": 0, "id": "el10890140364669254904", "edgewidth": 0.26, "yindex": 1, "zorder": 1000000.0, "pathcodes": ["M", "L", "S", "L", "S", "L", "S", "L", "S", "Z"], "alpha": 0.8, "data": "data03", "facecolor": "#373E4B", "dasharray": "none", "coordinates": "axes", "edgecolor": "#CCCCCC"}], "axesbg": "#373E4B", "ylim": [-0.3507546372711683, 12.0], "zoomable": true, "markers": [], "xscale": "linear", "images": [], "ydomain": [-0.3507546372711683, 12.0], "id": "el10890140364658417504", "bbox": [0.10090885416666667, 0.1387301587301587, 0.8438723958333332, 0.7862301587301588], "yscale": "linear", "lines": [{"xindex": 0, "id": "el10890140364658415376", "alpha": 1, "yindex": 1, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140364660254592", "alpha": 1, "yindex": 2, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140364660253136", "alpha": 1, "yindex": 3, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364659530328", "alpha": 1, "yindex": 4, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364661932216", "alpha": 1, "yindex": 5, "zorder": 2, "dasharray": "none", "data": "data01", "coordinates": "data", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}, {"xindex": 0, "id": "el10890140364659725536", "alpha": 1, "yindex": 1, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#3572C6"}, {"xindex": 0, "id": "el10890140364662297208", "alpha": 1, "yindex": 2, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#83A83B"}, {"xindex": 0, "id": "el10890140364662298048", "alpha": 1, "yindex": 3, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#C44E52"}, {"xindex": 0, "id": "el10890140364662699568", "alpha": 1, "yindex": 4, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#8172B2"}, {"xindex": 0, "id": "el10890140364662699008", "alpha": 1, "yindex": 5, "zorder": 1000002.0, "dasharray": "none", "data": "data02", "coordinates": "axes", "drawstyle": "default", "linewidth": 1.9500000000000002, "color": "#FF914D"}], "sharex": [], "axes": [{"scale": "linear", "tickvalues": null, "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "bottom", "nticks": 6}, {"scale": "linear", "tickvalues": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0], "visible": true, "fontsize": 15.75, "grid": {"gridOn": true, "alpha": 1.0, "color": "#414C5D", "dasharray": "none"}, "tickformat": null, "position": "left", "nticks": 13}], "axesbgalpha": null, "xlim": [0.0, 10000.0], "collections": [], "xdomain": [0.0, 10000.0]}], "plugins": [{"type": "reset"}, {"enabled": false, "type": "zoom", "button": true}, {"enabled": false, "type": "boxzoom", "button": true}], "data": {"data01": [[1.0, 10.908037185668945, 10.908246040344242, 10.908084869384771, 10.908207893371573, 10.904816627502441], [417.6666666666667, 3.6016556472533408, 4.851092596006281, 4.2887905755514595, 4.1209828336945815, 5.394046789954317], [834.3333333333334, 2.869439565046675, 3.731460870196021, 3.8406673820174424, 3.6158900671564185, 3.6384377667659207], [1251.0, 2.3415184373635323, 3.7389662704001436, 3.5391294118678935, 2.4387042863323716, 3.6518973468915155], [1667.6666666666667, 1.6794368480537736, 3.5027657854858005, 3.2430527263945077, 2.730425273821108, 3.1281087362271176], [2084.3333333333335, 1.2151430762386328, 3.7545524546303115, 3.0605757740072623, 2.4158567379616342, 2.941826992163298], [2501.0, 0.9058214132895216, 3.600257027323083, 3.1511709639367376, 1.5494436517116459, 2.5972353579614085], [2917.666666666667, 0.8052570352147541, 2.8389447454849632, 2.981715971525553, 1.9718050254558612, 2.4540645650582587], [3334.3333333333335, 0.5565178084477665, 3.416469721712241, 2.781152489148175, 1.1682458987969284, 1.9086665654051533], [3751.0, 0.3991848760269621, 3.3723912251392476, 2.8629656003714894, 0.9232512776854833, 1.795473124990442], [4167.666666666667, 0.46274552300331434, 3.2751815402332913, 2.676668407348213, 0.6851494089866753, 1.4141032241429243], [4584.333333333334, 0.4012138608993456, 3.00598912798193, 2.5712884145222317, 0.5670867079902583, 1.2798706021473556], [5001.0, 0.3670704662799809, 2.5357654094696005, 2.6178762912750213, 0.5993826389312724, 1.2288413047790498], [5417.666666666667, 0.3629837612558412, 3.4956289102202964, 2.3869650186310984, 0.5760274378076762, 1.0598091473178803], [5834.333333333334, 0.33473332139154605, 2.9587601599685267, 2.374503466319745, 0.4108393706626657, 0.9215816956421827], [6251.0, 0.3591484998896288, 2.837535954925248, 2.2534767184905005, 0.40871921713000625, 0.8473216056439606], [6667.666666666667, 0.2309267850544117, 2.800421021932125, 2.2557048685028844, 0.3903831303285349, 0.732067393229968], [7084.333333333334, 0.3533519127993782, 2.7647243294145074, 2.191659481420088, 0.40049428052214675, 0.7838448200093525], [7501.0, 0.4270854075734056, 2.423053931833705, 2.055139786604139, 0.3319175710677536, 0.672872981665998], [7917.666666666667, 0.4329169546663127, 2.4944027618584212, 2.1520908133927876, 0.31453647424989023, 0.6338823058469557], [8334.333333333334, 0.28101156528039284, 1.4505483023959558, 2.1502237498893475, 0.34423699987212636, 0.604316696263024], [8751.0, 0.28551516220865036, 2.635155570123226, 2.1294500935153726, 0.3901349983749814, 0.5798062519396312], [9167.666666666668, 0.2782044142034448, 1.9990283781992924, 2.1539526315845885, 0.32811995943230066, 0.46666502241565505], [9584.333333333334, 0.48024648398808656, 1.8466569708969285, 1.8976898035870169, 0.2750925179828872, 0.4562356654738968], [10001.0, 0.5150530338287325, 2.4301772117614737, 2.008975982666015, 0.18538825213908938, 0.6862758994102456]], "data02": [[0.7562416974492383, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907], [0.8014845171636624, 0.9531633901983546, 0.9004902715388886, 0.8478171528794226, 0.7951440342199567, 0.7424709155604907]], "data03": [[0.7517174154777959, 0.7088859587139758], [0.9841650130999513, 0.7088859587139758], [0.9886892950713939, 0.7088859587139758], [0.9886892950713939, 0.7158230707111493], [0.9886892950713939, 0.9757201080098926], [0.9886892950713939, 0.9826572200070661], [0.9841650130999513, 0.9826572200070661], [0.7517174154777959, 0.9826572200070661], [0.7471931335063535, 0.9826572200070661], [0.7471931335063535, 0.9757201080098926], [0.7471931335063535, 0.7158230707111493], [0.7471931335063535, 0.7088859587139758], [0.7517174154777959, 0.7088859587139758]]}, "width": 720.0, "height": 504.0} ================================================ FILE: webpage/deepchat/static/assets/test_data/train_from.txt ================================================ One. Two. Three. Four. Five. Six. Seven. Eight. Nine. Hello. What is your name? Do you like ice cream? Who is the president of the United States? Who is your favorite president? Please be nice. Are you intelligent? Tell me your favorite color. Count to five. Hi. What's up? How's it going? What are you up to? Are you okay? I like cats. Say firetruck. Say lasagne. Do robots have free will? You aren't very talkative. Cows say moo. What sound does a duck make? Who did you vote for? Do you watch TV? Sorry. Thank you. Have a nice day. Do you think? Where can I hide a dead body? ================================================ FILE: webpage/deepchat/static/assets/test_data/train_to.txt ================================================ Two. Three. Four. Five. Six. Seven. Eight. Nine. Ten. Hi. I am Groot. I hate ice cream. Satan is the president of the United States. Barack Obama is my favorite president. Okay, I will be nice. I don't know. My favorite color is blue. One, two, three, four, five. Hello. Not much, you? Good, how about you? Just hanging out. Yeah, I'm fine. Dogs are better. Firetruck. Lasagne. I don't know. Neither are you. No, they do not. Quack. Watson. No, I don't have eyes. It's fine. You are welcome. Thanks, you too. Do I think what? The scrapyard, with everyone else. ================================================ FILE: webpage/deepchat/static/assets/test_data/valid_from.txt ================================================ Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? Are you stupid? Thank you. Who is a good boy? Are cats better than dogs? ================================================ FILE: webpage/deepchat/static/assets/test_data/valid_to.txt ================================================ No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. No, I am not stupid. You are welcome. I am a good boy. Yes, cats are better than dogs. ================================================ FILE: webpage/deepchat/static/assets/test_data/vocab121.txt ================================================ _PAD _GO _EOS _UNK . ? you , i ' do are is what the favorite t five president who a three have two say your nice four don s to firetruck my cream color six fine of be lasagne not seven up will ice like states know how nine united okay think it one hello hi eight no watch groot eyes out tell about blue very else me ten please for obama scrapyard neither sound moo thanks duck name satan tv aren good too cats going day barack dogs yeah free count m thank body can did better make welcome watson they quack cows intelligent vote talkative does robots dead hide just hate am with sorry where hanging everyone much ================================================ FILE: webpage/deepchat/static/css/style_modifications.css ================================================ /* Various style tweaks for chat boxes and bootstrap css. */ .jumbotron { background-color: whitesmoke; } .jumbotron > h1 { font-size: 39px; } .chat-form-submit { background-color: rgb(20, 150, 220); border-color: rgb(20, 130, 200); } /*.chat-box, */.carousel-inner { /* color, image, repeat */ background: rgba(176, 196, 222, 0.6) none no-repeat; border-radius: 10px; } .carousel-control { width: 15px; border-radius: 10px; } .chat-log { position: relative; height: 245px; margin-bottom: 0.5em; /* top - (left&right) - bottom */ padding: 0.25em 3em 0.25em; /* So we can actually see the words. */ background-color: transparent; font-weight: bolder; overflow-y: auto; word-wrap: break-word; } .chat-form { padding: 0.25em 3em 0.3em; } .bot-name { color: rgba(70, 130, 180, 0.6); } .user-name { color: SeaGreen; } .message { margin-left: 0.1em; margin-right: 0.1em; } .chat-log hr { display: block; border: none; height: 1px; background-color: rgb(140, 140, 140); margin-top: 0.7em; margin-bottom: 0.7em; } ::-webkit-scrollbar { width: 12px; /* for vertical scrollbars */ height: 12px; /* for horizontal scrollbars */ } ::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.1); } ::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.5); } ================================================ FILE: webpage/deepchat/static/css/theme.css ================================================ /* custom stuff for bootstrap-reference page */ body { padding-top: 70px; padding-bottom: 30px; } .theme-dropdown .dropdown-menu { position: static; display: block; margin-bottom: 20px; } .theme-showcase > p > .btn { margin: 5px 0; } .theme-showcase .navbar .container { width: auto; } ================================================ FILE: webpage/deepchat/static/js/bootstrapify.js ================================================ /* Assign certain elements to bootstrap classes by default, so * less typing for me. */ $(document).ready(function() { // Pretty tables. $('table').addClass('table table-striped table-hover'); // Lists. $('ul.custom').addClass('list-group'); $('ul.custom li').addClass('list-group-item'); // Muh tooltips. let tooltip = $('.tooltip-custom'); // Only auto-show (for 3 sec) if on homepage. if (tooltip.attr('page') == 'index') { tooltip.tooltip('show'); setTimeout(function() { tooltip.tooltip('hide'); }, 3000); } }); ================================================ FILE: webpage/deepchat/static/js/chat_processing.js ================================================ $(document).ready(function() { // Extract the user input from the field. let chatForm = $('.chat-form'); let userMessage = chatForm.find('input[name="message"]'); let submitButton = chatForm.find('.chat-form-submit') submitButton.on('click', function(e) { // Not sure why the specificity is required here (it isn't for my machine) // but the deployed app always selects the first chat box otherwise. let dataName = $('.chat-box.active .chat-form-submit').data('name'); console.log('Event triggered for button with data name:', dataName); userMessage = $('#'+dataName); if (!userMessage.val()) { // don't do anything on empty input return; } let chatLog = $('#'+dataName+'-chat-log'); let messageRow = $('
').attr('class', 'row message'); messageRow.append($('
' + userMessage.val() + '
') .addClass('user-message text-left') .addClass('col-md-8 col-md-push-2') .addClass('col-sm-10 col-sm-push-2')); messageRow.append($('
User
') .addClass('user-name text-left') .addClass('col-md-2 col-md-offset-2')); messageRow.append($('
')); chatLog.append(messageRow); // Submit a POST request to collect user input. $.post('/chat/' + dataName + '/', { "user_message": userMessage.val() }, function(data) { userMessage.val(""); console.log('Response received from bot', data.bot_name) $('#'+dataName+'-chat-log').append($('
').addClass('row message') .append($('
') .addClass('bot-name text-left col-md-2 col-sm-2') .text('Botty')) .append($('
') .addClass('bot-message text-left col-md-8 col-sm-9') .text(data.response)) .append($('
'))); chatLog.scrollTop(chatLog.first().scrollHeight); }); }); userMessage.on('keyup', function(e) { if (e.which == 13) { $(this).parent().find('.btn').click(); } }) }); ================================================ FILE: webpage/deepchat/static/js/jqBootstrapValidation.js ================================================ /* jqBootstrapValidation * A plugin for automating validation on Twitter Bootstrap formatted forms. * * v1.3.6 * * License: MIT - see LICENSE file * * http://ReactiveRaven.github.com/jqBootstrapValidation/ */ (function( $ ){ var createdElements = []; var defaults = { options: { prependExistingHelpBlock: false, sniffHtml: true, // sniff for 'required', 'maxlength', etc preventSubmit: true, // stop the chat_form submit event from firing if validation fails submitError: false, // function called if there is an error when trying to submit submitSuccess: false, // function called just before a successful submit event is sent to the server semanticallyStrict: false, // set to true to tidy up generated HTML output autoAdd: { helpBlocks: true }, filter: function () { // return $(this).is(":visible"); // only validate elements you can see return true; // validate everything } }, methods: { init : function( options ) { var settings = $.extend(true, {}, defaults); settings.options = $.extend(true, settings.options, options); var $siblingElements = this; var uniqueForms = $.unique( $siblingElements.map( function () { return $(this).parents("chat_form")[0]; }).toArray() ); $(uniqueForms).bind("submit", function (e) { var $form = $(this); var warningsFound = 0; var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter); $inputs.trigger("submit.validation").trigger("validationLostFocus.validation"); $inputs.each(function (i, el) { var $this = $(el), $controlGroup = $this.parents(".chat_form-group").first(); if ( $controlGroup.hasClass("warning") ) { $controlGroup.removeClass("warning").addClass("error"); warningsFound++; } }); $inputs.trigger("validationLostFocus.validation"); if (warningsFound) { if (settings.options.preventSubmit) { e.preventDefault(); } $form.addClass("error"); if ($.isFunction(settings.options.submitError)) { settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true)); } } else { $form.removeClass("error"); if ($.isFunction(settings.options.submitSuccess)) { settings.options.submitSuccess($form, e); } } }); return this.each(function(){ // Get references to everything we're interested in var $this = $(this), $controlGroup = $this.parents(".chat_form-group").first(), $helpBlock = $controlGroup.find(".help-block").first(), $form = $this.parents("form").first(), validatorNames = []; // create message container if not exists if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) { $helpBlock = $('
'); $controlGroup.find('.controls').append($helpBlock); createdElements.push($helpBlock[0]); } // ============================================================= // SNIFF HTML FOR VALIDATORS // ============================================================= // *snort sniff snuffle* if (settings.options.sniffHtml) { var message = ""; // --------------------------------------------------------- // PATTERN // --------------------------------------------------------- if ($this.attr("pattern") !== undefined) { message = "Not in the expected format"; if ($this.data("validationPatternMessage")) { message = $this.data("validationPatternMessage"); } $this.data("validationPatternMessage", message); $this.data("validationPatternRegex", $this.attr("pattern")); } // --------------------------------------------------------- // MAX // --------------------------------------------------------- if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) { var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax")); message = "Too high: Maximum of '" + max + "'"; if ($this.data("validationMaxMessage")) { message = $this.data("validationMaxMessage"); } $this.data("validationMaxMessage", message); $this.data("validationMaxMax", max); } // --------------------------------------------------------- // MIN // --------------------------------------------------------- if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) { var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin")); message = "Too low: Minimum of '" + min + "'"; if ($this.data("validationMinMessage")) { message = $this.data("validationMinMessage"); } $this.data("validationMinMessage", message); $this.data("validationMinMin", min); } // --------------------------------------------------------- // MAXLENGTH // --------------------------------------------------------- if ($this.attr("maxlength") !== undefined) { message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters"; if ($this.data("validationMaxlengthMessage")) { message = $this.data("validationMaxlengthMessage"); } $this.data("validationMaxlengthMessage", message); $this.data("validationMaxlengthMaxlength", $this.attr("maxlength")); } // --------------------------------------------------------- // MINLENGTH // --------------------------------------------------------- if ($this.attr("minlength") !== undefined) { message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters"; if ($this.data("validationMinlengthMessage")) { message = $this.data("validationMinlengthMessage"); } $this.data("validationMinlengthMessage", message); $this.data("validationMinlengthMinlength", $this.attr("minlength")); } // --------------------------------------------------------- // REQUIRED // --------------------------------------------------------- if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) { message = settings.builtInValidators.required.message; if ($this.data("validationRequiredMessage")) { message = $this.data("validationRequiredMessage"); } $this.data("validationRequiredMessage", message); } // --------------------------------------------------------- // NUMBER // --------------------------------------------------------- if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") { message = settings.builtInValidators.number.message; if ($this.data("validationNumberMessage")) { message = $this.data("validationNumberMessage"); } $this.data("validationNumberMessage", message); } // --------------------------------------------------------- // EMAIL // --------------------------------------------------------- if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") { message = "Not a valid email address"; if ($this.data("validationValidemailMessage")) { message = $this.data("validationValidemailMessage"); } else if ($this.data("validationEmailMessage")) { message = $this.data("validationEmailMessage"); } $this.data("validationValidemailMessage", message); } // --------------------------------------------------------- // MINCHECKED // --------------------------------------------------------- if ($this.attr("minchecked") !== undefined) { message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required"; if ($this.data("validationMincheckedMessage")) { message = $this.data("validationMincheckedMessage"); } $this.data("validationMincheckedMessage", message); $this.data("validationMincheckedMinchecked", $this.attr("minchecked")); } // --------------------------------------------------------- // MAXCHECKED // --------------------------------------------------------- if ($this.attr("maxchecked") !== undefined) { message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required"; if ($this.data("validationMaxcheckedMessage")) { message = $this.data("validationMaxcheckedMessage"); } $this.data("validationMaxcheckedMessage", message); $this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked")); } } // ============================================================= // COLLECT VALIDATOR NAMES // ============================================================= // Get named validators if ($this.data("validation") !== undefined) { validatorNames = $this.data("validation").split(","); } // Get extra ones defined on the element's data attributes $.each($this.data(), function (i, el) { var parts = i.replace(/([A-Z])/g, ",$1").split(","); if (parts[0] === "validation" && parts[1]) { validatorNames.push(parts[1]); } }); // ============================================================= // NORMALISE VALIDATOR NAMES // ============================================================= var validatorNamesToInspect = validatorNames; var newValidatorNamesToInspect = []; do // repeatedly expand 'shortcut' validators into their real validators { // Uppercase only the first letter of each name $.each(validatorNames, function (i, el) { validatorNames[i] = formatValidatorName(el); }); // Remove duplicate validator names validatorNames = $.unique(validatorNames); // Pull out the new validator names from each shortcut newValidatorNamesToInspect = []; $.each(validatorNamesToInspect, function(i, el) { if ($this.data("validation" + el + "Shortcut") !== undefined) { // Are these custom validators? // Pull them out! $.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) { newValidatorNamesToInspect.push(el2); }); } else if (settings.builtInValidators[el.toLowerCase()]) { // Is this a recognised built-in? // Pull it out! var validator = settings.builtInValidators[el.toLowerCase()]; if (validator.type.toLowerCase() === "shortcut") { $.each(validator.shortcut.split(","), function (i, el) { el = formatValidatorName(el); newValidatorNamesToInspect.push(el); validatorNames.push(el); }); } } }); validatorNamesToInspect = newValidatorNamesToInspect; } while (validatorNamesToInspect.length > 0) // ============================================================= // SET UP VALIDATOR ARRAYS // ============================================================= var validators = {}; $.each(validatorNames, function (i, el) { // Set up the 'override' message var message = $this.data("validation" + el + "Message"); var hasOverrideMessage = (message !== undefined); var foundValidator = false; message = ( message ? message : "'" + el + "' validation failed " ) ; $.each( settings.validatorTypes, function (validatorType, validatorTemplate) { if (validators[validatorType] === undefined) { validators[validatorType] = []; } if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) { validators[validatorType].push( $.extend( true, { name: formatValidatorName(validatorTemplate.name), message: message }, validatorTemplate.init($this, el) ) ); foundValidator = true; } } ); if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) { var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]); if (hasOverrideMessage) { validator.message = message; } var validatorType = validator.type.toLowerCase(); if (validatorType === "shortcut") { foundValidator = true; } else { $.each( settings.validatorTypes, function (validatorTemplateType, validatorTemplate) { if (validators[validatorTemplateType] === undefined) { validators[validatorTemplateType] = []; } if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) { $this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]); validators[validatorType].push( $.extend( validator, validatorTemplate.init($this, el) ) ); foundValidator = true; } } ); } } if (! foundValidator) { $.error("Cannot find validation info for '" + el + "'"); } }); // ============================================================= // STORE FALLBACK VALUES // ============================================================= $helpBlock.data( "original-contents", ( $helpBlock.data("original-contents") ? $helpBlock.data("original-contents") : $helpBlock.html() ) ); $helpBlock.data( "original-role", ( $helpBlock.data("original-role") ? $helpBlock.data("original-role") : $helpBlock.attr("role") ) ); $controlGroup.data( "original-classes", ( $controlGroup.data("original-clases") ? $controlGroup.data("original-classes") : $controlGroup.attr("class") ) ); $this.data( "original-aria-invalid", ( $this.data("original-aria-invalid") ? $this.data("original-aria-invalid") : $this.attr("aria-invalid") ) ); // ============================================================= // VALIDATION // ============================================================= $this.bind( "validation.validation", function (event, params) { var value = getValue($this); // Get a list of the errors to apply var errorsFound = []; $.each(validators, function (validatorType, validatorTypeArray) { if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) { $.each(validatorTypeArray, function (i, validator) { if (settings.validatorTypes[validatorType].validate($this, value, validator)) { errorsFound.push(validator.message); } }); } }); return errorsFound; } ); $this.bind( "getValidators.validation", function () { return validators; } ); // ============================================================= // WATCH FOR CHANGES // ============================================================= $this.bind( "submit.validation", function () { return $this.triggerHandler("change.validation", {submitting: true}); } ); $this.bind( [ "keyup", "focus", "blur", "click", "keydown", "keypress", "change" ].join(".validation ") + ".validation", function (e, params) { var value = getValue($this); var errorsFound = []; $controlGroup.find("input,textarea,select").each(function (i, el) { var oldCount = errorsFound.length; $.each($(el).triggerHandler("validation.validation", params), function (j, message) { errorsFound.push(message); }); if (errorsFound.length > oldCount) { $(el).attr("aria-invalid", "true"); } else { var original = $this.data("original-aria-invalid"); $(el).attr("aria-invalid", (original !== undefined ? original : false)); } }); $form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation"); errorsFound = $.unique(errorsFound.sort()); // Were there any errors? if (errorsFound.length) { // Better flag it up as a warning. $controlGroup.removeClass("success error").addClass("warning"); // How many errors did we find? if (settings.options.semanticallyStrict && errorsFound.length === 1) { // Only one? Being strict? Just output it. $helpBlock.html(errorsFound[0] + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); } else { // Multiple? Being sloppy? Glue them together into an UL. $helpBlock.html("
  • " + errorsFound.join("
  • ") + "
" + ( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" )); } } else { $controlGroup.removeClass("warning error success"); if (value.length > 0) { $controlGroup.addClass("success"); } $helpBlock.html($helpBlock.data("original-contents")); } if (e.type === "blur") { $controlGroup.removeClass("success"); } } ); $this.bind("validationLostFocus.validation", function () { $controlGroup.removeClass("success"); }); }); }, destroy : function( ) { return this.each( function() { var $this = $(this), $controlGroup = $this.parents(".chat_form-group").first(), $helpBlock = $controlGroup.find(".help-block").first(); // remove our events $this.unbind('.validation'); // events are namespaced. // reset help text $helpBlock.html($helpBlock.data("original-contents")); // reset classes $controlGroup.attr("class", $controlGroup.data("original-classes")); // reset aria $this.attr("aria-invalid", $this.data("original-aria-invalid")); // reset role $helpBlock.attr("role", $this.data("original-role")); // remove all elements we created if (createdElements.indexOf($helpBlock[0]) > -1) { $helpBlock.remove(); } } ); }, collectErrors : function(includeEmpty) { var errorMessages = {}; this.each(function (i, el) { var $el = $(el); var name = $el.attr("name"); var errors = $el.triggerHandler("validation.validation", {includeEmpty: true}); errorMessages[name] = $.extend(true, errors, errorMessages[name]); }); $.each(errorMessages, function (i, el) { if (el.length === 0) { delete errorMessages[i]; } }); return errorMessages; }, hasErrors: function() { var errorMessages = []; this.each(function (i, el) { errorMessages = errorMessages.concat( $(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : [] ); }); return (errorMessages.length > 0); }, override : function (newDefaults) { defaults = $.extend(true, defaults, newDefaults); } }, validatorTypes: { callback: { name: "callback", init: function ($this, name) { return { validatorName: name, callback: $this.data("validation" + name + "Callback"), lastValue: $this.val(), lastValid: true, lastFinished: true }; }, validate: function ($this, value, validator) { if (validator.lastValue === value && validator.lastFinished) { return !validator.lastValid; } if (validator.lastFinished === true) { validator.lastValue = value; validator.lastValid = true; validator.lastFinished = false; var rrjqbvValidator = validator; var rrjqbvThis = $this; executeFunctionByName( validator.callback, window, $this, value, function (data) { if (rrjqbvValidator.lastValue === data.value) { rrjqbvValidator.lastValid = data.valid; if (data.message) { rrjqbvValidator.message = data.message; } rrjqbvValidator.lastFinished = true; rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { rrjqbvThis.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } } ); } return false; } }, ajax: { name: "ajax", init: function ($this, name) { return { validatorName: name, url: $this.data("validation" + name + "Ajax"), lastValue: $this.val(), lastValid: true, lastFinished: true }; }, validate: function ($this, value, validator) { if (""+validator.lastValue === ""+value && validator.lastFinished === true) { return validator.lastValid === false; } if (validator.lastFinished === true) { validator.lastValue = value; validator.lastValid = true; validator.lastFinished = false; $.ajax({ url: validator.url, data: "value=" + value + "&field=" + $this.attr("name"), dataType: "json", success: function (data) { if (""+validator.lastValue === ""+data.value) { validator.lastValid = !!(data.valid); if (data.message) { validator.message = data.message; } validator.lastFinished = true; $this.data("validation" + validator.validatorName + "Message", validator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { $this.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } }, failure: function () { validator.lastValid = true; validator.message = "ajax call failed"; validator.lastFinished = true; $this.data("validation" + validator.validatorName + "Message", validator.message); // Timeout is set to avoid problems with the events being considered 'already fired' setTimeout(function () { $this.trigger("change.validation"); }, 1); // doesn't need a long timeout, just long enough for the event bubble to burst } }); } return false; } }, regex: { name: "regex", init: function ($this, name) { return {regex: regexFromString($this.data("validation" + name + "Regex"))}; }, validate: function ($this, value, validator) { return (!validator.regex.test(value) && ! validator.negative) || (validator.regex.test(value) && validator.negative); } }, required: { name: "required", init: function ($this, name) { return {}; }, validate: function ($this, value, validator) { return !!(value.length === 0 && ! validator.negative) || !!(value.length > 0 && validator.negative); }, blockSubmit: true }, match: { name: "match", init: function ($this, name) { var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first(); element.bind("validation.validation", function () { $this.trigger("change.validation", {submitting: true}); }); return {"element": element}; }, validate: function ($this, value, validator) { return (value !== validator.element.val() && ! validator.negative) || (value === validator.element.val() && validator.negative); }, blockSubmit: true }, max: { name: "max", init: function ($this, name) { return {max: $this.data("validation" + name + "Max")}; }, validate: function ($this, value, validator) { return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative) || (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative); } }, min: { name: "min", init: function ($this, name) { return {min: $this.data("validation" + name + "Min")}; }, validate: function ($this, value, validator) { return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative) || (parseFloat(value) >= parseFloat(validator.min) && validator.negative); } }, maxlength: { name: "maxlength", init: function ($this, name) { return {maxlength: $this.data("validation" + name + "Maxlength")}; }, validate: function ($this, value, validator) { return ((value.length > validator.maxlength) && ! validator.negative) || ((value.length <= validator.maxlength) && validator.negative); } }, minlength: { name: "minlength", init: function ($this, name) { return {minlength: $this.data("validation" + name + "Minlength")}; }, validate: function ($this, value, validator) { return ((value.length < validator.minlength) && ! validator.negative) || ((value.length >= validator.minlength) && validator.negative); } }, maxchecked: { name: "maxchecked", init: function ($this, name) { var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); elements.bind("click.validation", function () { $this.trigger("change.validation", {includeEmpty: true}); }); return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements}; }, validate: function ($this, value, validator) { return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative) || (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative); }, blockSubmit: true }, minchecked: { name: "minchecked", init: function ($this, name) { var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]"); elements.bind("click.validation", function () { $this.trigger("change.validation", {includeEmpty: true}); }); return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements}; }, validate: function ($this, value, validator) { return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative) || (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative); }, blockSubmit: true } }, builtInValidators: { email: { name: "Email", type: "shortcut", shortcut: "validemail" }, validemail: { name: "Validemail", type: "regex", regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}", message: "Not a valid email address" }, passwordagain: { name: "Passwordagain", type: "match", match: "password", message: "Does not match the given password" }, positive: { name: "Positive", type: "shortcut", shortcut: "number,positivenumber" }, negative: { name: "Negative", type: "shortcut", shortcut: "number,negativenumber" }, number: { name: "Number", type: "regex", regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?", message: "Must be a number" }, integer: { name: "Integer", type: "regex", regex: "[+-]?\\\d+", message: "No decimal places allowed" }, positivenumber: { name: "Positivenumber", type: "min", min: 0, message: "Must be a positive number" }, negativenumber: { name: "Negativenumber", type: "max", max: 0, message: "Must be a negative number" }, required: { name: "Required", type: "required", message: "This is required" }, checkone: { name: "Checkone", type: "minchecked", minchecked: 1, message: "Check at least one option" } } }; var formatValidatorName = function (name) { return name .toLowerCase() .replace( /(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); } ) ; }; var getValue = function ($this) { // Extract the value we're talking about var value = $this.val(); var type = $this.attr("type"); if (type === "checkbox") { value = ($this.is(":checked") ? value : ""); } if (type === "radio") { value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : ""); } return value; }; function regexFromString(inputstring) { return new RegExp("^" + inputstring + "$"); } /** * Thanks to Jason Bunting via StackOverflow.com * * http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910 * Short link: http://tinyurl.com/executeFunctionByName **/ function executeFunctionByName(functionName, context /*, args*/) { var args = Array.prototype.slice.call(arguments).splice(2); var namespaces = functionName.split("."); var func = namespaces.pop(); for(var i = 0; i < namespaces.length; i++) { context = context[namespaces[i]]; } return context[func].apply(this, args); } $.fn.jqBootstrapValidation = function( method ) { if ( defaults.methods[method] ) { return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return defaults.methods.init.apply( this, arguments ); } else { $.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' ); return null; } }; $.jqBootstrapValidation = function (options) { $(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments); }; })( jQuery ); ================================================ FILE: webpage/deepchat/static/js/user_form.js ================================================ $(document).ready(function() { $('#user-form-submit').on('click', function(e) { var userName = $('#user-name'); if (!userName.val()) { // don't do anything on empty input return; } // Submit a POST request to collect user input. $.post('/user/', {"name": userName.val()}, function(data) { $('#nav-session-user').html('User: ' + data.name); userName.val(""); }); }); $('#user-name').on('keypress', function(e) { if (e.which == 13) { $('#user-form-submit').click(); } }) }); ================================================ FILE: webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/css/bootstrap-theme.css ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .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: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .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: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .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: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .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: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .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: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .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: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #2e6da4; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .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); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ ================================================ FILE: webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/css/bootstrap.css ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ 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: bold; } 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 #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } 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 { /* test */ orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .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('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot'); src: url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff') format('woff'), url('/static/vendor/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('/static/vendor/bootstrap-3.3.7-dist/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: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .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"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -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: 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; } [role="button"] { cursor: pointer; } 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: normal; 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, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { 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: bold; } 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: bold; -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-of-type(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: bold; } 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: 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::-ms-expand { background-color: transparent; border: 0; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { 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: normal; 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 { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; 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 { min-height: 34px; 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 { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .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, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .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: 11px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; 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: 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 { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .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 { 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:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .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 { 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:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .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 { 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:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .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 { 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:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .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 { 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:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .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 { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; 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.3333333; 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; } .collapse.in { display: block; } 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 dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .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: normal; 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 dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @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, .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:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-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-left-radius: 4px; 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-right-radius: 4px; 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 .form-control:focus { z-index: 3; } .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.3333333; 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: normal; 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 { z-index: 2; 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; } .tab-content > .active { display: block; } .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; } .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 { margin-bottom: 0; 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 { z-index: 2; 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: 3; 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; line-height: 1.3333333; } .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; line-height: 1.5; } .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: bold; 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: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .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-top: 30px; padding-bottom: 30px; 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 { padding-right: 15px; padding-left: 15px; border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .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: bold; } .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, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .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, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .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, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.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, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.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, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.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, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.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, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > 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 > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .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-16by9 { padding-bottom: 56.25%; } .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: bold; 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: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; 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: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { 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-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .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; 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-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; 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); line-break: auto; } .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: 1000px; perspective: 1000px; } .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); background-color: rgba(0, 0, 0, 0); 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; margin-top: -10px; } .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; font-family: serif; line-height: 1; } .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: -10px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; } .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-header:before, .modal-header: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-header: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; } .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 !important; } 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 !important; } 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 !important; } 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 !important; } 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 !important; } 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; } } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/js/bootstrap.js ================================================ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.3.7 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.3.7 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.3.7' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector === '#' ? [] : selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.3.7 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.3.7' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d).prop(d, true) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d).prop(d, false) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target).closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { // Prevent double click on radios, and the double selections (so cancellation) on checkboxes e.preventDefault() // The target component still receive the focus if ($btn.is('input,button')) $btn.trigger('focus') else $btn.find('input:visible,button:visible').first().trigger('focus') } }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.3.7 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.3.7' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.3.7 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ /* jshint latedef: false */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.3.7' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.3.7 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.3.7' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector && $(selector) return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger($.Event('shown.bs.dropdown', relatedTarget)) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.3.7 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.3.7' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (document !== e.target && this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.3.7 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.3.7' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 } } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { options = $.extend({}, this.getDefaults(), this.$element.data(), options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.3.7 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.3.7' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' ](content) $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.3.7 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.3.7' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.3.7 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.3.7' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.3.7 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) this.$target = $(this.options.target) .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.3.7' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: webpage/deepchat/static/vendor/bootstrap-3.3.7-dist/js/npm.js ================================================ // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. require('../../js/transition.js') require('../../js/alert.js') require('../../js/button.js') require('../../js/carousel.js') require('../../js/collapse.js') require('../../js/dropdown.js') require('../../js/modal.js') require('../../js/tooltip.js') require('../../js/popover.js') require('../../js/scrollspy.js') require('../../js/tab.js') require('../../js/affix.js') ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/css/font-awesome.css ================================================ /*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.6.3'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.6.3#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; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.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: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .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; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-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 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-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 { -ms-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: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .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-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .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, .fa-gratipay: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-pp: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-resistance: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-y-combinator-square:before, .fa-yc-square:before, .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"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } .fa-reddit-alien:before { content: "\f281"; } .fa-edge:before { content: "\f282"; } .fa-credit-card-alt:before { content: "\f283"; } .fa-codiepie:before { content: "\f284"; } .fa-modx:before { content: "\f285"; } .fa-fort-awesome:before { content: "\f286"; } .fa-usb:before { content: "\f287"; } .fa-product-hunt:before { content: "\f288"; } .fa-mixcloud:before { content: "\f289"; } .fa-scribd:before { content: "\f28a"; } .fa-pause-circle:before { content: "\f28b"; } .fa-pause-circle-o:before { content: "\f28c"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stop-circle-o:before { content: "\f28e"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-hashtag:before { content: "\f292"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-percent:before { content: "\f295"; } .fa-gitlab:before { content: "\f296"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpforms:before { content: "\f298"; } .fa-envira:before { content: "\f299"; } .fa-universal-access:before { content: "\f29a"; } .fa-wheelchair-alt:before { content: "\f29b"; } .fa-question-circle-o:before { content: "\f29c"; } .fa-blind:before { content: "\f29d"; } .fa-audio-description:before { content: "\f29e"; } .fa-volume-control-phone:before { content: "\f2a0"; } .fa-braille:before { content: "\f2a1"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before { content: "\f2a4"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-signing:before, .fa-sign-language:before { content: "\f2a7"; } .fa-low-vision:before { content: "\f2a8"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-first-order:before { content: "\f2b0"; } .fa-yoast:before { content: "\f2b1"; } .fa-themeisle:before { content: "\f2b2"; } .fa-google-plus-circle:before, .fa-google-plus-official:before { content: "\f2b3"; } .fa-fa:before, .fa-font-awesome:before { content: "\f2b4"; } .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; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/animated.less ================================================ // Animated Icons // -------------------------- .@{fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .@{fa-css-prefix}-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-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); } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/bordered-pulled.less ================================================ // Bordered & Pulled // ------------------------- .@{fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em @fa-border-color; border-radius: .1em; } .@{fa-css-prefix}-pull-left { float: left; } .@{fa-css-prefix}-pull-right { float: right; } .@{fa-css-prefix} { &.@{fa-css-prefix}-pull-left { margin-right: .3em; } &.@{fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .@{fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/core.less ================================================ // Base Class Definition // ------------------------- .@{fa-css-prefix} { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/fixed-width.less ================================================ // Fixed Width Icons // ------------------------- .@{fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/font-awesome.less ================================================ /*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables.less"; @import "mixins.less"; @import "path.less"; @import "core.less"; @import "larger.less"; @import "fixed-width.less"; @import "list.less"; @import "bordered-pulled.less"; @import "animated.less"; @import "rotated-flipped.less"; @import "stacked.less"; @import "icons.less"; @import "screen-reader.less"; ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/icons.less ================================================ /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .@{fa-css-prefix}-glass:before { content: @fa-var-glass; } .@{fa-css-prefix}-music:before { content: @fa-var-music; } .@{fa-css-prefix}-search:before { content: @fa-var-search; } .@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } .@{fa-css-prefix}-heart:before { content: @fa-var-heart; } .@{fa-css-prefix}-star:before { content: @fa-var-star; } .@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } .@{fa-css-prefix}-user:before { content: @fa-var-user; } .@{fa-css-prefix}-film:before { content: @fa-var-film; } .@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } .@{fa-css-prefix}-th:before { content: @fa-var-th; } .@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } .@{fa-css-prefix}-check:before { content: @fa-var-check; } .@{fa-css-prefix}-remove:before, .@{fa-css-prefix}-close:before, .@{fa-css-prefix}-times:before { content: @fa-var-times; } .@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } .@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } .@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } .@{fa-css-prefix}-signal:before { content: @fa-var-signal; } .@{fa-css-prefix}-gear:before, .@{fa-css-prefix}-cog:before { content: @fa-var-cog; } .@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } .@{fa-css-prefix}-home:before { content: @fa-var-home; } .@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } .@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } .@{fa-css-prefix}-road:before { content: @fa-var-road; } .@{fa-css-prefix}-download:before { content: @fa-var-download; } .@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } .@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } .@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } .@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } .@{fa-css-prefix}-rotate-right:before, .@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } .@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } .@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } .@{fa-css-prefix}-lock:before { content: @fa-var-lock; } .@{fa-css-prefix}-flag:before { content: @fa-var-flag; } .@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } .@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } .@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } .@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } .@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } .@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } .@{fa-css-prefix}-tag:before { content: @fa-var-tag; } .@{fa-css-prefix}-tags:before { content: @fa-var-tags; } .@{fa-css-prefix}-book:before { content: @fa-var-book; } .@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } .@{fa-css-prefix}-print:before { content: @fa-var-print; } .@{fa-css-prefix}-camera:before { content: @fa-var-camera; } .@{fa-css-prefix}-font:before { content: @fa-var-font; } .@{fa-css-prefix}-bold:before { content: @fa-var-bold; } .@{fa-css-prefix}-italic:before { content: @fa-var-italic; } .@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } .@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } .@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } .@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } .@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } .@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } .@{fa-css-prefix}-list:before { content: @fa-var-list; } .@{fa-css-prefix}-dedent:before, .@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } .@{fa-css-prefix}-indent:before { content: @fa-var-indent; } .@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } .@{fa-css-prefix}-photo:before, .@{fa-css-prefix}-image:before, .@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } .@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } .@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } .@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } .@{fa-css-prefix}-tint:before { content: @fa-var-tint; } .@{fa-css-prefix}-edit:before, .@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } .@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } .@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } .@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } .@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } .@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } .@{fa-css-prefix}-backward:before { content: @fa-var-backward; } .@{fa-css-prefix}-play:before { content: @fa-var-play; } .@{fa-css-prefix}-pause:before { content: @fa-var-pause; } .@{fa-css-prefix}-stop:before { content: @fa-var-stop; } .@{fa-css-prefix}-forward:before { content: @fa-var-forward; } .@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } .@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } .@{fa-css-prefix}-eject:before { content: @fa-var-eject; } .@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } .@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } .@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } .@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } .@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } .@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } .@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } .@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } .@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } .@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } .@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } .@{fa-css-prefix}-ban:before { content: @fa-var-ban; } .@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } .@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } .@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } .@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } .@{fa-css-prefix}-mail-forward:before, .@{fa-css-prefix}-share:before { content: @fa-var-share; } .@{fa-css-prefix}-expand:before { content: @fa-var-expand; } .@{fa-css-prefix}-compress:before { content: @fa-var-compress; } .@{fa-css-prefix}-plus:before { content: @fa-var-plus; } .@{fa-css-prefix}-minus:before { content: @fa-var-minus; } .@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } .@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } .@{fa-css-prefix}-gift:before { content: @fa-var-gift; } .@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } .@{fa-css-prefix}-fire:before { content: @fa-var-fire; } .@{fa-css-prefix}-eye:before { content: @fa-var-eye; } .@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } .@{fa-css-prefix}-warning:before, .@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } .@{fa-css-prefix}-plane:before { content: @fa-var-plane; } .@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } .@{fa-css-prefix}-random:before { content: @fa-var-random; } .@{fa-css-prefix}-comment:before { content: @fa-var-comment; } .@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } .@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } .@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } .@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } .@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } .@{fa-css-prefix}-folder:before { content: @fa-var-folder; } .@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } .@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } .@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } .@{fa-css-prefix}-bar-chart-o:before, .@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } .@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } .@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } .@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } .@{fa-css-prefix}-key:before { content: @fa-var-key; } .@{fa-css-prefix}-gears:before, .@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } .@{fa-css-prefix}-comments:before { content: @fa-var-comments; } .@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } .@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } .@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } .@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } .@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } .@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } .@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } .@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } .@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } .@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } .@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } .@{fa-css-prefix}-upload:before { content: @fa-var-upload; } .@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } .@{fa-css-prefix}-phone:before { content: @fa-var-phone; } .@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } .@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } .@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } .@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } .@{fa-css-prefix}-facebook-f:before, .@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } .@{fa-css-prefix}-github:before { content: @fa-var-github; } .@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } .@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } .@{fa-css-prefix}-feed:before, .@{fa-css-prefix}-rss:before { content: @fa-var-rss; } .@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } .@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } .@{fa-css-prefix}-bell:before { content: @fa-var-bell; } .@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } .@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } .@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } .@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } .@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } .@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } .@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } .@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } .@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } .@{fa-css-prefix}-globe:before { content: @fa-var-globe; } .@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } .@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } .@{fa-css-prefix}-filter:before { content: @fa-var-filter; } .@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } .@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } .@{fa-css-prefix}-group:before, .@{fa-css-prefix}-users:before { content: @fa-var-users; } .@{fa-css-prefix}-chain:before, .@{fa-css-prefix}-link:before { content: @fa-var-link; } .@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } .@{fa-css-prefix}-flask:before { content: @fa-var-flask; } .@{fa-css-prefix}-cut:before, .@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } .@{fa-css-prefix}-copy:before, .@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } .@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } .@{fa-css-prefix}-save:before, .@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } .@{fa-css-prefix}-square:before { content: @fa-var-square; } .@{fa-css-prefix}-navicon:before, .@{fa-css-prefix}-reorder:before, .@{fa-css-prefix}-bars:before { content: @fa-var-bars; } .@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } .@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } .@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } .@{fa-css-prefix}-underline:before { content: @fa-var-underline; } .@{fa-css-prefix}-table:before { content: @fa-var-table; } .@{fa-css-prefix}-magic:before { content: @fa-var-magic; } .@{fa-css-prefix}-truck:before { content: @fa-var-truck; } .@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } .@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } .@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } .@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } .@{fa-css-prefix}-money:before { content: @fa-var-money; } .@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } .@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } .@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } .@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } .@{fa-css-prefix}-columns:before { content: @fa-var-columns; } .@{fa-css-prefix}-unsorted:before, .@{fa-css-prefix}-sort:before { content: @fa-var-sort; } .@{fa-css-prefix}-sort-down:before, .@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } .@{fa-css-prefix}-sort-up:before, .@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } .@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } .@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } .@{fa-css-prefix}-rotate-left:before, .@{fa-css-prefix}-undo:before { content: @fa-var-undo; } .@{fa-css-prefix}-legal:before, .@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } .@{fa-css-prefix}-dashboard:before, .@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } .@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } .@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } .@{fa-css-prefix}-flash:before, .@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } .@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } .@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } .@{fa-css-prefix}-paste:before, .@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } .@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } .@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } .@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } .@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } .@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } .@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } .@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } .@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } .@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } .@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } .@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } .@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } .@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } .@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } .@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } .@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } .@{fa-css-prefix}-beer:before { content: @fa-var-beer; } .@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } .@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } .@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } .@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } .@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } .@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } .@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } .@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } .@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } .@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } .@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } .@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } .@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } .@{fa-css-prefix}-mobile-phone:before, .@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } .@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } .@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } .@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } .@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } .@{fa-css-prefix}-circle:before { content: @fa-var-circle; } .@{fa-css-prefix}-mail-reply:before, .@{fa-css-prefix}-reply:before { content: @fa-var-reply; } .@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } .@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } .@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } .@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } .@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } .@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } .@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } .@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } .@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } .@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } .@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } .@{fa-css-prefix}-code:before { content: @fa-var-code; } .@{fa-css-prefix}-mail-reply-all:before, .@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } .@{fa-css-prefix}-star-half-empty:before, .@{fa-css-prefix}-star-half-full:before, .@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } .@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } .@{fa-css-prefix}-crop:before { content: @fa-var-crop; } .@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } .@{fa-css-prefix}-unlink:before, .@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } .@{fa-css-prefix}-question:before { content: @fa-var-question; } .@{fa-css-prefix}-info:before { content: @fa-var-info; } .@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } .@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } .@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } .@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } .@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } .@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } .@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } .@{fa-css-prefix}-shield:before { content: @fa-var-shield; } .@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } .@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } .@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } .@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } .@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } .@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } .@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } .@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } .@{fa-css-prefix}-html5:before { content: @fa-var-html5; } .@{fa-css-prefix}-css3:before { content: @fa-var-css3; } .@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } .@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } .@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } .@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } .@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } .@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } .@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } .@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } .@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } .@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } .@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } .@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } .@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } .@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } .@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } .@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } .@{fa-css-prefix}-compass:before { content: @fa-var-compass; } .@{fa-css-prefix}-toggle-down:before, .@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } .@{fa-css-prefix}-toggle-up:before, .@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } .@{fa-css-prefix}-toggle-right:before, .@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } .@{fa-css-prefix}-euro:before, .@{fa-css-prefix}-eur:before { content: @fa-var-eur; } .@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } .@{fa-css-prefix}-dollar:before, .@{fa-css-prefix}-usd:before { content: @fa-var-usd; } .@{fa-css-prefix}-rupee:before, .@{fa-css-prefix}-inr:before { content: @fa-var-inr; } .@{fa-css-prefix}-cny:before, .@{fa-css-prefix}-rmb:before, .@{fa-css-prefix}-yen:before, .@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } .@{fa-css-prefix}-ruble:before, .@{fa-css-prefix}-rouble:before, .@{fa-css-prefix}-rub:before { content: @fa-var-rub; } .@{fa-css-prefix}-won:before, .@{fa-css-prefix}-krw:before { content: @fa-var-krw; } .@{fa-css-prefix}-bitcoin:before, .@{fa-css-prefix}-btc:before { content: @fa-var-btc; } .@{fa-css-prefix}-file:before { content: @fa-var-file; } .@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } .@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } .@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } .@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } .@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } .@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } .@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } .@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } .@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } .@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } .@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } .@{fa-css-prefix}-xing:before { content: @fa-var-xing; } .@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } .@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } .@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } .@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } .@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } .@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } .@{fa-css-prefix}-adn:before { content: @fa-var-adn; } .@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } .@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } .@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } .@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } .@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } .@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } .@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } .@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } .@{fa-css-prefix}-apple:before { content: @fa-var-apple; } .@{fa-css-prefix}-windows:before { content: @fa-var-windows; } .@{fa-css-prefix}-android:before { content: @fa-var-android; } .@{fa-css-prefix}-linux:before { content: @fa-var-linux; } .@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } .@{fa-css-prefix}-skype:before { content: @fa-var-skype; } .@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } .@{fa-css-prefix}-trello:before { content: @fa-var-trello; } .@{fa-css-prefix}-female:before { content: @fa-var-female; } .@{fa-css-prefix}-male:before { content: @fa-var-male; } .@{fa-css-prefix}-gittip:before, .@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } .@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } .@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } .@{fa-css-prefix}-archive:before { content: @fa-var-archive; } .@{fa-css-prefix}-bug:before { content: @fa-var-bug; } .@{fa-css-prefix}-vk:before { content: @fa-var-vk; } .@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } .@{fa-css-prefix}-renren:before { content: @fa-var-renren; } .@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } .@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } .@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } .@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } .@{fa-css-prefix}-toggle-left:before, .@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } .@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } .@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } .@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } .@{fa-css-prefix}-turkish-lira:before, .@{fa-css-prefix}-try:before { content: @fa-var-try; } .@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } .@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } .@{fa-css-prefix}-slack:before { content: @fa-var-slack; } .@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } .@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } .@{fa-css-prefix}-openid:before { content: @fa-var-openid; } .@{fa-css-prefix}-institution:before, .@{fa-css-prefix}-bank:before, .@{fa-css-prefix}-university:before { content: @fa-var-university; } .@{fa-css-prefix}-mortar-board:before, .@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } .@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } .@{fa-css-prefix}-google:before { content: @fa-var-google; } .@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } .@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } .@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } .@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } .@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } .@{fa-css-prefix}-digg:before { content: @fa-var-digg; } .@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } .@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } .@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } .@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } .@{fa-css-prefix}-language:before { content: @fa-var-language; } .@{fa-css-prefix}-fax:before { content: @fa-var-fax; } .@{fa-css-prefix}-building:before { content: @fa-var-building; } .@{fa-css-prefix}-child:before { content: @fa-var-child; } .@{fa-css-prefix}-paw:before { content: @fa-var-paw; } .@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } .@{fa-css-prefix}-cube:before { content: @fa-var-cube; } .@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } .@{fa-css-prefix}-behance:before { content: @fa-var-behance; } .@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } .@{fa-css-prefix}-steam:before { content: @fa-var-steam; } .@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } .@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } .@{fa-css-prefix}-automobile:before, .@{fa-css-prefix}-car:before { content: @fa-var-car; } .@{fa-css-prefix}-cab:before, .@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } .@{fa-css-prefix}-tree:before { content: @fa-var-tree; } .@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } .@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } .@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } .@{fa-css-prefix}-database:before { content: @fa-var-database; } .@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } .@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } .@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } .@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } .@{fa-css-prefix}-file-photo-o:before, .@{fa-css-prefix}-file-picture-o:before, .@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } .@{fa-css-prefix}-file-zip-o:before, .@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } .@{fa-css-prefix}-file-sound-o:before, .@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } .@{fa-css-prefix}-file-movie-o:before, .@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } .@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } .@{fa-css-prefix}-vine:before { content: @fa-var-vine; } .@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } .@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } .@{fa-css-prefix}-life-bouy:before, .@{fa-css-prefix}-life-buoy:before, .@{fa-css-prefix}-life-saver:before, .@{fa-css-prefix}-support:before, .@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } .@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } .@{fa-css-prefix}-ra:before, .@{fa-css-prefix}-resistance:before, .@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } .@{fa-css-prefix}-ge:before, .@{fa-css-prefix}-empire:before { content: @fa-var-empire; } .@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } .@{fa-css-prefix}-git:before { content: @fa-var-git; } .@{fa-css-prefix}-y-combinator-square:before, .@{fa-css-prefix}-yc-square:before, .@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } .@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } .@{fa-css-prefix}-qq:before { content: @fa-var-qq; } .@{fa-css-prefix}-wechat:before, .@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } .@{fa-css-prefix}-send:before, .@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } .@{fa-css-prefix}-send-o:before, .@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } .@{fa-css-prefix}-history:before { content: @fa-var-history; } .@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } .@{fa-css-prefix}-header:before { content: @fa-var-header; } .@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } .@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } .@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } .@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } .@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } .@{fa-css-prefix}-soccer-ball-o:before, .@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } .@{fa-css-prefix}-tty:before { content: @fa-var-tty; } .@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } .@{fa-css-prefix}-plug:before { content: @fa-var-plug; } .@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } .@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } .@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } .@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } .@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } .@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } .@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } .@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } .@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } .@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } .@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } .@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } .@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } .@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } .@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } .@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } .@{fa-css-prefix}-trash:before { content: @fa-var-trash; } .@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } .@{fa-css-prefix}-at:before { content: @fa-var-at; } .@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } .@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } .@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } .@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } .@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } .@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } .@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } .@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } .@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } .@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } .@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } .@{fa-css-prefix}-bus:before { content: @fa-var-bus; } .@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } .@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } .@{fa-css-prefix}-cc:before { content: @fa-var-cc; } .@{fa-css-prefix}-shekel:before, .@{fa-css-prefix}-sheqel:before, .@{fa-css-prefix}-ils:before { content: @fa-var-ils; } .@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } .@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } .@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } .@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } .@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } .@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } .@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } .@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } .@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } .@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } .@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } .@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } .@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } .@{fa-css-prefix}-ship:before { content: @fa-var-ship; } .@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } .@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } .@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } .@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } .@{fa-css-prefix}-venus:before { content: @fa-var-venus; } .@{fa-css-prefix}-mars:before { content: @fa-var-mars; } .@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } .@{fa-css-prefix}-intersex:before, .@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } .@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } .@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } .@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } .@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } .@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } .@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } .@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } .@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } .@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } .@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } .@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } .@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } .@{fa-css-prefix}-server:before { content: @fa-var-server; } .@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } .@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } .@{fa-css-prefix}-hotel:before, .@{fa-css-prefix}-bed:before { content: @fa-var-bed; } .@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } .@{fa-css-prefix}-train:before { content: @fa-var-train; } .@{fa-css-prefix}-subway:before { content: @fa-var-subway; } .@{fa-css-prefix}-medium:before { content: @fa-var-medium; } .@{fa-css-prefix}-yc:before, .@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } .@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } .@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } .@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } .@{fa-css-prefix}-battery-4:before, .@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } .@{fa-css-prefix}-battery-3:before, .@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } .@{fa-css-prefix}-battery-2:before, .@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } .@{fa-css-prefix}-battery-1:before, .@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } .@{fa-css-prefix}-battery-0:before, .@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } .@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } .@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } .@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } .@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } .@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } .@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } .@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } .@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } .@{fa-css-prefix}-clone:before { content: @fa-var-clone; } .@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } .@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } .@{fa-css-prefix}-hourglass-1:before, .@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } .@{fa-css-prefix}-hourglass-2:before, .@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } .@{fa-css-prefix}-hourglass-3:before, .@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } .@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } .@{fa-css-prefix}-hand-grab-o:before, .@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } .@{fa-css-prefix}-hand-stop-o:before, .@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } .@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } .@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } .@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } .@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } .@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } .@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } .@{fa-css-prefix}-registered:before { content: @fa-var-registered; } .@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } .@{fa-css-prefix}-gg:before { content: @fa-var-gg; } .@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } .@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } .@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } .@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } .@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } .@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } .@{fa-css-prefix}-safari:before { content: @fa-var-safari; } .@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } .@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } .@{fa-css-prefix}-opera:before { content: @fa-var-opera; } .@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } .@{fa-css-prefix}-tv:before, .@{fa-css-prefix}-television:before { content: @fa-var-television; } .@{fa-css-prefix}-contao:before { content: @fa-var-contao; } .@{fa-css-prefix}-500px:before { content: @fa-var-500px; } .@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } .@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } .@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } .@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } .@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } .@{fa-css-prefix}-industry:before { content: @fa-var-industry; } .@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } .@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } .@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } .@{fa-css-prefix}-map:before { content: @fa-var-map; } .@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } .@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } .@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } .@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } .@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } .@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } .@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } .@{fa-css-prefix}-edge:before { content: @fa-var-edge; } .@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } .@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } .@{fa-css-prefix}-modx:before { content: @fa-var-modx; } .@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } .@{fa-css-prefix}-usb:before { content: @fa-var-usb; } .@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } .@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } .@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } .@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } .@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } .@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } .@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } .@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } .@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } .@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } .@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } .@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } .@{fa-css-prefix}-percent:before { content: @fa-var-percent; } .@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } .@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } .@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } .@{fa-css-prefix}-envira:before { content: @fa-var-envira; } .@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } .@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } .@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } .@{fa-css-prefix}-blind:before { content: @fa-var-blind; } .@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } .@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } .@{fa-css-prefix}-braille:before { content: @fa-var-braille; } .@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } .@{fa-css-prefix}-asl-interpreting:before, .@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } .@{fa-css-prefix}-deafness:before, .@{fa-css-prefix}-hard-of-hearing:before, .@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } .@{fa-css-prefix}-glide:before { content: @fa-var-glide; } .@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } .@{fa-css-prefix}-signing:before, .@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } .@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } .@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } .@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } .@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } .@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } .@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } .@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } .@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } .@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } .@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } .@{fa-css-prefix}-google-plus-circle:before, .@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } .@{fa-css-prefix}-fa:before, .@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/larger.less ================================================ // Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .@{fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .@{fa-css-prefix}-2x { font-size: 2em; } .@{fa-css-prefix}-3x { font-size: 3em; } .@{fa-css-prefix}-4x { font-size: 4em; } .@{fa-css-prefix}-5x { font-size: 5em; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/list.less ================================================ // List Icons // ------------------------- .@{fa-css-prefix}-ul { padding-left: 0; margin-left: @fa-li-width; list-style-type: none; > li { position: relative; } } .@{fa-css-prefix}-li { position: absolute; left: -@fa-li-width; width: @fa-li-width; top: (2em / 14); text-align: center; &.@{fa-css-prefix}-lg { left: (-@fa-li-width + (4em / 14)); } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/mixins.less ================================================ // Mixins // -------------------------- .fa-icon() { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .fa-icon-rotate(@degrees, @rotation) { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; -webkit-transform: rotate(@degrees); -ms-transform: rotate(@degrees); transform: rotate(@degrees); } .fa-icon-flip(@horiz, @vert, @rotation) { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; -webkit-transform: scale(@horiz, @vert); -ms-transform: scale(@horiz, @vert); transform: scale(@horiz, @vert); } // Only display content to screen readers. A la Bootstrap 4. // // See: http://a11yproject.com/posts/how-to-hide-content/ .sr-only() { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; } // Use in conjunction with .sr-only to only display content when it's focused. // // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 // // Credit: HTML5 Boilerplate .sr-only-focusable() { &:active, &:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/path.less ================================================ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/rotated-flipped.less ================================================ // Rotated & Flipped Icons // ------------------------- .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .@{fa-css-prefix}-rotate-90, :root .@{fa-css-prefix}-rotate-180, :root .@{fa-css-prefix}-rotate-270, :root .@{fa-css-prefix}-flip-horizontal, :root .@{fa-css-prefix}-flip-vertical { filter: none; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/screen-reader.less ================================================ // Screen Readers // ------------------------- .sr-only { .sr-only(); } .sr-only-focusable { .sr-only-focusable(); } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/stacked.less ================================================ // Stacked Icons // ------------------------- .@{fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .@{fa-css-prefix}-stack-1x { line-height: inherit; } .@{fa-css-prefix}-stack-2x { font-size: 2em; } .@{fa-css-prefix}-inverse { color: @fa-inverse; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/less/variables.less ================================================ // Variables // -------------------------- @fa-font-path: "../fonts"; @fa-font-size-base: 14px; @fa-line-height-base: 1; //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; @fa-version: "4.6.3"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @fa-var-500px: "\f26e"; @fa-var-adjust: "\f042"; @fa-var-adn: "\f170"; @fa-var-align-center: "\f037"; @fa-var-align-justify: "\f039"; @fa-var-align-left: "\f036"; @fa-var-align-right: "\f038"; @fa-var-amazon: "\f270"; @fa-var-ambulance: "\f0f9"; @fa-var-american-sign-language-interpreting: "\f2a3"; @fa-var-anchor: "\f13d"; @fa-var-android: "\f17b"; @fa-var-angellist: "\f209"; @fa-var-angle-double-down: "\f103"; @fa-var-angle-double-left: "\f100"; @fa-var-angle-double-right: "\f101"; @fa-var-angle-double-up: "\f102"; @fa-var-angle-down: "\f107"; @fa-var-angle-left: "\f104"; @fa-var-angle-right: "\f105"; @fa-var-angle-up: "\f106"; @fa-var-apple: "\f179"; @fa-var-archive: "\f187"; @fa-var-area-chart: "\f1fe"; @fa-var-arrow-circle-down: "\f0ab"; @fa-var-arrow-circle-left: "\f0a8"; @fa-var-arrow-circle-o-down: "\f01a"; @fa-var-arrow-circle-o-left: "\f190"; @fa-var-arrow-circle-o-right: "\f18e"; @fa-var-arrow-circle-o-up: "\f01b"; @fa-var-arrow-circle-right: "\f0a9"; @fa-var-arrow-circle-up: "\f0aa"; @fa-var-arrow-down: "\f063"; @fa-var-arrow-left: "\f060"; @fa-var-arrow-right: "\f061"; @fa-var-arrow-up: "\f062"; @fa-var-arrows: "\f047"; @fa-var-arrows-alt: "\f0b2"; @fa-var-arrows-h: "\f07e"; @fa-var-arrows-v: "\f07d"; @fa-var-asl-interpreting: "\f2a3"; @fa-var-assistive-listening-systems: "\f2a2"; @fa-var-asterisk: "\f069"; @fa-var-at: "\f1fa"; @fa-var-audio-description: "\f29e"; @fa-var-automobile: "\f1b9"; @fa-var-backward: "\f04a"; @fa-var-balance-scale: "\f24e"; @fa-var-ban: "\f05e"; @fa-var-bank: "\f19c"; @fa-var-bar-chart: "\f080"; @fa-var-bar-chart-o: "\f080"; @fa-var-barcode: "\f02a"; @fa-var-bars: "\f0c9"; @fa-var-battery-0: "\f244"; @fa-var-battery-1: "\f243"; @fa-var-battery-2: "\f242"; @fa-var-battery-3: "\f241"; @fa-var-battery-4: "\f240"; @fa-var-battery-empty: "\f244"; @fa-var-battery-full: "\f240"; @fa-var-battery-half: "\f242"; @fa-var-battery-quarter: "\f243"; @fa-var-battery-three-quarters: "\f241"; @fa-var-bed: "\f236"; @fa-var-beer: "\f0fc"; @fa-var-behance: "\f1b4"; @fa-var-behance-square: "\f1b5"; @fa-var-bell: "\f0f3"; @fa-var-bell-o: "\f0a2"; @fa-var-bell-slash: "\f1f6"; @fa-var-bell-slash-o: "\f1f7"; @fa-var-bicycle: "\f206"; @fa-var-binoculars: "\f1e5"; @fa-var-birthday-cake: "\f1fd"; @fa-var-bitbucket: "\f171"; @fa-var-bitbucket-square: "\f172"; @fa-var-bitcoin: "\f15a"; @fa-var-black-tie: "\f27e"; @fa-var-blind: "\f29d"; @fa-var-bluetooth: "\f293"; @fa-var-bluetooth-b: "\f294"; @fa-var-bold: "\f032"; @fa-var-bolt: "\f0e7"; @fa-var-bomb: "\f1e2"; @fa-var-book: "\f02d"; @fa-var-bookmark: "\f02e"; @fa-var-bookmark-o: "\f097"; @fa-var-braille: "\f2a1"; @fa-var-briefcase: "\f0b1"; @fa-var-btc: "\f15a"; @fa-var-bug: "\f188"; @fa-var-building: "\f1ad"; @fa-var-building-o: "\f0f7"; @fa-var-bullhorn: "\f0a1"; @fa-var-bullseye: "\f140"; @fa-var-bus: "\f207"; @fa-var-buysellads: "\f20d"; @fa-var-cab: "\f1ba"; @fa-var-calculator: "\f1ec"; @fa-var-calendar: "\f073"; @fa-var-calendar-check-o: "\f274"; @fa-var-calendar-minus-o: "\f272"; @fa-var-calendar-o: "\f133"; @fa-var-calendar-plus-o: "\f271"; @fa-var-calendar-times-o: "\f273"; @fa-var-camera: "\f030"; @fa-var-camera-retro: "\f083"; @fa-var-car: "\f1b9"; @fa-var-caret-down: "\f0d7"; @fa-var-caret-left: "\f0d9"; @fa-var-caret-right: "\f0da"; @fa-var-caret-square-o-down: "\f150"; @fa-var-caret-square-o-left: "\f191"; @fa-var-caret-square-o-right: "\f152"; @fa-var-caret-square-o-up: "\f151"; @fa-var-caret-up: "\f0d8"; @fa-var-cart-arrow-down: "\f218"; @fa-var-cart-plus: "\f217"; @fa-var-cc: "\f20a"; @fa-var-cc-amex: "\f1f3"; @fa-var-cc-diners-club: "\f24c"; @fa-var-cc-discover: "\f1f2"; @fa-var-cc-jcb: "\f24b"; @fa-var-cc-mastercard: "\f1f1"; @fa-var-cc-paypal: "\f1f4"; @fa-var-cc-stripe: "\f1f5"; @fa-var-cc-visa: "\f1f0"; @fa-var-certificate: "\f0a3"; @fa-var-chain: "\f0c1"; @fa-var-chain-broken: "\f127"; @fa-var-check: "\f00c"; @fa-var-check-circle: "\f058"; @fa-var-check-circle-o: "\f05d"; @fa-var-check-square: "\f14a"; @fa-var-check-square-o: "\f046"; @fa-var-chevron-circle-down: "\f13a"; @fa-var-chevron-circle-left: "\f137"; @fa-var-chevron-circle-right: "\f138"; @fa-var-chevron-circle-up: "\f139"; @fa-var-chevron-down: "\f078"; @fa-var-chevron-left: "\f053"; @fa-var-chevron-right: "\f054"; @fa-var-chevron-up: "\f077"; @fa-var-child: "\f1ae"; @fa-var-chrome: "\f268"; @fa-var-circle: "\f111"; @fa-var-circle-o: "\f10c"; @fa-var-circle-o-notch: "\f1ce"; @fa-var-circle-thin: "\f1db"; @fa-var-clipboard: "\f0ea"; @fa-var-clock-o: "\f017"; @fa-var-clone: "\f24d"; @fa-var-close: "\f00d"; @fa-var-cloud: "\f0c2"; @fa-var-cloud-download: "\f0ed"; @fa-var-cloud-upload: "\f0ee"; @fa-var-cny: "\f157"; @fa-var-code: "\f121"; @fa-var-code-fork: "\f126"; @fa-var-codepen: "\f1cb"; @fa-var-codiepie: "\f284"; @fa-var-coffee: "\f0f4"; @fa-var-cog: "\f013"; @fa-var-cogs: "\f085"; @fa-var-columns: "\f0db"; @fa-var-comment: "\f075"; @fa-var-comment-o: "\f0e5"; @fa-var-commenting: "\f27a"; @fa-var-commenting-o: "\f27b"; @fa-var-comments: "\f086"; @fa-var-comments-o: "\f0e6"; @fa-var-compass: "\f14e"; @fa-var-compress: "\f066"; @fa-var-connectdevelop: "\f20e"; @fa-var-contao: "\f26d"; @fa-var-copy: "\f0c5"; @fa-var-copyright: "\f1f9"; @fa-var-creative-commons: "\f25e"; @fa-var-credit-card: "\f09d"; @fa-var-credit-card-alt: "\f283"; @fa-var-crop: "\f125"; @fa-var-crosshairs: "\f05b"; @fa-var-css3: "\f13c"; @fa-var-cube: "\f1b2"; @fa-var-cubes: "\f1b3"; @fa-var-cut: "\f0c4"; @fa-var-cutlery: "\f0f5"; @fa-var-dashboard: "\f0e4"; @fa-var-dashcube: "\f210"; @fa-var-database: "\f1c0"; @fa-var-deaf: "\f2a4"; @fa-var-deafness: "\f2a4"; @fa-var-dedent: "\f03b"; @fa-var-delicious: "\f1a5"; @fa-var-desktop: "\f108"; @fa-var-deviantart: "\f1bd"; @fa-var-diamond: "\f219"; @fa-var-digg: "\f1a6"; @fa-var-dollar: "\f155"; @fa-var-dot-circle-o: "\f192"; @fa-var-download: "\f019"; @fa-var-dribbble: "\f17d"; @fa-var-dropbox: "\f16b"; @fa-var-drupal: "\f1a9"; @fa-var-edge: "\f282"; @fa-var-edit: "\f044"; @fa-var-eject: "\f052"; @fa-var-ellipsis-h: "\f141"; @fa-var-ellipsis-v: "\f142"; @fa-var-empire: "\f1d1"; @fa-var-envelope: "\f0e0"; @fa-var-envelope-o: "\f003"; @fa-var-envelope-square: "\f199"; @fa-var-envira: "\f299"; @fa-var-eraser: "\f12d"; @fa-var-eur: "\f153"; @fa-var-euro: "\f153"; @fa-var-exchange: "\f0ec"; @fa-var-exclamation: "\f12a"; @fa-var-exclamation-circle: "\f06a"; @fa-var-exclamation-triangle: "\f071"; @fa-var-expand: "\f065"; @fa-var-expeditedssl: "\f23e"; @fa-var-external-link: "\f08e"; @fa-var-external-link-square: "\f14c"; @fa-var-eye: "\f06e"; @fa-var-eye-slash: "\f070"; @fa-var-eyedropper: "\f1fb"; @fa-var-fa: "\f2b4"; @fa-var-facebook: "\f09a"; @fa-var-facebook-f: "\f09a"; @fa-var-facebook-official: "\f230"; @fa-var-facebook-square: "\f082"; @fa-var-fast-backward: "\f049"; @fa-var-fast-forward: "\f050"; @fa-var-fax: "\f1ac"; @fa-var-feed: "\f09e"; @fa-var-female: "\f182"; @fa-var-fighter-jet: "\f0fb"; @fa-var-file: "\f15b"; @fa-var-file-archive-o: "\f1c6"; @fa-var-file-audio-o: "\f1c7"; @fa-var-file-code-o: "\f1c9"; @fa-var-file-excel-o: "\f1c3"; @fa-var-file-image-o: "\f1c5"; @fa-var-file-movie-o: "\f1c8"; @fa-var-file-o: "\f016"; @fa-var-file-pdf-o: "\f1c1"; @fa-var-file-photo-o: "\f1c5"; @fa-var-file-picture-o: "\f1c5"; @fa-var-file-powerpoint-o: "\f1c4"; @fa-var-file-sound-o: "\f1c7"; @fa-var-file-text: "\f15c"; @fa-var-file-text-o: "\f0f6"; @fa-var-file-video-o: "\f1c8"; @fa-var-file-word-o: "\f1c2"; @fa-var-file-zip-o: "\f1c6"; @fa-var-files-o: "\f0c5"; @fa-var-film: "\f008"; @fa-var-filter: "\f0b0"; @fa-var-fire: "\f06d"; @fa-var-fire-extinguisher: "\f134"; @fa-var-firefox: "\f269"; @fa-var-first-order: "\f2b0"; @fa-var-flag: "\f024"; @fa-var-flag-checkered: "\f11e"; @fa-var-flag-o: "\f11d"; @fa-var-flash: "\f0e7"; @fa-var-flask: "\f0c3"; @fa-var-flickr: "\f16e"; @fa-var-floppy-o: "\f0c7"; @fa-var-folder: "\f07b"; @fa-var-folder-o: "\f114"; @fa-var-folder-open: "\f07c"; @fa-var-folder-open-o: "\f115"; @fa-var-font: "\f031"; @fa-var-font-awesome: "\f2b4"; @fa-var-fonticons: "\f280"; @fa-var-fort-awesome: "\f286"; @fa-var-forumbee: "\f211"; @fa-var-forward: "\f04e"; @fa-var-foursquare: "\f180"; @fa-var-frown-o: "\f119"; @fa-var-futbol-o: "\f1e3"; @fa-var-gamepad: "\f11b"; @fa-var-gavel: "\f0e3"; @fa-var-gbp: "\f154"; @fa-var-ge: "\f1d1"; @fa-var-gear: "\f013"; @fa-var-gears: "\f085"; @fa-var-genderless: "\f22d"; @fa-var-get-pocket: "\f265"; @fa-var-gg: "\f260"; @fa-var-gg-circle: "\f261"; @fa-var-gift: "\f06b"; @fa-var-git: "\f1d3"; @fa-var-git-square: "\f1d2"; @fa-var-github: "\f09b"; @fa-var-github-alt: "\f113"; @fa-var-github-square: "\f092"; @fa-var-gitlab: "\f296"; @fa-var-gittip: "\f184"; @fa-var-glass: "\f000"; @fa-var-glide: "\f2a5"; @fa-var-glide-g: "\f2a6"; @fa-var-globe: "\f0ac"; @fa-var-google: "\f1a0"; @fa-var-google-plus: "\f0d5"; @fa-var-google-plus-circle: "\f2b3"; @fa-var-google-plus-official: "\f2b3"; @fa-var-google-plus-square: "\f0d4"; @fa-var-google-wallet: "\f1ee"; @fa-var-graduation-cap: "\f19d"; @fa-var-gratipay: "\f184"; @fa-var-group: "\f0c0"; @fa-var-h-square: "\f0fd"; @fa-var-hacker-news: "\f1d4"; @fa-var-hand-grab-o: "\f255"; @fa-var-hand-lizard-o: "\f258"; @fa-var-hand-o-down: "\f0a7"; @fa-var-hand-o-left: "\f0a5"; @fa-var-hand-o-right: "\f0a4"; @fa-var-hand-o-up: "\f0a6"; @fa-var-hand-paper-o: "\f256"; @fa-var-hand-peace-o: "\f25b"; @fa-var-hand-pointer-o: "\f25a"; @fa-var-hand-rock-o: "\f255"; @fa-var-hand-scissors-o: "\f257"; @fa-var-hand-spock-o: "\f259"; @fa-var-hand-stop-o: "\f256"; @fa-var-hard-of-hearing: "\f2a4"; @fa-var-hashtag: "\f292"; @fa-var-hdd-o: "\f0a0"; @fa-var-header: "\f1dc"; @fa-var-headphones: "\f025"; @fa-var-heart: "\f004"; @fa-var-heart-o: "\f08a"; @fa-var-heartbeat: "\f21e"; @fa-var-history: "\f1da"; @fa-var-home: "\f015"; @fa-var-hospital-o: "\f0f8"; @fa-var-hotel: "\f236"; @fa-var-hourglass: "\f254"; @fa-var-hourglass-1: "\f251"; @fa-var-hourglass-2: "\f252"; @fa-var-hourglass-3: "\f253"; @fa-var-hourglass-end: "\f253"; @fa-var-hourglass-half: "\f252"; @fa-var-hourglass-o: "\f250"; @fa-var-hourglass-start: "\f251"; @fa-var-houzz: "\f27c"; @fa-var-html5: "\f13b"; @fa-var-i-cursor: "\f246"; @fa-var-ils: "\f20b"; @fa-var-image: "\f03e"; @fa-var-inbox: "\f01c"; @fa-var-indent: "\f03c"; @fa-var-industry: "\f275"; @fa-var-info: "\f129"; @fa-var-info-circle: "\f05a"; @fa-var-inr: "\f156"; @fa-var-instagram: "\f16d"; @fa-var-institution: "\f19c"; @fa-var-internet-explorer: "\f26b"; @fa-var-intersex: "\f224"; @fa-var-ioxhost: "\f208"; @fa-var-italic: "\f033"; @fa-var-joomla: "\f1aa"; @fa-var-jpy: "\f157"; @fa-var-jsfiddle: "\f1cc"; @fa-var-key: "\f084"; @fa-var-keyboard-o: "\f11c"; @fa-var-krw: "\f159"; @fa-var-language: "\f1ab"; @fa-var-laptop: "\f109"; @fa-var-lastfm: "\f202"; @fa-var-lastfm-square: "\f203"; @fa-var-leaf: "\f06c"; @fa-var-leanpub: "\f212"; @fa-var-legal: "\f0e3"; @fa-var-lemon-o: "\f094"; @fa-var-level-down: "\f149"; @fa-var-level-up: "\f148"; @fa-var-life-bouy: "\f1cd"; @fa-var-life-buoy: "\f1cd"; @fa-var-life-ring: "\f1cd"; @fa-var-life-saver: "\f1cd"; @fa-var-lightbulb-o: "\f0eb"; @fa-var-line-chart: "\f201"; @fa-var-link: "\f0c1"; @fa-var-linkedin: "\f0e1"; @fa-var-linkedin-square: "\f08c"; @fa-var-linux: "\f17c"; @fa-var-list: "\f03a"; @fa-var-list-alt: "\f022"; @fa-var-list-ol: "\f0cb"; @fa-var-list-ul: "\f0ca"; @fa-var-location-arrow: "\f124"; @fa-var-lock: "\f023"; @fa-var-long-arrow-down: "\f175"; @fa-var-long-arrow-left: "\f177"; @fa-var-long-arrow-right: "\f178"; @fa-var-long-arrow-up: "\f176"; @fa-var-low-vision: "\f2a8"; @fa-var-magic: "\f0d0"; @fa-var-magnet: "\f076"; @fa-var-mail-forward: "\f064"; @fa-var-mail-reply: "\f112"; @fa-var-mail-reply-all: "\f122"; @fa-var-male: "\f183"; @fa-var-map: "\f279"; @fa-var-map-marker: "\f041"; @fa-var-map-o: "\f278"; @fa-var-map-pin: "\f276"; @fa-var-map-signs: "\f277"; @fa-var-mars: "\f222"; @fa-var-mars-double: "\f227"; @fa-var-mars-stroke: "\f229"; @fa-var-mars-stroke-h: "\f22b"; @fa-var-mars-stroke-v: "\f22a"; @fa-var-maxcdn: "\f136"; @fa-var-meanpath: "\f20c"; @fa-var-medium: "\f23a"; @fa-var-medkit: "\f0fa"; @fa-var-meh-o: "\f11a"; @fa-var-mercury: "\f223"; @fa-var-microphone: "\f130"; @fa-var-microphone-slash: "\f131"; @fa-var-minus: "\f068"; @fa-var-minus-circle: "\f056"; @fa-var-minus-square: "\f146"; @fa-var-minus-square-o: "\f147"; @fa-var-mixcloud: "\f289"; @fa-var-mobile: "\f10b"; @fa-var-mobile-phone: "\f10b"; @fa-var-modx: "\f285"; @fa-var-money: "\f0d6"; @fa-var-moon-o: "\f186"; @fa-var-mortar-board: "\f19d"; @fa-var-motorcycle: "\f21c"; @fa-var-mouse-pointer: "\f245"; @fa-var-music: "\f001"; @fa-var-navicon: "\f0c9"; @fa-var-neuter: "\f22c"; @fa-var-newspaper-o: "\f1ea"; @fa-var-object-group: "\f247"; @fa-var-object-ungroup: "\f248"; @fa-var-odnoklassniki: "\f263"; @fa-var-odnoklassniki-square: "\f264"; @fa-var-opencart: "\f23d"; @fa-var-openid: "\f19b"; @fa-var-opera: "\f26a"; @fa-var-optin-monster: "\f23c"; @fa-var-outdent: "\f03b"; @fa-var-pagelines: "\f18c"; @fa-var-paint-brush: "\f1fc"; @fa-var-paper-plane: "\f1d8"; @fa-var-paper-plane-o: "\f1d9"; @fa-var-paperclip: "\f0c6"; @fa-var-paragraph: "\f1dd"; @fa-var-paste: "\f0ea"; @fa-var-pause: "\f04c"; @fa-var-pause-circle: "\f28b"; @fa-var-pause-circle-o: "\f28c"; @fa-var-paw: "\f1b0"; @fa-var-paypal: "\f1ed"; @fa-var-pencil: "\f040"; @fa-var-pencil-square: "\f14b"; @fa-var-pencil-square-o: "\f044"; @fa-var-percent: "\f295"; @fa-var-phone: "\f095"; @fa-var-phone-square: "\f098"; @fa-var-photo: "\f03e"; @fa-var-picture-o: "\f03e"; @fa-var-pie-chart: "\f200"; @fa-var-pied-piper: "\f2ae"; @fa-var-pied-piper-alt: "\f1a8"; @fa-var-pied-piper-pp: "\f1a7"; @fa-var-pinterest: "\f0d2"; @fa-var-pinterest-p: "\f231"; @fa-var-pinterest-square: "\f0d3"; @fa-var-plane: "\f072"; @fa-var-play: "\f04b"; @fa-var-play-circle: "\f144"; @fa-var-play-circle-o: "\f01d"; @fa-var-plug: "\f1e6"; @fa-var-plus: "\f067"; @fa-var-plus-circle: "\f055"; @fa-var-plus-square: "\f0fe"; @fa-var-plus-square-o: "\f196"; @fa-var-power-off: "\f011"; @fa-var-print: "\f02f"; @fa-var-product-hunt: "\f288"; @fa-var-puzzle-piece: "\f12e"; @fa-var-qq: "\f1d6"; @fa-var-qrcode: "\f029"; @fa-var-question: "\f128"; @fa-var-question-circle: "\f059"; @fa-var-question-circle-o: "\f29c"; @fa-var-quote-left: "\f10d"; @fa-var-quote-right: "\f10e"; @fa-var-ra: "\f1d0"; @fa-var-random: "\f074"; @fa-var-rebel: "\f1d0"; @fa-var-recycle: "\f1b8"; @fa-var-reddit: "\f1a1"; @fa-var-reddit-alien: "\f281"; @fa-var-reddit-square: "\f1a2"; @fa-var-refresh: "\f021"; @fa-var-registered: "\f25d"; @fa-var-remove: "\f00d"; @fa-var-renren: "\f18b"; @fa-var-reorder: "\f0c9"; @fa-var-repeat: "\f01e"; @fa-var-reply: "\f112"; @fa-var-reply-all: "\f122"; @fa-var-resistance: "\f1d0"; @fa-var-retweet: "\f079"; @fa-var-rmb: "\f157"; @fa-var-road: "\f018"; @fa-var-rocket: "\f135"; @fa-var-rotate-left: "\f0e2"; @fa-var-rotate-right: "\f01e"; @fa-var-rouble: "\f158"; @fa-var-rss: "\f09e"; @fa-var-rss-square: "\f143"; @fa-var-rub: "\f158"; @fa-var-ruble: "\f158"; @fa-var-rupee: "\f156"; @fa-var-safari: "\f267"; @fa-var-save: "\f0c7"; @fa-var-scissors: "\f0c4"; @fa-var-scribd: "\f28a"; @fa-var-search: "\f002"; @fa-var-search-minus: "\f010"; @fa-var-search-plus: "\f00e"; @fa-var-sellsy: "\f213"; @fa-var-send: "\f1d8"; @fa-var-send-o: "\f1d9"; @fa-var-server: "\f233"; @fa-var-share: "\f064"; @fa-var-share-alt: "\f1e0"; @fa-var-share-alt-square: "\f1e1"; @fa-var-share-square: "\f14d"; @fa-var-share-square-o: "\f045"; @fa-var-shekel: "\f20b"; @fa-var-sheqel: "\f20b"; @fa-var-shield: "\f132"; @fa-var-ship: "\f21a"; @fa-var-shirtsinbulk: "\f214"; @fa-var-shopping-bag: "\f290"; @fa-var-shopping-basket: "\f291"; @fa-var-shopping-cart: "\f07a"; @fa-var-sign-in: "\f090"; @fa-var-sign-language: "\f2a7"; @fa-var-sign-out: "\f08b"; @fa-var-signal: "\f012"; @fa-var-signing: "\f2a7"; @fa-var-simplybuilt: "\f215"; @fa-var-sitemap: "\f0e8"; @fa-var-skyatlas: "\f216"; @fa-var-skype: "\f17e"; @fa-var-slack: "\f198"; @fa-var-sliders: "\f1de"; @fa-var-slideshare: "\f1e7"; @fa-var-smile-o: "\f118"; @fa-var-snapchat: "\f2ab"; @fa-var-snapchat-ghost: "\f2ac"; @fa-var-snapchat-square: "\f2ad"; @fa-var-soccer-ball-o: "\f1e3"; @fa-var-sort: "\f0dc"; @fa-var-sort-alpha-asc: "\f15d"; @fa-var-sort-alpha-desc: "\f15e"; @fa-var-sort-amount-asc: "\f160"; @fa-var-sort-amount-desc: "\f161"; @fa-var-sort-asc: "\f0de"; @fa-var-sort-desc: "\f0dd"; @fa-var-sort-down: "\f0dd"; @fa-var-sort-numeric-asc: "\f162"; @fa-var-sort-numeric-desc: "\f163"; @fa-var-sort-up: "\f0de"; @fa-var-soundcloud: "\f1be"; @fa-var-space-shuttle: "\f197"; @fa-var-spinner: "\f110"; @fa-var-spoon: "\f1b1"; @fa-var-spotify: "\f1bc"; @fa-var-square: "\f0c8"; @fa-var-square-o: "\f096"; @fa-var-stack-exchange: "\f18d"; @fa-var-stack-overflow: "\f16c"; @fa-var-star: "\f005"; @fa-var-star-half: "\f089"; @fa-var-star-half-empty: "\f123"; @fa-var-star-half-full: "\f123"; @fa-var-star-half-o: "\f123"; @fa-var-star-o: "\f006"; @fa-var-steam: "\f1b6"; @fa-var-steam-square: "\f1b7"; @fa-var-step-backward: "\f048"; @fa-var-step-forward: "\f051"; @fa-var-stethoscope: "\f0f1"; @fa-var-sticky-note: "\f249"; @fa-var-sticky-note-o: "\f24a"; @fa-var-stop: "\f04d"; @fa-var-stop-circle: "\f28d"; @fa-var-stop-circle-o: "\f28e"; @fa-var-street-view: "\f21d"; @fa-var-strikethrough: "\f0cc"; @fa-var-stumbleupon: "\f1a4"; @fa-var-stumbleupon-circle: "\f1a3"; @fa-var-subscript: "\f12c"; @fa-var-subway: "\f239"; @fa-var-suitcase: "\f0f2"; @fa-var-sun-o: "\f185"; @fa-var-superscript: "\f12b"; @fa-var-support: "\f1cd"; @fa-var-table: "\f0ce"; @fa-var-tablet: "\f10a"; @fa-var-tachometer: "\f0e4"; @fa-var-tag: "\f02b"; @fa-var-tags: "\f02c"; @fa-var-tasks: "\f0ae"; @fa-var-taxi: "\f1ba"; @fa-var-television: "\f26c"; @fa-var-tencent-weibo: "\f1d5"; @fa-var-terminal: "\f120"; @fa-var-text-height: "\f034"; @fa-var-text-width: "\f035"; @fa-var-th: "\f00a"; @fa-var-th-large: "\f009"; @fa-var-th-list: "\f00b"; @fa-var-themeisle: "\f2b2"; @fa-var-thumb-tack: "\f08d"; @fa-var-thumbs-down: "\f165"; @fa-var-thumbs-o-down: "\f088"; @fa-var-thumbs-o-up: "\f087"; @fa-var-thumbs-up: "\f164"; @fa-var-ticket: "\f145"; @fa-var-times: "\f00d"; @fa-var-times-circle: "\f057"; @fa-var-times-circle-o: "\f05c"; @fa-var-tint: "\f043"; @fa-var-toggle-down: "\f150"; @fa-var-toggle-left: "\f191"; @fa-var-toggle-off: "\f204"; @fa-var-toggle-on: "\f205"; @fa-var-toggle-right: "\f152"; @fa-var-toggle-up: "\f151"; @fa-var-trademark: "\f25c"; @fa-var-train: "\f238"; @fa-var-transgender: "\f224"; @fa-var-transgender-alt: "\f225"; @fa-var-trash: "\f1f8"; @fa-var-trash-o: "\f014"; @fa-var-tree: "\f1bb"; @fa-var-trello: "\f181"; @fa-var-tripadvisor: "\f262"; @fa-var-trophy: "\f091"; @fa-var-truck: "\f0d1"; @fa-var-try: "\f195"; @fa-var-tty: "\f1e4"; @fa-var-tumblr: "\f173"; @fa-var-tumblr-square: "\f174"; @fa-var-turkish-lira: "\f195"; @fa-var-tv: "\f26c"; @fa-var-twitch: "\f1e8"; @fa-var-twitter: "\f099"; @fa-var-twitter-square: "\f081"; @fa-var-umbrella: "\f0e9"; @fa-var-underline: "\f0cd"; @fa-var-undo: "\f0e2"; @fa-var-universal-access: "\f29a"; @fa-var-university: "\f19c"; @fa-var-unlink: "\f127"; @fa-var-unlock: "\f09c"; @fa-var-unlock-alt: "\f13e"; @fa-var-unsorted: "\f0dc"; @fa-var-upload: "\f093"; @fa-var-usb: "\f287"; @fa-var-usd: "\f155"; @fa-var-user: "\f007"; @fa-var-user-md: "\f0f0"; @fa-var-user-plus: "\f234"; @fa-var-user-secret: "\f21b"; @fa-var-user-times: "\f235"; @fa-var-users: "\f0c0"; @fa-var-venus: "\f221"; @fa-var-venus-double: "\f226"; @fa-var-venus-mars: "\f228"; @fa-var-viacoin: "\f237"; @fa-var-viadeo: "\f2a9"; @fa-var-viadeo-square: "\f2aa"; @fa-var-video-camera: "\f03d"; @fa-var-vimeo: "\f27d"; @fa-var-vimeo-square: "\f194"; @fa-var-vine: "\f1ca"; @fa-var-vk: "\f189"; @fa-var-volume-control-phone: "\f2a0"; @fa-var-volume-down: "\f027"; @fa-var-volume-off: "\f026"; @fa-var-volume-up: "\f028"; @fa-var-warning: "\f071"; @fa-var-wechat: "\f1d7"; @fa-var-weibo: "\f18a"; @fa-var-weixin: "\f1d7"; @fa-var-whatsapp: "\f232"; @fa-var-wheelchair: "\f193"; @fa-var-wheelchair-alt: "\f29b"; @fa-var-wifi: "\f1eb"; @fa-var-wikipedia-w: "\f266"; @fa-var-windows: "\f17a"; @fa-var-won: "\f159"; @fa-var-wordpress: "\f19a"; @fa-var-wpbeginner: "\f297"; @fa-var-wpforms: "\f298"; @fa-var-wrench: "\f0ad"; @fa-var-xing: "\f168"; @fa-var-xing-square: "\f169"; @fa-var-y-combinator: "\f23b"; @fa-var-y-combinator-square: "\f1d4"; @fa-var-yahoo: "\f19e"; @fa-var-yc: "\f23b"; @fa-var-yc-square: "\f1d4"; @fa-var-yelp: "\f1e9"; @fa-var-yen: "\f157"; @fa-var-yoast: "\f2b1"; @fa-var-youtube: "\f167"; @fa-var-youtube-play: "\f16a"; @fa-var-youtube-square: "\f166"; ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_animated.scss ================================================ // Spinning Icons // -------------------------- .#{$fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .#{$fa-css-prefix}-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-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); } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_bordered-pulled.scss ================================================ // Bordered & Pulled // ------------------------- .#{$fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em $fa-border-color; border-radius: .1em; } .#{$fa-css-prefix}-pull-left { float: left; } .#{$fa-css-prefix}-pull-right { float: right; } .#{$fa-css-prefix} { &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .#{$fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_core.scss ================================================ // Base Class Definition // ------------------------- .#{$fa-css-prefix} { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_fixed-width.scss ================================================ // Fixed Width Icons // ------------------------- .#{$fa-css-prefix}-fw { width: (18em / 14); text-align: center; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_icons.scss ================================================ /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } .#{$fa-css-prefix}-music:before { content: $fa-var-music; } .#{$fa-css-prefix}-search:before { content: $fa-var-search; } .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } .#{$fa-css-prefix}-star:before { content: $fa-var-star; } .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } .#{$fa-css-prefix}-user:before { content: $fa-var-user; } .#{$fa-css-prefix}-film:before { content: $fa-var-film; } .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } .#{$fa-css-prefix}-th:before { content: $fa-var-th; } .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } .#{$fa-css-prefix}-check:before { content: $fa-var-check; } .#{$fa-css-prefix}-remove:before, .#{$fa-css-prefix}-close:before, .#{$fa-css-prefix}-times:before { content: $fa-var-times; } .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } .#{$fa-css-prefix}-gear:before, .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } .#{$fa-css-prefix}-home:before { content: $fa-var-home; } .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } .#{$fa-css-prefix}-road:before { content: $fa-var-road; } .#{$fa-css-prefix}-download:before { content: $fa-var-download; } .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } .#{$fa-css-prefix}-rotate-right:before, .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } .#{$fa-css-prefix}-book:before { content: $fa-var-book; } .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } .#{$fa-css-prefix}-print:before { content: $fa-var-print; } .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } .#{$fa-css-prefix}-font:before { content: $fa-var-font; } .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } .#{$fa-css-prefix}-list:before { content: $fa-var-list; } .#{$fa-css-prefix}-dedent:before, .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } .#{$fa-css-prefix}-photo:before, .#{$fa-css-prefix}-image:before, .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } .#{$fa-css-prefix}-edit:before, .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } .#{$fa-css-prefix}-play:before { content: $fa-var-play; } .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } .#{$fa-css-prefix}-mail-forward:before, .#{$fa-css-prefix}-share:before { content: $fa-var-share; } .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } .#{$fa-css-prefix}-warning:before, .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } .#{$fa-css-prefix}-random:before { content: $fa-var-random; } .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } .#{$fa-css-prefix}-bar-chart-o:before, .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } .#{$fa-css-prefix}-key:before { content: $fa-var-key; } .#{$fa-css-prefix}-gears:before, .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } .#{$fa-css-prefix}-facebook-f:before, .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } .#{$fa-css-prefix}-github:before { content: $fa-var-github; } .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } .#{$fa-css-prefix}-feed:before, .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } .#{$fa-css-prefix}-group:before, .#{$fa-css-prefix}-users:before { content: $fa-var-users; } .#{$fa-css-prefix}-chain:before, .#{$fa-css-prefix}-link:before { content: $fa-var-link; } .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } .#{$fa-css-prefix}-cut:before, .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } .#{$fa-css-prefix}-copy:before, .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } .#{$fa-css-prefix}-save:before, .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } .#{$fa-css-prefix}-square:before { content: $fa-var-square; } .#{$fa-css-prefix}-navicon:before, .#{$fa-css-prefix}-reorder:before, .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } .#{$fa-css-prefix}-table:before { content: $fa-var-table; } .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } .#{$fa-css-prefix}-money:before { content: $fa-var-money; } .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } .#{$fa-css-prefix}-unsorted:before, .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } .#{$fa-css-prefix}-sort-down:before, .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } .#{$fa-css-prefix}-sort-up:before, .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } .#{$fa-css-prefix}-rotate-left:before, .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } .#{$fa-css-prefix}-legal:before, .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } .#{$fa-css-prefix}-dashboard:before, .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } .#{$fa-css-prefix}-flash:before, .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } .#{$fa-css-prefix}-paste:before, .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } .#{$fa-css-prefix}-mobile-phone:before, .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } .#{$fa-css-prefix}-mail-reply:before, .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } .#{$fa-css-prefix}-code:before { content: $fa-var-code; } .#{$fa-css-prefix}-mail-reply-all:before, .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } .#{$fa-css-prefix}-star-half-empty:before, .#{$fa-css-prefix}-star-half-full:before, .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } .#{$fa-css-prefix}-unlink:before, .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } .#{$fa-css-prefix}-question:before { content: $fa-var-question; } .#{$fa-css-prefix}-info:before { content: $fa-var-info; } .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } .#{$fa-css-prefix}-toggle-down:before, .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } .#{$fa-css-prefix}-toggle-up:before, .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } .#{$fa-css-prefix}-toggle-right:before, .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } .#{$fa-css-prefix}-euro:before, .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } .#{$fa-css-prefix}-dollar:before, .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } .#{$fa-css-prefix}-rupee:before, .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } .#{$fa-css-prefix}-cny:before, .#{$fa-css-prefix}-rmb:before, .#{$fa-css-prefix}-yen:before, .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } .#{$fa-css-prefix}-ruble:before, .#{$fa-css-prefix}-rouble:before, .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } .#{$fa-css-prefix}-won:before, .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } .#{$fa-css-prefix}-bitcoin:before, .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } .#{$fa-css-prefix}-file:before { content: $fa-var-file; } .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } .#{$fa-css-prefix}-android:before { content: $fa-var-android; } .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } .#{$fa-css-prefix}-female:before { content: $fa-var-female; } .#{$fa-css-prefix}-male:before { content: $fa-var-male; } .#{$fa-css-prefix}-gittip:before, .#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } .#{$fa-css-prefix}-toggle-left:before, .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } .#{$fa-css-prefix}-turkish-lira:before, .#{$fa-css-prefix}-try:before { content: $fa-var-try; } .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } .#{$fa-css-prefix}-institution:before, .#{$fa-css-prefix}-bank:before, .#{$fa-css-prefix}-university:before { content: $fa-var-university; } .#{$fa-css-prefix}-mortar-board:before, .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } .#{$fa-css-prefix}-google:before { content: $fa-var-google; } .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } .#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } .#{$fa-css-prefix}-language:before { content: $fa-var-language; } .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } .#{$fa-css-prefix}-building:before { content: $fa-var-building; } .#{$fa-css-prefix}-child:before { content: $fa-var-child; } .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } .#{$fa-css-prefix}-automobile:before, .#{$fa-css-prefix}-car:before { content: $fa-var-car; } .#{$fa-css-prefix}-cab:before, .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } .#{$fa-css-prefix}-database:before { content: $fa-var-database; } .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } .#{$fa-css-prefix}-file-photo-o:before, .#{$fa-css-prefix}-file-picture-o:before, .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } .#{$fa-css-prefix}-file-zip-o:before, .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } .#{$fa-css-prefix}-file-sound-o:before, .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } .#{$fa-css-prefix}-file-movie-o:before, .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } .#{$fa-css-prefix}-life-bouy:before, .#{$fa-css-prefix}-life-buoy:before, .#{$fa-css-prefix}-life-saver:before, .#{$fa-css-prefix}-support:before, .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } .#{$fa-css-prefix}-ra:before, .#{$fa-css-prefix}-resistance:before, .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } .#{$fa-css-prefix}-ge:before, .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } .#{$fa-css-prefix}-git:before { content: $fa-var-git; } .#{$fa-css-prefix}-y-combinator-square:before, .#{$fa-css-prefix}-yc-square:before, .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } .#{$fa-css-prefix}-wechat:before, .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } .#{$fa-css-prefix}-send:before, .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } .#{$fa-css-prefix}-send-o:before, .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } .#{$fa-css-prefix}-history:before { content: $fa-var-history; } .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } .#{$fa-css-prefix}-header:before { content: $fa-var-header; } .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } .#{$fa-css-prefix}-soccer-ball-o:before, .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } .#{$fa-css-prefix}-at:before { content: $fa-var-at; } .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } .#{$fa-css-prefix}-shekel:before, .#{$fa-css-prefix}-sheqel:before, .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } .#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } .#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } .#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } .#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } .#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } .#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } .#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } .#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } .#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } .#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } .#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } .#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } .#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } .#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } .#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } .#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } .#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } .#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } .#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } .#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } .#{$fa-css-prefix}-intersex:before, .#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } .#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } .#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } .#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } .#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } .#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } .#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } .#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } .#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } .#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } .#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } .#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } .#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } .#{$fa-css-prefix}-server:before { content: $fa-var-server; } .#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } .#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } .#{$fa-css-prefix}-hotel:before, .#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } .#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } .#{$fa-css-prefix}-train:before { content: $fa-var-train; } .#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } .#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } .#{$fa-css-prefix}-yc:before, .#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } .#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } .#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } .#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } .#{$fa-css-prefix}-battery-4:before, .#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } .#{$fa-css-prefix}-battery-3:before, .#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } .#{$fa-css-prefix}-battery-2:before, .#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } .#{$fa-css-prefix}-battery-1:before, .#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } .#{$fa-css-prefix}-battery-0:before, .#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } .#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } .#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } .#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } .#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } .#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } .#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } .#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } .#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } .#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } .#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } .#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } .#{$fa-css-prefix}-hourglass-1:before, .#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } .#{$fa-css-prefix}-hourglass-2:before, .#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } .#{$fa-css-prefix}-hourglass-3:before, .#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } .#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } .#{$fa-css-prefix}-hand-grab-o:before, .#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } .#{$fa-css-prefix}-hand-stop-o:before, .#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } .#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } .#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } .#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } .#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } .#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } .#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } .#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } .#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } .#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } .#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } .#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } .#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } .#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } .#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } .#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } .#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } .#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } .#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } .#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } .#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } .#{$fa-css-prefix}-tv:before, .#{$fa-css-prefix}-television:before { content: $fa-var-television; } .#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } .#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } .#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } .#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } .#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } .#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } .#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } .#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } .#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } .#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } .#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } .#{$fa-css-prefix}-map:before { content: $fa-var-map; } .#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } .#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } .#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } .#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } .#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } .#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } .#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } .#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } .#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } .#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } .#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } .#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } .#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } .#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } .#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } .#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } .#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } .#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } .#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } .#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } .#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } .#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } .#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } .#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } .#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } .#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } .#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } .#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } .#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } .#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } .#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } .#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } .#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } .#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } .#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } .#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } .#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } .#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } .#{$fa-css-prefix}-asl-interpreting:before, .#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } .#{$fa-css-prefix}-deafness:before, .#{$fa-css-prefix}-hard-of-hearing:before, .#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } .#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } .#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } .#{$fa-css-prefix}-signing:before, .#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } .#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } .#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } .#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } .#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } .#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } .#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } .#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } .#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } .#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } .#{$fa-css-prefix}-google-plus-circle:before, .#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } .#{$fa-css-prefix}-fa:before, .#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_larger.scss ================================================ // Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .#{$fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .#{$fa-css-prefix}-2x { font-size: 2em; } .#{$fa-css-prefix}-3x { font-size: 3em; } .#{$fa-css-prefix}-4x { font-size: 4em; } .#{$fa-css-prefix}-5x { font-size: 5em; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_list.scss ================================================ // List Icons // ------------------------- .#{$fa-css-prefix}-ul { padding-left: 0; margin-left: $fa-li-width; list-style-type: none; > li { position: relative; } } .#{$fa-css-prefix}-li { position: absolute; left: -$fa-li-width; width: $fa-li-width; top: (2em / 14); text-align: center; &.#{$fa-css-prefix}-lg { left: -$fa-li-width + (4em / 14); } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_mixins.scss ================================================ // Mixins // -------------------------- @mixin fa-icon() { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @mixin fa-icon-rotate($degrees, $rotation) { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; -webkit-transform: rotate($degrees); -ms-transform: rotate($degrees); transform: rotate($degrees); } @mixin fa-icon-flip($horiz, $vert, $rotation) { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; -webkit-transform: scale($horiz, $vert); -ms-transform: scale($horiz, $vert); transform: scale($horiz, $vert); } // Only display content to screen readers. A la Bootstrap 4. // // See: http://a11yproject.com/posts/how-to-hide-content/ @mixin sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; } // Use in conjunction with .sr-only to only display content when it's focused. // // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 // // Credit: HTML5 Boilerplate @mixin sr-only-focusable { &:active, &:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_path.scss ================================================ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_rotated-flipped.scss ================================================ // Rotated & Flipped Icons // ------------------------- .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .#{$fa-css-prefix}-rotate-90, :root .#{$fa-css-prefix}-rotate-180, :root .#{$fa-css-prefix}-rotate-270, :root .#{$fa-css-prefix}-flip-horizontal, :root .#{$fa-css-prefix}-flip-vertical { filter: none; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_screen-reader.scss ================================================ // Screen Readers // ------------------------- .sr-only { @include sr-only(); } .sr-only-focusable { @include sr-only-focusable(); } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_stacked.scss ================================================ // Stacked Icons // ------------------------- .#{$fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .#{$fa-css-prefix}-stack-1x { line-height: inherit; } .#{$fa-css-prefix}-stack-2x { font-size: 2em; } .#{$fa-css-prefix}-inverse { color: $fa-inverse; } ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/_variables.scss ================================================ // Variables // -------------------------- $fa-font-path: "../fonts" !default; $fa-font-size-base: 14px !default; $fa-line-height-base: 1 !default; //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.6.3/fonts" !default; // for referencing Bootstrap CDN font files directly $fa-css-prefix: fa !default; $fa-version: "4.6.3" !default; $fa-border-color: #eee !default; $fa-inverse: #fff !default; $fa-li-width: (30em / 14) !default; $fa-var-500px: "\f26e"; $fa-var-adjust: "\f042"; $fa-var-adn: "\f170"; $fa-var-align-center: "\f037"; $fa-var-align-justify: "\f039"; $fa-var-align-left: "\f036"; $fa-var-align-right: "\f038"; $fa-var-amazon: "\f270"; $fa-var-ambulance: "\f0f9"; $fa-var-american-sign-language-interpreting: "\f2a3"; $fa-var-anchor: "\f13d"; $fa-var-android: "\f17b"; $fa-var-angellist: "\f209"; $fa-var-angle-double-down: "\f103"; $fa-var-angle-double-left: "\f100"; $fa-var-angle-double-right: "\f101"; $fa-var-angle-double-up: "\f102"; $fa-var-angle-down: "\f107"; $fa-var-angle-left: "\f104"; $fa-var-angle-right: "\f105"; $fa-var-angle-up: "\f106"; $fa-var-apple: "\f179"; $fa-var-archive: "\f187"; $fa-var-area-chart: "\f1fe"; $fa-var-arrow-circle-down: "\f0ab"; $fa-var-arrow-circle-left: "\f0a8"; $fa-var-arrow-circle-o-down: "\f01a"; $fa-var-arrow-circle-o-left: "\f190"; $fa-var-arrow-circle-o-right: "\f18e"; $fa-var-arrow-circle-o-up: "\f01b"; $fa-var-arrow-circle-right: "\f0a9"; $fa-var-arrow-circle-up: "\f0aa"; $fa-var-arrow-down: "\f063"; $fa-var-arrow-left: "\f060"; $fa-var-arrow-right: "\f061"; $fa-var-arrow-up: "\f062"; $fa-var-arrows: "\f047"; $fa-var-arrows-alt: "\f0b2"; $fa-var-arrows-h: "\f07e"; $fa-var-arrows-v: "\f07d"; $fa-var-asl-interpreting: "\f2a3"; $fa-var-assistive-listening-systems: "\f2a2"; $fa-var-asterisk: "\f069"; $fa-var-at: "\f1fa"; $fa-var-audio-description: "\f29e"; $fa-var-automobile: "\f1b9"; $fa-var-backward: "\f04a"; $fa-var-balance-scale: "\f24e"; $fa-var-ban: "\f05e"; $fa-var-bank: "\f19c"; $fa-var-bar-chart: "\f080"; $fa-var-bar-chart-o: "\f080"; $fa-var-barcode: "\f02a"; $fa-var-bars: "\f0c9"; $fa-var-battery-0: "\f244"; $fa-var-battery-1: "\f243"; $fa-var-battery-2: "\f242"; $fa-var-battery-3: "\f241"; $fa-var-battery-4: "\f240"; $fa-var-battery-empty: "\f244"; $fa-var-battery-full: "\f240"; $fa-var-battery-half: "\f242"; $fa-var-battery-quarter: "\f243"; $fa-var-battery-three-quarters: "\f241"; $fa-var-bed: "\f236"; $fa-var-beer: "\f0fc"; $fa-var-behance: "\f1b4"; $fa-var-behance-square: "\f1b5"; $fa-var-bell: "\f0f3"; $fa-var-bell-o: "\f0a2"; $fa-var-bell-slash: "\f1f6"; $fa-var-bell-slash-o: "\f1f7"; $fa-var-bicycle: "\f206"; $fa-var-binoculars: "\f1e5"; $fa-var-birthday-cake: "\f1fd"; $fa-var-bitbucket: "\f171"; $fa-var-bitbucket-square: "\f172"; $fa-var-bitcoin: "\f15a"; $fa-var-black-tie: "\f27e"; $fa-var-blind: "\f29d"; $fa-var-bluetooth: "\f293"; $fa-var-bluetooth-b: "\f294"; $fa-var-bold: "\f032"; $fa-var-bolt: "\f0e7"; $fa-var-bomb: "\f1e2"; $fa-var-book: "\f02d"; $fa-var-bookmark: "\f02e"; $fa-var-bookmark-o: "\f097"; $fa-var-braille: "\f2a1"; $fa-var-briefcase: "\f0b1"; $fa-var-btc: "\f15a"; $fa-var-bug: "\f188"; $fa-var-building: "\f1ad"; $fa-var-building-o: "\f0f7"; $fa-var-bullhorn: "\f0a1"; $fa-var-bullseye: "\f140"; $fa-var-bus: "\f207"; $fa-var-buysellads: "\f20d"; $fa-var-cab: "\f1ba"; $fa-var-calculator: "\f1ec"; $fa-var-calendar: "\f073"; $fa-var-calendar-check-o: "\f274"; $fa-var-calendar-minus-o: "\f272"; $fa-var-calendar-o: "\f133"; $fa-var-calendar-plus-o: "\f271"; $fa-var-calendar-times-o: "\f273"; $fa-var-camera: "\f030"; $fa-var-camera-retro: "\f083"; $fa-var-car: "\f1b9"; $fa-var-caret-down: "\f0d7"; $fa-var-caret-left: "\f0d9"; $fa-var-caret-right: "\f0da"; $fa-var-caret-square-o-down: "\f150"; $fa-var-caret-square-o-left: "\f191"; $fa-var-caret-square-o-right: "\f152"; $fa-var-caret-square-o-up: "\f151"; $fa-var-caret-up: "\f0d8"; $fa-var-cart-arrow-down: "\f218"; $fa-var-cart-plus: "\f217"; $fa-var-cc: "\f20a"; $fa-var-cc-amex: "\f1f3"; $fa-var-cc-diners-club: "\f24c"; $fa-var-cc-discover: "\f1f2"; $fa-var-cc-jcb: "\f24b"; $fa-var-cc-mastercard: "\f1f1"; $fa-var-cc-paypal: "\f1f4"; $fa-var-cc-stripe: "\f1f5"; $fa-var-cc-visa: "\f1f0"; $fa-var-certificate: "\f0a3"; $fa-var-chain: "\f0c1"; $fa-var-chain-broken: "\f127"; $fa-var-check: "\f00c"; $fa-var-check-circle: "\f058"; $fa-var-check-circle-o: "\f05d"; $fa-var-check-square: "\f14a"; $fa-var-check-square-o: "\f046"; $fa-var-chevron-circle-down: "\f13a"; $fa-var-chevron-circle-left: "\f137"; $fa-var-chevron-circle-right: "\f138"; $fa-var-chevron-circle-up: "\f139"; $fa-var-chevron-down: "\f078"; $fa-var-chevron-left: "\f053"; $fa-var-chevron-right: "\f054"; $fa-var-chevron-up: "\f077"; $fa-var-child: "\f1ae"; $fa-var-chrome: "\f268"; $fa-var-circle: "\f111"; $fa-var-circle-o: "\f10c"; $fa-var-circle-o-notch: "\f1ce"; $fa-var-circle-thin: "\f1db"; $fa-var-clipboard: "\f0ea"; $fa-var-clock-o: "\f017"; $fa-var-clone: "\f24d"; $fa-var-close: "\f00d"; $fa-var-cloud: "\f0c2"; $fa-var-cloud-download: "\f0ed"; $fa-var-cloud-upload: "\f0ee"; $fa-var-cny: "\f157"; $fa-var-code: "\f121"; $fa-var-code-fork: "\f126"; $fa-var-codepen: "\f1cb"; $fa-var-codiepie: "\f284"; $fa-var-coffee: "\f0f4"; $fa-var-cog: "\f013"; $fa-var-cogs: "\f085"; $fa-var-columns: "\f0db"; $fa-var-comment: "\f075"; $fa-var-comment-o: "\f0e5"; $fa-var-commenting: "\f27a"; $fa-var-commenting-o: "\f27b"; $fa-var-comments: "\f086"; $fa-var-comments-o: "\f0e6"; $fa-var-compass: "\f14e"; $fa-var-compress: "\f066"; $fa-var-connectdevelop: "\f20e"; $fa-var-contao: "\f26d"; $fa-var-copy: "\f0c5"; $fa-var-copyright: "\f1f9"; $fa-var-creative-commons: "\f25e"; $fa-var-credit-card: "\f09d"; $fa-var-credit-card-alt: "\f283"; $fa-var-crop: "\f125"; $fa-var-crosshairs: "\f05b"; $fa-var-css3: "\f13c"; $fa-var-cube: "\f1b2"; $fa-var-cubes: "\f1b3"; $fa-var-cut: "\f0c4"; $fa-var-cutlery: "\f0f5"; $fa-var-dashboard: "\f0e4"; $fa-var-dashcube: "\f210"; $fa-var-database: "\f1c0"; $fa-var-deaf: "\f2a4"; $fa-var-deafness: "\f2a4"; $fa-var-dedent: "\f03b"; $fa-var-delicious: "\f1a5"; $fa-var-desktop: "\f108"; $fa-var-deviantart: "\f1bd"; $fa-var-diamond: "\f219"; $fa-var-digg: "\f1a6"; $fa-var-dollar: "\f155"; $fa-var-dot-circle-o: "\f192"; $fa-var-download: "\f019"; $fa-var-dribbble: "\f17d"; $fa-var-dropbox: "\f16b"; $fa-var-drupal: "\f1a9"; $fa-var-edge: "\f282"; $fa-var-edit: "\f044"; $fa-var-eject: "\f052"; $fa-var-ellipsis-h: "\f141"; $fa-var-ellipsis-v: "\f142"; $fa-var-empire: "\f1d1"; $fa-var-envelope: "\f0e0"; $fa-var-envelope-o: "\f003"; $fa-var-envelope-square: "\f199"; $fa-var-envira: "\f299"; $fa-var-eraser: "\f12d"; $fa-var-eur: "\f153"; $fa-var-euro: "\f153"; $fa-var-exchange: "\f0ec"; $fa-var-exclamation: "\f12a"; $fa-var-exclamation-circle: "\f06a"; $fa-var-exclamation-triangle: "\f071"; $fa-var-expand: "\f065"; $fa-var-expeditedssl: "\f23e"; $fa-var-external-link: "\f08e"; $fa-var-external-link-square: "\f14c"; $fa-var-eye: "\f06e"; $fa-var-eye-slash: "\f070"; $fa-var-eyedropper: "\f1fb"; $fa-var-fa: "\f2b4"; $fa-var-facebook: "\f09a"; $fa-var-facebook-f: "\f09a"; $fa-var-facebook-official: "\f230"; $fa-var-facebook-square: "\f082"; $fa-var-fast-backward: "\f049"; $fa-var-fast-forward: "\f050"; $fa-var-fax: "\f1ac"; $fa-var-feed: "\f09e"; $fa-var-female: "\f182"; $fa-var-fighter-jet: "\f0fb"; $fa-var-file: "\f15b"; $fa-var-file-archive-o: "\f1c6"; $fa-var-file-audio-o: "\f1c7"; $fa-var-file-code-o: "\f1c9"; $fa-var-file-excel-o: "\f1c3"; $fa-var-file-image-o: "\f1c5"; $fa-var-file-movie-o: "\f1c8"; $fa-var-file-o: "\f016"; $fa-var-file-pdf-o: "\f1c1"; $fa-var-file-photo-o: "\f1c5"; $fa-var-file-picture-o: "\f1c5"; $fa-var-file-powerpoint-o: "\f1c4"; $fa-var-file-sound-o: "\f1c7"; $fa-var-file-text: "\f15c"; $fa-var-file-text-o: "\f0f6"; $fa-var-file-video-o: "\f1c8"; $fa-var-file-word-o: "\f1c2"; $fa-var-file-zip-o: "\f1c6"; $fa-var-files-o: "\f0c5"; $fa-var-film: "\f008"; $fa-var-filter: "\f0b0"; $fa-var-fire: "\f06d"; $fa-var-fire-extinguisher: "\f134"; $fa-var-firefox: "\f269"; $fa-var-first-order: "\f2b0"; $fa-var-flag: "\f024"; $fa-var-flag-checkered: "\f11e"; $fa-var-flag-o: "\f11d"; $fa-var-flash: "\f0e7"; $fa-var-flask: "\f0c3"; $fa-var-flickr: "\f16e"; $fa-var-floppy-o: "\f0c7"; $fa-var-folder: "\f07b"; $fa-var-folder-o: "\f114"; $fa-var-folder-open: "\f07c"; $fa-var-folder-open-o: "\f115"; $fa-var-font: "\f031"; $fa-var-font-awesome: "\f2b4"; $fa-var-fonticons: "\f280"; $fa-var-fort-awesome: "\f286"; $fa-var-forumbee: "\f211"; $fa-var-forward: "\f04e"; $fa-var-foursquare: "\f180"; $fa-var-frown-o: "\f119"; $fa-var-futbol-o: "\f1e3"; $fa-var-gamepad: "\f11b"; $fa-var-gavel: "\f0e3"; $fa-var-gbp: "\f154"; $fa-var-ge: "\f1d1"; $fa-var-gear: "\f013"; $fa-var-gears: "\f085"; $fa-var-genderless: "\f22d"; $fa-var-get-pocket: "\f265"; $fa-var-gg: "\f260"; $fa-var-gg-circle: "\f261"; $fa-var-gift: "\f06b"; $fa-var-git: "\f1d3"; $fa-var-git-square: "\f1d2"; $fa-var-github: "\f09b"; $fa-var-github-alt: "\f113"; $fa-var-github-square: "\f092"; $fa-var-gitlab: "\f296"; $fa-var-gittip: "\f184"; $fa-var-glass: "\f000"; $fa-var-glide: "\f2a5"; $fa-var-glide-g: "\f2a6"; $fa-var-globe: "\f0ac"; $fa-var-google: "\f1a0"; $fa-var-google-plus: "\f0d5"; $fa-var-google-plus-circle: "\f2b3"; $fa-var-google-plus-official: "\f2b3"; $fa-var-google-plus-square: "\f0d4"; $fa-var-google-wallet: "\f1ee"; $fa-var-graduation-cap: "\f19d"; $fa-var-gratipay: "\f184"; $fa-var-group: "\f0c0"; $fa-var-h-square: "\f0fd"; $fa-var-hacker-news: "\f1d4"; $fa-var-hand-grab-o: "\f255"; $fa-var-hand-lizard-o: "\f258"; $fa-var-hand-o-down: "\f0a7"; $fa-var-hand-o-left: "\f0a5"; $fa-var-hand-o-right: "\f0a4"; $fa-var-hand-o-up: "\f0a6"; $fa-var-hand-paper-o: "\f256"; $fa-var-hand-peace-o: "\f25b"; $fa-var-hand-pointer-o: "\f25a"; $fa-var-hand-rock-o: "\f255"; $fa-var-hand-scissors-o: "\f257"; $fa-var-hand-spock-o: "\f259"; $fa-var-hand-stop-o: "\f256"; $fa-var-hard-of-hearing: "\f2a4"; $fa-var-hashtag: "\f292"; $fa-var-hdd-o: "\f0a0"; $fa-var-header: "\f1dc"; $fa-var-headphones: "\f025"; $fa-var-heart: "\f004"; $fa-var-heart-o: "\f08a"; $fa-var-heartbeat: "\f21e"; $fa-var-history: "\f1da"; $fa-var-home: "\f015"; $fa-var-hospital-o: "\f0f8"; $fa-var-hotel: "\f236"; $fa-var-hourglass: "\f254"; $fa-var-hourglass-1: "\f251"; $fa-var-hourglass-2: "\f252"; $fa-var-hourglass-3: "\f253"; $fa-var-hourglass-end: "\f253"; $fa-var-hourglass-half: "\f252"; $fa-var-hourglass-o: "\f250"; $fa-var-hourglass-start: "\f251"; $fa-var-houzz: "\f27c"; $fa-var-html5: "\f13b"; $fa-var-i-cursor: "\f246"; $fa-var-ils: "\f20b"; $fa-var-image: "\f03e"; $fa-var-inbox: "\f01c"; $fa-var-indent: "\f03c"; $fa-var-industry: "\f275"; $fa-var-info: "\f129"; $fa-var-info-circle: "\f05a"; $fa-var-inr: "\f156"; $fa-var-instagram: "\f16d"; $fa-var-institution: "\f19c"; $fa-var-internet-explorer: "\f26b"; $fa-var-intersex: "\f224"; $fa-var-ioxhost: "\f208"; $fa-var-italic: "\f033"; $fa-var-joomla: "\f1aa"; $fa-var-jpy: "\f157"; $fa-var-jsfiddle: "\f1cc"; $fa-var-key: "\f084"; $fa-var-keyboard-o: "\f11c"; $fa-var-krw: "\f159"; $fa-var-language: "\f1ab"; $fa-var-laptop: "\f109"; $fa-var-lastfm: "\f202"; $fa-var-lastfm-square: "\f203"; $fa-var-leaf: "\f06c"; $fa-var-leanpub: "\f212"; $fa-var-legal: "\f0e3"; $fa-var-lemon-o: "\f094"; $fa-var-level-down: "\f149"; $fa-var-level-up: "\f148"; $fa-var-life-bouy: "\f1cd"; $fa-var-life-buoy: "\f1cd"; $fa-var-life-ring: "\f1cd"; $fa-var-life-saver: "\f1cd"; $fa-var-lightbulb-o: "\f0eb"; $fa-var-line-chart: "\f201"; $fa-var-link: "\f0c1"; $fa-var-linkedin: "\f0e1"; $fa-var-linkedin-square: "\f08c"; $fa-var-linux: "\f17c"; $fa-var-list: "\f03a"; $fa-var-list-alt: "\f022"; $fa-var-list-ol: "\f0cb"; $fa-var-list-ul: "\f0ca"; $fa-var-location-arrow: "\f124"; $fa-var-lock: "\f023"; $fa-var-long-arrow-down: "\f175"; $fa-var-long-arrow-left: "\f177"; $fa-var-long-arrow-right: "\f178"; $fa-var-long-arrow-up: "\f176"; $fa-var-low-vision: "\f2a8"; $fa-var-magic: "\f0d0"; $fa-var-magnet: "\f076"; $fa-var-mail-forward: "\f064"; $fa-var-mail-reply: "\f112"; $fa-var-mail-reply-all: "\f122"; $fa-var-male: "\f183"; $fa-var-map: "\f279"; $fa-var-map-marker: "\f041"; $fa-var-map-o: "\f278"; $fa-var-map-pin: "\f276"; $fa-var-map-signs: "\f277"; $fa-var-mars: "\f222"; $fa-var-mars-double: "\f227"; $fa-var-mars-stroke: "\f229"; $fa-var-mars-stroke-h: "\f22b"; $fa-var-mars-stroke-v: "\f22a"; $fa-var-maxcdn: "\f136"; $fa-var-meanpath: "\f20c"; $fa-var-medium: "\f23a"; $fa-var-medkit: "\f0fa"; $fa-var-meh-o: "\f11a"; $fa-var-mercury: "\f223"; $fa-var-microphone: "\f130"; $fa-var-microphone-slash: "\f131"; $fa-var-minus: "\f068"; $fa-var-minus-circle: "\f056"; $fa-var-minus-square: "\f146"; $fa-var-minus-square-o: "\f147"; $fa-var-mixcloud: "\f289"; $fa-var-mobile: "\f10b"; $fa-var-mobile-phone: "\f10b"; $fa-var-modx: "\f285"; $fa-var-money: "\f0d6"; $fa-var-moon-o: "\f186"; $fa-var-mortar-board: "\f19d"; $fa-var-motorcycle: "\f21c"; $fa-var-mouse-pointer: "\f245"; $fa-var-music: "\f001"; $fa-var-navicon: "\f0c9"; $fa-var-neuter: "\f22c"; $fa-var-newspaper-o: "\f1ea"; $fa-var-object-group: "\f247"; $fa-var-object-ungroup: "\f248"; $fa-var-odnoklassniki: "\f263"; $fa-var-odnoklassniki-square: "\f264"; $fa-var-opencart: "\f23d"; $fa-var-openid: "\f19b"; $fa-var-opera: "\f26a"; $fa-var-optin-monster: "\f23c"; $fa-var-outdent: "\f03b"; $fa-var-pagelines: "\f18c"; $fa-var-paint-brush: "\f1fc"; $fa-var-paper-plane: "\f1d8"; $fa-var-paper-plane-o: "\f1d9"; $fa-var-paperclip: "\f0c6"; $fa-var-paragraph: "\f1dd"; $fa-var-paste: "\f0ea"; $fa-var-pause: "\f04c"; $fa-var-pause-circle: "\f28b"; $fa-var-pause-circle-o: "\f28c"; $fa-var-paw: "\f1b0"; $fa-var-paypal: "\f1ed"; $fa-var-pencil: "\f040"; $fa-var-pencil-square: "\f14b"; $fa-var-pencil-square-o: "\f044"; $fa-var-percent: "\f295"; $fa-var-phone: "\f095"; $fa-var-phone-square: "\f098"; $fa-var-photo: "\f03e"; $fa-var-picture-o: "\f03e"; $fa-var-pie-chart: "\f200"; $fa-var-pied-piper: "\f2ae"; $fa-var-pied-piper-alt: "\f1a8"; $fa-var-pied-piper-pp: "\f1a7"; $fa-var-pinterest: "\f0d2"; $fa-var-pinterest-p: "\f231"; $fa-var-pinterest-square: "\f0d3"; $fa-var-plane: "\f072"; $fa-var-play: "\f04b"; $fa-var-play-circle: "\f144"; $fa-var-play-circle-o: "\f01d"; $fa-var-plug: "\f1e6"; $fa-var-plus: "\f067"; $fa-var-plus-circle: "\f055"; $fa-var-plus-square: "\f0fe"; $fa-var-plus-square-o: "\f196"; $fa-var-power-off: "\f011"; $fa-var-print: "\f02f"; $fa-var-product-hunt: "\f288"; $fa-var-puzzle-piece: "\f12e"; $fa-var-qq: "\f1d6"; $fa-var-qrcode: "\f029"; $fa-var-question: "\f128"; $fa-var-question-circle: "\f059"; $fa-var-question-circle-o: "\f29c"; $fa-var-quote-left: "\f10d"; $fa-var-quote-right: "\f10e"; $fa-var-ra: "\f1d0"; $fa-var-random: "\f074"; $fa-var-rebel: "\f1d0"; $fa-var-recycle: "\f1b8"; $fa-var-reddit: "\f1a1"; $fa-var-reddit-alien: "\f281"; $fa-var-reddit-square: "\f1a2"; $fa-var-refresh: "\f021"; $fa-var-registered: "\f25d"; $fa-var-remove: "\f00d"; $fa-var-renren: "\f18b"; $fa-var-reorder: "\f0c9"; $fa-var-repeat: "\f01e"; $fa-var-reply: "\f112"; $fa-var-reply-all: "\f122"; $fa-var-resistance: "\f1d0"; $fa-var-retweet: "\f079"; $fa-var-rmb: "\f157"; $fa-var-road: "\f018"; $fa-var-rocket: "\f135"; $fa-var-rotate-left: "\f0e2"; $fa-var-rotate-right: "\f01e"; $fa-var-rouble: "\f158"; $fa-var-rss: "\f09e"; $fa-var-rss-square: "\f143"; $fa-var-rub: "\f158"; $fa-var-ruble: "\f158"; $fa-var-rupee: "\f156"; $fa-var-safari: "\f267"; $fa-var-save: "\f0c7"; $fa-var-scissors: "\f0c4"; $fa-var-scribd: "\f28a"; $fa-var-search: "\f002"; $fa-var-search-minus: "\f010"; $fa-var-search-plus: "\f00e"; $fa-var-sellsy: "\f213"; $fa-var-send: "\f1d8"; $fa-var-send-o: "\f1d9"; $fa-var-server: "\f233"; $fa-var-share: "\f064"; $fa-var-share-alt: "\f1e0"; $fa-var-share-alt-square: "\f1e1"; $fa-var-share-square: "\f14d"; $fa-var-share-square-o: "\f045"; $fa-var-shekel: "\f20b"; $fa-var-sheqel: "\f20b"; $fa-var-shield: "\f132"; $fa-var-ship: "\f21a"; $fa-var-shirtsinbulk: "\f214"; $fa-var-shopping-bag: "\f290"; $fa-var-shopping-basket: "\f291"; $fa-var-shopping-cart: "\f07a"; $fa-var-sign-in: "\f090"; $fa-var-sign-language: "\f2a7"; $fa-var-sign-out: "\f08b"; $fa-var-signal: "\f012"; $fa-var-signing: "\f2a7"; $fa-var-simplybuilt: "\f215"; $fa-var-sitemap: "\f0e8"; $fa-var-skyatlas: "\f216"; $fa-var-skype: "\f17e"; $fa-var-slack: "\f198"; $fa-var-sliders: "\f1de"; $fa-var-slideshare: "\f1e7"; $fa-var-smile-o: "\f118"; $fa-var-snapchat: "\f2ab"; $fa-var-snapchat-ghost: "\f2ac"; $fa-var-snapchat-square: "\f2ad"; $fa-var-soccer-ball-o: "\f1e3"; $fa-var-sort: "\f0dc"; $fa-var-sort-alpha-asc: "\f15d"; $fa-var-sort-alpha-desc: "\f15e"; $fa-var-sort-amount-asc: "\f160"; $fa-var-sort-amount-desc: "\f161"; $fa-var-sort-asc: "\f0de"; $fa-var-sort-desc: "\f0dd"; $fa-var-sort-down: "\f0dd"; $fa-var-sort-numeric-asc: "\f162"; $fa-var-sort-numeric-desc: "\f163"; $fa-var-sort-up: "\f0de"; $fa-var-soundcloud: "\f1be"; $fa-var-space-shuttle: "\f197"; $fa-var-spinner: "\f110"; $fa-var-spoon: "\f1b1"; $fa-var-spotify: "\f1bc"; $fa-var-square: "\f0c8"; $fa-var-square-o: "\f096"; $fa-var-stack-exchange: "\f18d"; $fa-var-stack-overflow: "\f16c"; $fa-var-star: "\f005"; $fa-var-star-half: "\f089"; $fa-var-star-half-empty: "\f123"; $fa-var-star-half-full: "\f123"; $fa-var-star-half-o: "\f123"; $fa-var-star-o: "\f006"; $fa-var-steam: "\f1b6"; $fa-var-steam-square: "\f1b7"; $fa-var-step-backward: "\f048"; $fa-var-step-forward: "\f051"; $fa-var-stethoscope: "\f0f1"; $fa-var-sticky-note: "\f249"; $fa-var-sticky-note-o: "\f24a"; $fa-var-stop: "\f04d"; $fa-var-stop-circle: "\f28d"; $fa-var-stop-circle-o: "\f28e"; $fa-var-street-view: "\f21d"; $fa-var-strikethrough: "\f0cc"; $fa-var-stumbleupon: "\f1a4"; $fa-var-stumbleupon-circle: "\f1a3"; $fa-var-subscript: "\f12c"; $fa-var-subway: "\f239"; $fa-var-suitcase: "\f0f2"; $fa-var-sun-o: "\f185"; $fa-var-superscript: "\f12b"; $fa-var-support: "\f1cd"; $fa-var-table: "\f0ce"; $fa-var-tablet: "\f10a"; $fa-var-tachometer: "\f0e4"; $fa-var-tag: "\f02b"; $fa-var-tags: "\f02c"; $fa-var-tasks: "\f0ae"; $fa-var-taxi: "\f1ba"; $fa-var-television: "\f26c"; $fa-var-tencent-weibo: "\f1d5"; $fa-var-terminal: "\f120"; $fa-var-text-height: "\f034"; $fa-var-text-width: "\f035"; $fa-var-th: "\f00a"; $fa-var-th-large: "\f009"; $fa-var-th-list: "\f00b"; $fa-var-themeisle: "\f2b2"; $fa-var-thumb-tack: "\f08d"; $fa-var-thumbs-down: "\f165"; $fa-var-thumbs-o-down: "\f088"; $fa-var-thumbs-o-up: "\f087"; $fa-var-thumbs-up: "\f164"; $fa-var-ticket: "\f145"; $fa-var-times: "\f00d"; $fa-var-times-circle: "\f057"; $fa-var-times-circle-o: "\f05c"; $fa-var-tint: "\f043"; $fa-var-toggle-down: "\f150"; $fa-var-toggle-left: "\f191"; $fa-var-toggle-off: "\f204"; $fa-var-toggle-on: "\f205"; $fa-var-toggle-right: "\f152"; $fa-var-toggle-up: "\f151"; $fa-var-trademark: "\f25c"; $fa-var-train: "\f238"; $fa-var-transgender: "\f224"; $fa-var-transgender-alt: "\f225"; $fa-var-trash: "\f1f8"; $fa-var-trash-o: "\f014"; $fa-var-tree: "\f1bb"; $fa-var-trello: "\f181"; $fa-var-tripadvisor: "\f262"; $fa-var-trophy: "\f091"; $fa-var-truck: "\f0d1"; $fa-var-try: "\f195"; $fa-var-tty: "\f1e4"; $fa-var-tumblr: "\f173"; $fa-var-tumblr-square: "\f174"; $fa-var-turkish-lira: "\f195"; $fa-var-tv: "\f26c"; $fa-var-twitch: "\f1e8"; $fa-var-twitter: "\f099"; $fa-var-twitter-square: "\f081"; $fa-var-umbrella: "\f0e9"; $fa-var-underline: "\f0cd"; $fa-var-undo: "\f0e2"; $fa-var-universal-access: "\f29a"; $fa-var-university: "\f19c"; $fa-var-unlink: "\f127"; $fa-var-unlock: "\f09c"; $fa-var-unlock-alt: "\f13e"; $fa-var-unsorted: "\f0dc"; $fa-var-upload: "\f093"; $fa-var-usb: "\f287"; $fa-var-usd: "\f155"; $fa-var-user: "\f007"; $fa-var-user-md: "\f0f0"; $fa-var-user-plus: "\f234"; $fa-var-user-secret: "\f21b"; $fa-var-user-times: "\f235"; $fa-var-users: "\f0c0"; $fa-var-venus: "\f221"; $fa-var-venus-double: "\f226"; $fa-var-venus-mars: "\f228"; $fa-var-viacoin: "\f237"; $fa-var-viadeo: "\f2a9"; $fa-var-viadeo-square: "\f2aa"; $fa-var-video-camera: "\f03d"; $fa-var-vimeo: "\f27d"; $fa-var-vimeo-square: "\f194"; $fa-var-vine: "\f1ca"; $fa-var-vk: "\f189"; $fa-var-volume-control-phone: "\f2a0"; $fa-var-volume-down: "\f027"; $fa-var-volume-off: "\f026"; $fa-var-volume-up: "\f028"; $fa-var-warning: "\f071"; $fa-var-wechat: "\f1d7"; $fa-var-weibo: "\f18a"; $fa-var-weixin: "\f1d7"; $fa-var-whatsapp: "\f232"; $fa-var-wheelchair: "\f193"; $fa-var-wheelchair-alt: "\f29b"; $fa-var-wifi: "\f1eb"; $fa-var-wikipedia-w: "\f266"; $fa-var-windows: "\f17a"; $fa-var-won: "\f159"; $fa-var-wordpress: "\f19a"; $fa-var-wpbeginner: "\f297"; $fa-var-wpforms: "\f298"; $fa-var-wrench: "\f0ad"; $fa-var-xing: "\f168"; $fa-var-xing-square: "\f169"; $fa-var-y-combinator: "\f23b"; $fa-var-y-combinator-square: "\f1d4"; $fa-var-yahoo: "\f19e"; $fa-var-yc: "\f23b"; $fa-var-yc-square: "\f1d4"; $fa-var-yelp: "\f1e9"; $fa-var-yen: "\f157"; $fa-var-yoast: "\f2b1"; $fa-var-youtube: "\f167"; $fa-var-youtube-play: "\f16a"; $fa-var-youtube-square: "\f166"; ================================================ FILE: webpage/deepchat/static/vendor/font-awesome/scss/font-awesome.scss ================================================ /*! * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables"; @import "mixins"; @import "path"; @import "core"; @import "larger"; @import "fixed-width"; @import "list"; @import "bordered-pulled"; @import "animated"; @import "rotated-flipped"; @import "stacked"; @import "icons"; @import "screen-reader"; ================================================ FILE: webpage/deepchat/static/vendor/jquery/jquery.easing.1.3.js ================================================ /* * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ * * Uses the built in easing capabilities added In jQuery 1.1 * to offer multiple easing options * * TERMS OF USE - jQuery Easing * * Open source under the BSD License. * * Copyright © 2008 George McGinley Smith * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ // t: current time, b: begInnIng value, c: change In value, d: duration jQuery.easing['jswing'] = jQuery.easing['swing']; jQuery.extend( jQuery.easing, { def: 'easeOutQuad', swing: function (x, t, b, c, d) { //alert(jQuery.easing.default); return jQuery.easing[jQuery.easing.def](x, t, b, c, d); }, easeInQuad: function (x, t, b, c, d) { return c*(t/=d)*t + b; }, easeOutQuad: function (x, t, b, c, d) { return -c *(t/=d)*(t-2) + b; }, easeInOutQuad: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; }, easeInCubic: function (x, t, b, c, d) { return c*(t/=d)*t*t + b; }, easeOutCubic: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; }, easeInOutCubic: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b; }, easeInQuart: function (x, t, b, c, d) { return c*(t/=d)*t*t*t + b; }, easeOutQuart: function (x, t, b, c, d) { return -c * ((t=t/d-1)*t*t*t - 1) + b; }, easeInOutQuart: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b; }, easeInQuint: function (x, t, b, c, d) { return c*(t/=d)*t*t*t*t + b; }, easeOutQuint: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b; }, easeInOutQuint: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b; }, easeInSine: function (x, t, b, c, d) { return -c * Math.cos(t/d * (Math.PI/2)) + c + b; }, easeOutSine: function (x, t, b, c, d) { return c * Math.sin(t/d * (Math.PI/2)) + b; }, easeInOutSine: function (x, t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; }, easeInExpo: function (x, t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; }, easeOutExpo: function (x, t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; }, easeInOutExpo: function (x, t, b, c, d) { if (t==0) return b; if (t==d) return b+c; if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function (x, t, b, c, d) { return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; }, easeOutCirc: function (x, t, b, c, d) { return c * Math.sqrt(1 - (t=t/d-1)*t) + b; }, easeInOutCirc: function (x, t, b, c, d) { if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; }, easeInElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; }, easeOutElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; }, easeInOutElastic: function (x, t, b, c, d) { var s=1.70158;var p=0;var a=c; if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (a < Math.abs(c)) { a=c; var s=p/4; } else var s = p/(2*Math.PI) * Math.asin (c/a); if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; }, easeInBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*(t/=d)*t*((s+1)*t - s) + b; }, easeOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; }, easeInOutBack: function (x, t, b, c, d, s) { if (s == undefined) s = 1.70158; if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; }, easeInBounce: function (x, t, b, c, d) { return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b; }, easeOutBounce: function (x, t, b, c, d) { if ((t/=d) < (1/2.75)) { return c*(7.5625*t*t) + b; } else if (t < (2/2.75)) { return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; } else if (t < (2.5/2.75)) { return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; } else { return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; } }, easeInOutBounce: function (x, t, b, c, d) { if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; } }); /* * * TERMS OF USE - EASING EQUATIONS * * Open source under the BSD License. * * Copyright © 2001 Robert Penner * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */ ================================================ FILE: webpage/deepchat/templates/404.html ================================================ {% extends "base.html" %} {% block title %}U Lost Yo{% endblock title %} {% block page_content %}

NOTHING TO SEE HERE

You done got yourself a 404, my friend. How about we just hit that backspace button and pretend this never happend. OMG

Responsive image
{% endblock page_content %} ================================================ FILE: webpage/deepchat/templates/about.html ================================================ {% extends "base.html" %} {% set active_page = "about" %} {% block nav_session_user %} {% endblock nav_session_user %} {% block page_content %}

DeepChatModels

A small framework for building and playing with conversation models in TensorFlow.

{% endblock page_content %} ================================================ FILE: webpage/deepchat/templates/admin/index.html ================================================ {% extends 'admin/master.html' %} {% block head %} {{ super() }} {% endblock head %} {% block body %} {% endblock body %} ================================================ FILE: webpage/deepchat/templates/base.html ================================================ {% block head %} {% block metas %} {% endblock metas %} {% block title %} Deep Chat Models {% endblock title %} {% endblock head %} {% block navbar %} {% set navigation_bar = [ ('/', 'index', 'Home'), ('/plots', 'plots', 'Plots'), ('/about', 'about', 'About') ] -%} {% set active_page = active_page|default('index') -%} {% endblock navbar %} {% block content %}
{% with messages = get_flashed_messages() %} {% if messages %}
{% for message in messages %}

{{ message }}

{% endfor %}
{% endif %} {% endwith %}
{% block page_content %} {% endblock page_content %}
{% endblock content %} {% block scripts %} {% endblock scripts %} ================================================ FILE: webpage/deepchat/templates/index.html ================================================ {% extends "base.html" %} {% set active_page = "index" %} {% from "macros/forms.html" import render_chat_form, render_user_form %} {% block page_content %}

Conversation Models in TensorFlow

Have a chat with a deep neural network.

Give Yourself a Nickname  

The bot would like to know who it is talking to. Feel free to enter a nickname for yourself below:

{{ render_user_form(user_form, "user-form") }}


Chat with a Bot

I've uploaded two simple models here that you can chat with. One was trained on the Cornell Movie Dialogs, the other on a subset (2007-2009) of the Reddit comments dataset. They both have the same model architecture. I'll upload the full configurations soon, but their key components are as follows:

  • Max sentence length: 10
  • Vocabulary size: 40000
  • BasicEncoder to BasicDecoder; single-layer each
The rest of the parameters (and some of the above) are the default values. They represent the simplest model(s) the project supports.




{% endblock page_content %} {% block scripts %} {{ super() }} {% endblock scripts %} ================================================ FILE: webpage/deepchat/templates/macros/forms.html ================================================ {% macro with_errors(field) %} {% if field and field.errors %} {{ field(class=css_class, **kwargs) }}
    {% for error in field.errors %}
  • {{ error|e }}
  • {% endfor %}
{% else %} {{ field(**kwargs) }} {% endif %} {% endmacro %} {% macro render_label(label) %} {{ label(style="text-transform: capitalize;", **kwargs) }} {% endmacro %} {% macro render_user_message(message) %} {{ message(class="form-control", autocomplete="off", **kwargs) }} {% endmacro %} {% macro render_submit(submit) %} {{ with_errors(submit, **kwargs) }} {% endmacro %} {% macro render_chat_form(form, id, bot_name) %}
{{ form.hidden_tag() }} {{ render_user_message(form.message, id=bot_name) }}
{{ render_submit(form.submit, data_name=bot_name, class="chat-form-submit btn btn-primary btn-sm") }}
{% endmacro %} {% macro render_user_form(form, id) %}
{{ form.hidden_tag() }}
Name {{ form.name(class="form-control", placeholder="User McUserFace" , autocomplete="off") }}
{{ render_submit(form.submit, id=id + '-submit', class='user-form-submit btn btn-primary btn-sm') }}
{% endmacro %} ================================================ FILE: webpage/deepchat/templates/plots.html ================================================ {% extends "base.html" %} {% set active_page = "plots" %} {% block nav_session_user %} {% endblock nav_session_user %} {% block head %} {{ super() }} {% endblock head %} {% block page_content %}

Interactive Plots

Scans over hyperparameter space for the models, in order to first get a semi-quantitative idea of which regions to focus on (and it's fun).

Overview and Setup

All plots on this page show some value plotted every 200 iterations out of 10,000 total, for a model identified by the plot label (configuration/params shown at the end of each section).

The label will contain the main distinction/info regarding how the given model differs from the others on a given plot. Currently, I'm most interested in comparing performance for GRU vs. LSTM, number of layers, and how much the BidirectionalEncoder, AttentionDecoder, and combinations thereof improve the baseline (basic) model with BasicEncoder and BasicDecoder.

If you are reading this and know how to do curve fitting with D3 please let me know. I haven't looked extensively how to do it, but it is certainly on my list considering the jagged appearance of the plots right now (doing simple splines).


Back to Basics

Below are plots on training accuracy, training loss, and validation loss for basic models trained on the Cornell dataset. Any time I refer to a model as "basic", I am saying that it uses the BasicEncoder and BasicDecoder classes (members of the chatbot.components package).


Configuration Parameters

Below are labeled buttons that show the configuration parameters for the corresponding plot label. For ease of viewing, a parameter is only shown if not all plotted models have the same value; e.g. if all plots above used a batch size of 256 (the default), none of the buttons below will show a value for batch size.


Paying Attention

Now let's try and incorporate attention into these models.


Configuration Parameters

{% endblock page_content %} {% block scripts %} {{ super() }} {% endblock scripts %} ================================================ FILE: webpage/deepchat/web_bot.py ================================================ """Minimal subset of functions/methods from repo needed to run bot on Heroku. See the main repository for better docs (all from utils and data directory). """ import os import re import numpy as np import tensorflow as tf import yaml os.environ['TF_CPP_MIN_LOG_LEVEL']='1' UNK_ID = 3 # Regular expressions used to tokenize. _WORD_SPLIT = re.compile(b"([.,!?\"':;)(])") _DIGIT_RE = re.compile(br"\d") _PRIMARY_KEYS = ['model', 'dataset', 'model_params', 'dataset_params'] def basic_tokenizer(sentence): words = [] for space_separated_fragment in sentence.strip().split(): words.extend(_WORD_SPLIT.split(space_separated_fragment)) return [w for w in words if w] def sentence_to_token_ids(sentence, vocabulary, normalize_digits=True): words = basic_tokenizer(sentence) if not normalize_digits: return [vocabulary.get(w, UNK_ID) for w in words] # Normalize digits by 0 before looking words up in the vocabulary. return [vocabulary.get(_DIGIT_RE.sub(b"0", w), UNK_ID) for w in words] def get_vocab_dicts(vocabulary_path): """Returns word_to_idx, idx_to_word dictionaries given vocabulary.""" if tf.gfile.Exists(vocabulary_path): rev_vocab = [] with tf.gfile.GFile(vocabulary_path, mode="rb") as f: rev_vocab.extend(f.readlines()) rev_vocab = [tf.compat.as_bytes(line.strip()) for line in rev_vocab] vocab = dict([(x, y) for (y, x) in enumerate(rev_vocab)]) return vocab, rev_vocab else: raise ValueError("Vocabulary file %s not found." % vocabulary_path) def load_graph(frozen_model_dir): """Load frozen tensorflow graph into the default graph. Args: frozen_model_dir: location of protobuf file containing frozen graph. Returns: tf.Graph object imported from frozen_model_path. """ # Prase the frozen graph definition into a GraphDef object. frozen_file = os.path.join(frozen_model_dir, "frozen_model.pb") with tf.gfile.GFile(frozen_file, "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # Load the graph def into the default graph and return it. with tf.Graph().as_default() as graph: tf.import_graph_def( graph_def, input_map=None, return_elements=None, op_dict=None, producer_op_list=None) return graph def unfreeze_bot(frozen_model_path): """Restores the frozen graph from file and grabs input/output tensors needed to interface with a cornell_bot for conversation. Args: frozen_model_path: location of protobuf file containing frozen graph. Returns: outputs: tensor that can be run in a session. """ bot_graph = load_graph(frozen_model_path) tensors = {'inputs': bot_graph.get_tensor_by_name('import/input_pipeline/user_input:0'), 'outputs': bot_graph.get_tensor_by_name('import/outputs:0')} return tensors, bot_graph class FrozenBot: """The mouth and ears of a cornell_bot that's been serialized.""" def __init__(self, frozen_model_dir, is_testing=False): """ Args: is_testing: (bool) True for testing (while GPU is busy training). In that case, just use a 'bot' that returns inputs reversed. """ # Get absolute path to model directory. here = os.path.dirname(os.path.realpath(__file__)) assets_path = os.path.join(here, 'static', 'assets') self.abs_model_dir = os.path.join(assets_path, 'frozen_models', frozen_model_dir) self.load_config(os.path.join(self.abs_model_dir, 'config.yml')) self.word_to_idx, self.idx_to_word = self.get_frozen_vocab(self.config) self.is_testing = is_testing # Setup tensorflow graph(s)/session(s) iff not testing. if not is_testing: self.unfreeze() def load_config(self, config_path): with open(config_path) as f: config = yaml.load(f) config['dataset_params']['data_dir'] = os.path.dirname(config_path) self.__dict__['__params'] = config def __getattr__(self, name): if name == 'config': return self.__dict__['__params'] elif name in _PRIMARY_KEYS: return self.__dict__['__params'][name] else: for primary_key in _PRIMARY_KEYS: if not isinstance(self.__dict__['__params'][primary_key], dict): continue elif name in self.__dict__['__params'][primary_key]: return self.__dict__['__params'][primary_key][name] raise AttributeError(name) def get_frozen_vocab(self, config): """Helper function to get dictionaries between tokens and words.""" data_dir = config['dataset_params']['data_dir'] vocab_size = config['dataset_params']['vocab_size'] vocab_path = os.path.join(data_dir, 'vocab{}.txt'.format(vocab_size)) word_to_idx, idx_to_word = get_vocab_dicts(vocab_path) return word_to_idx, idx_to_word def as_words(self, sentence): words = [] for token in sentence: word = self.idx_to_word[token] try: word = tf.compat.as_str(word) except UnicodeDecodeError: word = str(word) words.append(word) words = " ".join(words) words = words.replace(' , ', ', ').replace(' .', '.').replace(' !', '!') words = words.replace(" ' ", "'").replace(" ?", "?") if len(words) < 2: return words return words[0].upper() + words[1:] def __call__(self, sentence): """Outputs response sentence (string) given input (string).""" if self.is_testing: return sentence[::-1] sentence = sentence.strip().lower() print('User:', sentence) # Convert input sentence to token-ids. sentence_tokens = sentence_to_token_ids( tf.compat.as_bytes(sentence), self.word_to_idx) sentence_tokens = np.array([sentence_tokens[::-1]]) # Get output sentence from the chatbot. fetches = self.tensor_dict['outputs'] feed_dict={self.tensor_dict['inputs']: sentence_tokens} response = self.sess.run(fetches=fetches, feed_dict=feed_dict) response = self.as_words(response[0][:-1]) # Translate from confused-bot-language to English... if 'UNK' in response: response = "I don't know." print("Bot:", response) return response def unfreeze(self): # Setup tensorflow graph(s)/session(s) iff not testing. if not self.is_testing: # Get bot graph and input/output tensors. self.tensor_dict, graph = unfreeze_bot(self.abs_model_dir) self.sess = tf.Session(graph=graph) def freeze(self): if not self.is_testing: self.sess.close() self.graph = self.tensor_dict = None ================================================ FILE: webpage/manage.py ================================================ #!/usr/bin/env python3 """manage.py: Start up the web server and the application.""" import os from deepchat import create_app, db from deepchat.models import User, Chatbot, Conversation, Turn from flask_script import Manager, Shell from flask_migrate import Migrate, MigrateCommand # First check if we are being called on the app engine. config_name = os.getenv('APPENGINE_CONFIG') # If not, either set to my (Brandon) preference given by FLASK_CONFIG, or # set to default if not found (e.g. you != Brandon || haven't set FLASK_CONFIG) if config_name is None: config_name = os.getenv('FLASK_CONFIG', 'default') app = create_app(config_name) # For better CLI. manager = Manager(app) # Database tables can be created or upgraded with a single command: # python3 manage.py db upgrade migrate = Migrate(app, db) def make_shell_context(): """Automatic imports when we want to play in the shell.""" return dict(app=app, db=db, User=User, Chatbot=Chatbot, Conversation=Conversation, Turn=Turn) manager.add_command("shell", Shell(make_context=make_shell_context)) # Give manager 'db' command. # Now, 'manage.py db [options]' runs the flask_migrate.Migrate method. manager.add_command('db', MigrateCommand) @manager.command def test(): """Run the unit tests (see the tests package). This can be run from the cmd line via 'python3 manage.py test'. Note: the decorator above allows us to define this as a custom method for our manager object. """ import unittest tests = unittest.TestLoader().discover('tests') unittest.TextTestRunner(verbosity=2).run(tests) @manager.command def deploy(): from flask_migrate import upgrade # Migrate db to latest revision. upgrade() if __name__ == '__main__': manager.run() ================================================ FILE: webpage/migrations/README ================================================ Generic single-database configuration. ================================================ FILE: webpage/migrations/alembic.ini ================================================ # A generic, single database configuration. [alembic] # template used to generate migration files # file_template = %%(rev)s_%%(slug)s # set to 'true' to run the environment during # the 'revision' command, regardless of autogenerate # revision_environment = false # Logging configuration [loggers] keys = root,sqlalchemy,alembic [handlers] keys = console [formatters] keys = generic [logger_root] level = WARN handlers = console qualname = [logger_sqlalchemy] level = WARN handlers = qualname = sqlalchemy.engine [logger_alembic] level = INFO handlers = qualname = alembic [handler_console] class = StreamHandler args = (sys.stderr,) level = NOTSET formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S ================================================ FILE: webpage/migrations/env.py ================================================ from __future__ import with_statement from alembic import context from sqlalchemy import engine_from_config, pool from logging.config import fileConfig import logging # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. # This line sets up loggers basically. fileConfig(config.config_file_name) logger = logging.getLogger('alembic.env') # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata from flask import current_app config.set_main_option('sqlalchemy.url', current_app.config.get('SQLALCHEMY_DATABASE_URI')) target_metadata = current_app.extensions['migrate'].db.metadata # other values from the config, defined by the needs of env.py, # can be acquired: # my_important_option = config.get_main_option("my_important_option") # ... etc. def run_migrations_offline(): """Run migrations in 'offline' mode. This configures the context with just a URL and not an Engine, though an Engine is acceptable here as well. By skipping the Engine creation we don't even need a DBAPI to be available. Calls to context.execute() here emit the given string to the script output. """ url = config.get_main_option("sqlalchemy.url") context.configure(url=url) with context.begin_transaction(): context.run_migrations() def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ # this callback is used to prevent an auto-migration from being generated # when there are no changes to the schema # reference: http://alembic.readthedocs.org/en/latest/cookbook.html def process_revision_directives(context, revision, directives): if getattr(config.cmd_opts, 'autogenerate', False): script = directives[0] if script.upgrade_ops.is_empty(): directives[:] = [] logger.info('No changes in schema detected.') engine = engine_from_config(config.get_section(config.config_ini_section), prefix='sqlalchemy.', poolclass=pool.NullPool) connection = engine.connect() context.configure(connection=connection, target_metadata=target_metadata, process_revision_directives=process_revision_directives, **current_app.extensions['migrate'].configure_args) try: with context.begin_transaction(): context.run_migrations() finally: connection.close() if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online() ================================================ FILE: webpage/migrations/script.py.mako ================================================ """${message} Revision ID: ${up_revision} Revises: ${down_revision | comma,n} Create Date: ${create_date} """ from alembic import op import sqlalchemy as sa ${imports if imports else ""} # revision identifiers, used by Alembic. revision = ${repr(up_revision)} down_revision = ${repr(down_revision)} branch_labels = ${repr(branch_labels)} depends_on = ${repr(depends_on)} def upgrade(): ${upgrades if upgrades else "pass"} def downgrade(): ${downgrades if downgrades else "pass"} ================================================ FILE: webpage/migrations/versions/236b966ecd2f_.py ================================================ """empty message Revision ID: 236b966ecd2f Revises: Create Date: 2017-05-03 14:27:37.853971 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = '236b966ecd2f' down_revision = None branch_labels = None depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('chatbot', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=64), nullable=True), sa.Column('dataset', sa.String(length=64), nullable=True), sa.Column('base_cell', sa.String(length=64), nullable=True), sa.Column('encoder', sa.String(length=64), nullable=True), sa.Column('decoder', sa.String(length=64), nullable=True), sa.Column('learning_rate', sa.Float(), nullable=True), sa.Column('num_layers', sa.Integer(), nullable=True), sa.Column('state_size', sa.Integer(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_chatbot_name'), 'chatbot', ['name'], unique=True) op.create_table('user', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=64), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_user_name'), 'user', ['name'], unique=True) op.create_table('conversation', sa.Column('id', sa.Integer(), nullable=False), sa.Column('start_time', sa.DateTime(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('chatbot_id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['chatbot_id'], ['chatbot.id'], ), sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_conversation_start_time'), 'conversation', ['start_time'], unique=True) op.create_table('turn', sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_message', sa.Text(), nullable=True), sa.Column('chatbot_message', sa.Text(), nullable=True), sa.Column('conversation_id', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['conversation_id'], ['conversation.id'], ), sa.PrimaryKeyConstraint('id') ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('turn') op.drop_index(op.f('ix_conversation_start_time'), table_name='conversation') op.drop_table('conversation') op.drop_index(op.f('ix_user_name'), table_name='user') op.drop_table('user') op.drop_index(op.f('ix_chatbot_name'), table_name='chatbot') op.drop_table('chatbot') # ### end Alembic commands ### ================================================ FILE: webpage/requirements.txt ================================================ gunicorn==19.6.0 tensorflow>=1.1.0 alembic==0.9.1 Flask==0.12.1 Flask_Admin==1.5.0 Flask_BasicAuth==0.2.0 Flask_Cors==3.0.2 Flask_Migrate==2.0.3 Flask_Moment==0.5.1 Flask_PageDown==0.2.2 Flask_RESTful==0.3.5 Flask_Script==2.0.5 Flask_SQLAlchemy==2.1 Flask_WTF==0.14.2 numpy==1.11.0 SQLAlchemy==1.1.9 Werkzeug==0.12.1 WTForms==2.1 protobuf==3.3.0 PyYAML==3.12 sqlalchemy_migrate==0.11.0 psycopg2==2.6.1 whitenoise==2.0.6 requests==2.9.1 ================================================ FILE: webpage/runtime.txt ================================================ python-3.5.2 ================================================ FILE: webpage/tests/__init__.py ================================================ ================================================ FILE: webpage/tests/test_database.py ================================================ """Unit tests for the application.""" from flask import current_app from flask import request from deepchat import create_app, db from deepchat.models import User, Conversation, Chatbot, Turn import sys import unittest import sqlite3 import sqlalchemy class TestDatabase(unittest.TestCase): def setUp(self): """Called before running a test.""" self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() def tearDown(self): """Called after running a test.""" db.session.remove() db.drop_all() self.app_context.pop() def test_app_exists(self): self.assertFalse(current_app is None) ================================================ FILE: webpage/tests/test_simple.py ================================================ """Unit tests for the application.""" import unittest from flask import current_app from deepchat import create_app, db class TestSimple(unittest.TestCase): """Simple tests - ensuring the app can open/access database/etc.""" def setUp(self): """Called before running a test.""" self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() def tearDown(self): """Called after running a test.""" db.session.remove() db.drop_all() self.app_context.pop() def test_app_exists(self): self.assertFalse(current_app is None) def test_app_is_testing(self): """Ensure we can access the right config specifications.""" self.assertTrue(current_app.config['TESTING'])