[
  {
    "path": ".gitignore",
    "content": "*.pyc\n.idea\n.scrapy\nrun\nbuild\natlassian-ide-plugin.xml\n.project\n.pydevproject\n.env\n*.log\n*.sqlite3\n.ropeproject/\n"
  },
  {
    "path": "conf/nginx.conf",
    "content": "#user www-data;\nworker_processes 1;\npid logs/nginx.pid;\nerror_log logs/error.log info; \n\nevents {\n    use epoll;\n\tworker_connections 1024;\n\tmulti_accept on;\n}\n\nhttp {\n    include mime.types;\n    default_type application/octet-stream;\n\n    log_format info  '$remote_addr - $remote_user [$time_local] \"$request\" '\n                      '$status $body_bytes_sent \"$http_referer\" '\n                      '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n    \n    access_log  logs/access.log  info;\n\n    keepalive_timeout 60;\n\n    tcp_nodelay on;\n    \n    gzip on;\n\n    include extra/the5fire.conf;\n}\n\n"
  },
  {
    "path": "conf/supervisord.conf",
    "content": "[unix_http_server]\nfile=/home/the5fire/tmp/supervisor.sock   ; (the path to the socket file)\n;chmod=0700                 ; socket file mode (default 0700)\n;chown=root:root       ; socket file uid:gid owner\n;username={{ username }}              ; (default is no username (open server))\n;password={{ password }}               ; (default is no password (open server))\n\n[supervisord]\nlogfile=/home/the5fire/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)\nlogfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)\nlogfile_backups=10           ; (num of main logfile rotation backups;default 10)\nloglevel=info                ; (log level;default info; others: debug,warn,trace)\npidfile=/home/the5fire/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)\nnodaemon=false               ; (start in foreground if true;default false)\nminfds=1024                  ; (min. avail startup file descriptors;default 1024)\nminprocs=200                 ; (min. avail process descriptors;default 200)\n;umask=022                   ; (process file creation umask;default 022)\n;user=chrism                 ; (default is current user, required if root)\n;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')\n;directory=/tmp              ; (default is not to cd during start)\n;nocleanup=true              ; (don't clean up tempfiles at start;default false)\n;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)\n;environment=KEY=value       ; (key value pairs to add to environment)\n;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)\n\n[supervisorctl]\nserverurl=unix:///home/the5fire/tmp/supervisor.sock ; use a unix:// URL  for a unix socket\n;username={{ username }}              ; should be same as http_username if set\n;password={{ password }}                ; should be same as http_password if set\n;prompt=mysupervisor         ; cmd line prompt (default \"supervisor\")\nhistory_file=/home/the5fire/.sc_history  ; use readline history if available\n\n; the below section must remain in the config file for RPC\n; (supervisorctl/web interface) to work, additional interfaces may be\n; added by defining them in separate rpcinterface: sections\n[rpcinterface:supervisor]\nsupervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface\n\n[program:selfblog]\ncommand=/home/the5fire/bin/gunicorn selfblog.wsgi:application --bind 127.0.0.1:2116%(process_num)1d  --workers 2\ndirectory=/home/the5fire/selfblog\nprocess_name=%(program_name)s_%(process_num)d\numask=022\nstartsecs=0\nstopwaitsecs=0\nredirect_stderr=true\nstdout_logfile=/home/the5fire/tmp/supervisord_stdout_%(process_num)02d.log\nnumprocs=1\nnumprocs_start=0\n"
  },
  {
    "path": "conf/the5fire.conf",
    "content": "upstream the5fire{\n    server 127.0.0.1:11115;\n    server 127.0.0.1:11116;\n}\n\nserver {\n    listen 8080;\n\n    server_name the5fire.com www.the5fire.com;\n\n    charset utf-8;\n\n    location /static/ {\n        alias /home/the5fire/selfblog/static/;\n    }\n\n    location / {\n        proxy_pass http://the5fire;\n        proxy_intercept_errors on;\n        proxy_redirect off;\n        proxy_connect_timeout 60;\n        proxy_set_header Host   $host;\n    }\n}\n"
  },
  {
    "path": "deploy-blog-simple.yml",
    "content": "---\n- hosts: local  # hosts中指定\n  remote_user: the5fire  # 如果和当前用户一样，则无需指定\n  tasks:\n    - name: check out django_blog\n      git: dest=~/demos/django_selfblog repo=https://github.com/the5fire/django_selfblog\n           update=yes\n    - name: make virtualenv\n      shell: 'virtualenv ~/demos'\n    - name: install requirements\n      pip: requirements=~/demos/django_selfblog/requirements.txt \n           virtualenv=~/demos\n    - name: init database\n      shell: . ./bin/activate && cd django_selfblog/selfblog && ./init_database.sh chdir=~/demos\n    - name: run manage.py\n      shell: . ./bin/activate && cd django_selfblog/selfblog &&  ./run.sh chdir=~/demos\n"
  },
  {
    "path": "fabfile/__init__.py",
    "content": "#coding:utf-8\n\nfrom fabric.api import run, roles, cd, parallel, task\nfrom fabric.state import env\n\nwww_path = '/home/the5fire/selfblog'\nsupervisord_bin_path = '/home/the5fire/bin'\nsupervisord_conf_file = '/home/the5fire/conf/supervisord.conf'\n\nenv.roledefs = {\n    'server': ['root@xxx.xxx.xxx']\n}\n\n\n@task\n@roles('server')\ndef host_type():\n    run('uname -s')\n\n\n@task\n@parallel(22)\n@roles('server')\ndef top():\n    run(\"top -b | head -n 1\")\n\n\ndef git_co(path, branch='master'):\n    with(cd(path)):\n        run('git reset --hard && git pull -f && git checkout %s' % branch)\n\n\ndef supervisord_restart(path, conf_path):\n    with(cd(path)):\n        run('./supervisorctl -c %s restart all' % (conf_path, ))\n\n\n@task\n@roles('server')\ndef re_deploy(branch='django15'):\n    git_co(www_path, branch=branch)\n    supervisord_restart(supervisord_bin_path, supervisord_conf_file)\n\n\n@task\n@roles('server')\ndef re_mem():\n    run(\"ps aux|grep 'the5fire/memcached' | grep -v 'grep' | awk '{print $2}' | xargs kill -9\")\n    run(\"memcached -d -m memory -s /home/the5fire/memcached.sock -P /home/the5fire/memcached.pid\")\n"
  },
  {
    "path": "readme.rst",
    "content": "=======================\nthe5fire的技术博客源码\n=======================\n\n博客地址: http://the5fire.com\n\n微信号:\n\n.. image:: http://the5fireblog.b0.upaiyun.com/staticfile/getqrcode.jpeg\n\n概述\n-------------------------------\n本博客系统基于Django1.5.1开发而成，通过gunicorn运行于Webfaction上，Python版本为2.7.4, 更多描述看这里：\n`说说我这个博客的架构 <http://www.the5fire.com/blog-architecture.html>`_ ,其中Django的版本后来被升级为1.6.1的。\n\n功能\n-----------------------------\n1. 文章、分类和页面的增删改查\n2. 通过rst格式或者html格式书写文章正文\n3. 侧边栏的组件化调整（目前比较弱）\n4. 集成多说的评论\n5. RSS和rpc\n6. 其他的自己看把，博客上能看到的功能代码都在这里了\n\n2014-05-02添加\n--------------------------------\n微信自动回复接口\n\n\n2014-05-31\n-------------------------------\n后台修改为xadmin（0.5v）\n\n2016-07-02\n-------------------------------\n* Post增加is_md字段，增加对markdown格式的支持\n* 拆分settings.py文件为develop.py,product.py让配置更清晰\n* 通过DJANGOSELFBLOG_PROFILE来加载对应的配置develop/product\n* 修复创建Post时不填英文标题导致的文章无法访问的bug\n\n\n哪些技术\n------------------------------\n主要是对Django的Class-Base View的一个实践。另外也是项目开发、部署、维护的基本流程的演练。\n技术都在架构里有说。\n\n\n如何使用\n-----------------------------\n安装virtualenv::\n\n    sudo pip install virtualenv\n\n创建虚拟环境::\n\n    virtualenv www\n\n把项目放到www目录，cd到目录中，执行::\n\n    cd www\n    # 激活虚拟环境\n    source bin/activate\n    # 安装依赖包\n    pip install -r requirements.txt\n\n创建数据库或表::\n\n    # 针对sqlite3,mysql的话需要先创建数据库然后修改settings中的配置\n    # 在django_selfblog/selfblog目录下执行\n    python manage.py syncdb\n\n\n运行::\n\n    # 直接运行\n    python manage.py runserver\n\n    #或者用gunicorn\n    gunicorn selfblog.wsgi:application\n\n访问::\n\n    http://localhost:8000\n\n部署注意::\n\n    需要修改settings中关于debug模式的判断\n    需要修改数据库的设置\n    需要修改DOMAIN和admin邮箱的设置\n    ...\n\n\n帮忙改善\n-----------------------\n本来打算在完善一些代码，再发出来，怎奈有太多的东西要学习，不能立马开始完善。遂想不如拿出来让大家一起改进。\n\n\n分享你的blog\n----------------------\n我建了个ISSUE，方便用此源码的同学分享自己搭建的成果：https://github.com/the5fire/django_selfblog/issues/2\n\n使用ansible一键部署\n---------------------------\n写了一个ansible的脚本: `deploy-blog-simple.yml <deploy-blog-simple.yml>`_\n\n在配置好ansible之后，可以一句话完成部署操作::\n\n    $ ansible-play deploy-blog-simple.yml\n\n这样执行完成之后，程序会在你配置好的服务器上自动的搭建虚拟环境，并安装依赖，启动blog程序，监听在8000端口，直接可以通过ip+端口进行访问: http://your-ip:8000 ，后台地址:http://your-ip:8000/xadmin 。\n\n**用户名/密码** 均为 **the5fire**\n\n不了解ansible的童鞋可以看下这里: `ansible中文指南 <http://www.the5fire.com/ansible-guide-cn.html>`_\n\n来个截图看看:\n\n.. image:: img/quick-glance.png\n\n\n更新后xadmin的后台图:\n\n.. image:: img/xadmin-screen.png\n"
  },
  {
    "path": "requirements.txt",
    "content": "Django==1.6\n-e git+https://github.com/duoshuo/duoshuo-python-sdk.git#egg=duoshuo-python-sdk\ndjango-pingback\ndjango-xmlrpc==0.1.4\ngunicorn==18.0\nBeautifulSoup==3.2.1\nsupervisor==3.0\nDocutils==0.11\nPygments==1.6\nMySQL-python\npython-memcached==1.53\ndjango-debug-toolbar==0.10.2\ndjango-xadmin==0.5.0\ndjango-ipware\nmarkdown\n"
  },
  {
    "path": "selfblog/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/blog/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/blog/adminx.py",
    "content": "# coding:utf-8\nimport markdown\nimport xadmin\nfrom django.core import urlresolvers\n\nfrom .models import Post\nfrom .models import Category\nfrom .models import Page\nfrom .models import Widget\nfrom utils.markup import restructuredtext\n\n\nclass PostAdmin(object):\n    search_fields = ('title', 'alias')\n    fields = ('content', 'summary', 'title', 'alias', 'tags', 'status',\n              'category', 'is_top', 'is_old', 'pub_time')\n    list_display = ('preview', 'title', 'category', 'is_top', 'pub_time')\n    list_display_links = ('title', )\n\n    ordering = ('-pub_time', )\n    list_per_page = 15\n    save_on_top = True\n\n    def preview(self, obj):\n        url_edit = urlresolvers.reverse('xadmin:blog_post_change', args=(obj.id,))\n        return u'''\n                    <span><a href=\"/%s.html\" target=\"_blank\">预览</a></span>\n                    <span><a href=\"%s\" target=\"_blank\">编辑</a></span>\n                ''' % (obj.alias, url_edit)\n\n    preview.short_description = u'操作'\n    preview.allow_tags = True\n\n    def save_models(self):\n        obj = self.new_obj\n        obj.author = self.request.user\n        if not obj.summary:\n            obj.summary = obj.content\n\n        if obj.is_md:\n            obj.content_html = markdown.markdown(obj.content, extensions=['codehilite'])\n        elif not obj.is_old:\n            obj.content_html = restructuredtext(obj.content)\n        else:\n            obj.content_html = obj.content.replace('\\r\\n', '<br/>')\n            import re\n            obj.content_html = re.sub(r\"\\[cc lang='\\w+?'\\]\", '<pre>', obj.content_html)\n            obj.content_html = obj.content_html.replace('[/cc]', '</pre>')\n        obj.save()\n\n\nclass CategoryAdmin(object):\n    search_fields = ('name', 'alias')\n    list_display = ('name', 'rank', 'is_nav', 'status', 'create_time')\n\n\nclass PageAdmin(object):\n    search_fields = ('name', 'alias')\n    fields = ('title', 'alias', 'link', 'content', 'is_html', 'status', 'rank')\n    list_display = ('title', 'link', 'rank', 'status', 'is_html')\n\n    def save_models(self):\n        obj = self.new_obj\n        obj.author = self.request.user\n        if obj.is_html:\n            obj.content_html = obj.content\n        else:\n            obj.content_html = restructuredtext(obj.content)\n        obj.save()\n\n\nclass WidgetAdmin(object):\n    search_fields = ('name', 'alias')\n    fields = ('title', 'content', 'rank', 'hide')\n    list_display = ('title', 'rank', 'hide')\n\n\nxadmin.site.register(Post, PostAdmin)\nxadmin.site.register(Category, CategoryAdmin)\nxadmin.site.register(Page, PageAdmin)\nxadmin.site.register(Widget, WidgetAdmin)\n"
  },
  {
    "path": "selfblog/blog/management/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/blog/management/commands/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/blog/management/commands/format_old.py",
    "content": "#coding:utf-8\nfrom django.core.management.base import BaseCommand\n\nfrom blog.models import Post\n\n\nclass Command(BaseCommand):\n    args = 'no'\n    help = 'import old post'\n\n    def handle(self, *args, **options):\n        format_all()\n\n\ndef format_all():\n    posts = Post.objects.filter(is_old=True)\n\n    for post in posts:\n        print post.title \n        #处理代码\n        post.content = post.content.replace(\"[cc lang=\\'python\\']\", '<pre class=\"code literal-block\">').replace(\"[/cc]\", \"</pre>\")\n        #处理换行\n        post.content_html = post.content.replace('\\n\\n', '<br/>').replace('\\n', '<br/>')\n        post.save()\n"
  },
  {
    "path": "selfblog/blog/management/commands/import_old.py",
    "content": "#coding:utf-8\nimport re\nfrom datetime import datetime\ntry:\n    import xml.etree.cElementTree as ET\nexcept ImportError:\n    import xml.etree.ElementTree as ET\n\nfrom django.core.management.base import BaseCommand\nfrom django.contrib.auth.models import User\n\nfrom blog.models import Post, Category\n\n\nclass Command(BaseCommand):\n    args = 'no'\n    help = 'import old post'\n\n    def handle(self, *args, **options):\n        parse_xml()\n\n\ndef parse_xml():\n    et = ET.ElementTree(file='/home/the5fire/Downloads/the5fire.xml')\n    root = et.getroot()\n    user = User.objects.get(username='the5fire')\n    count = 1\n    alias_re = re.compile(r'^[a-z|0-9|\\-]+$')\n\n    for channel in root.findall('channel'):\n        for item in channel.findall('item'):\n            title = item.find('title')\n            post_name = item.find('{http://wordpress.org/export/1.2/}post_name')\n            pubDate = item.find('pubDate')\n            description = item.find('description')\n            content = item.find('{http://purl.org/rss/1.0/modules/content/}encoded')\n            categories = item.findall('category')\n            tags = []\n            category = Category()\n            for ca in categories:\n                if ca.attrib['domain'] == 'post_tag':\n                    tags.append(ca.text)\n                else:\n                    try:\n                        category = Category.objects.get(name=ca.text)\n                    except Category.DoesNotExist:\n                        category.name = ca.text\n                        if alias_re.match(ca.attrib['nicename']):\n                            category.alias = ca.attrib['nicename']\n                        else:\n                            category.alias = category.name\n                        print category.alias\n                        category.save()\n            try:\n                Post.objects.get(title=title.text)\n                print title.text, 'already exist'\n                continue\n            except Post.DoesNotExist:\n                pass \n\n            post = Post()\n            post.title = title.text\n            post.category = category \n            if alias_re.match(post_name.text):\n                post.alias = post_name.text\n            else:\n                post.alias = title.text \n            print post.alias\n            post.content = content.text\n            post.content_html = content.text\n            if not description.text:\n                post.summary = content.text[:140]\n            else:\n                post.summary = description.text\n            post.is_old = True\n            post.tags = ','.join(tags)\n            create_time = pubDate.text[:-6]\n            tf = '%a, %d %b %Y %H:%M:%S'\n            post.old_pub_time = datetime.strptime(create_time, tf)\n            print post.old_pub_time\n            post.author = user \n            try:\n                post.save()\n                print count, post\n                count += 1\n            except Exception, e:\n                print e\n\n"
  },
  {
    "path": "selfblog/blog/management/commands/replace_net.py",
    "content": "#coding:utf-8\nfrom django.core.management.base import BaseCommand\n\nfrom blog.models import Post\n\n\nclass Command(BaseCommand):\n    args = 'no'\n    help = 'import old post'\n\n    def handle(self, *args, **options):\n        replace_all()\n\n\ndef replace_all():\n    posts = Post.objects.filter(is_old=True)\n\n    for post in posts:\n        #print post.title \n        #处理代码\n        index = post.content.find('the5fire.net')\n        if index > 0:\n            print post.title\n            post.content = post.content.replace(\"www.the5fire.net\", 'www.the5fire.com')\n            post.content_html = post.content_html.replace(\"www.the5fire.net\", 'www.the5fire.com')\n            post.save()\n"
  },
  {
    "path": "selfblog/blog/middleware.py",
    "content": "#coding:utf-8\nimport time\nimport logging\n\nfrom ipware.ip import get_real_ip\n\nfrom utils.cache import cache\n\nlogger = logging.getLogger(__name__)\n\n\nclass OnlineMiddleware(object):\n    def process_request(self, request):\n        self.start_time = time.time()\n\n    def process_view(self, request, view_func, view_args, view_kwargs):\n        \"\"\"\n        处理当前在线人数\n        \"\"\"\n        http_user_agent = request.META.get('HTTP_USER_AGENT', [])\n        if 'Spider' in http_user_agent or 'spider' in http_user_agent:\n            return\n\n        online_ips = cache.get(\"online_ips\", [])\n\n        if online_ips:\n            online_ips = cache.get_many(online_ips).keys()\n\n        ip = get_real_ip(request)\n\n        cache.set(ip, 0, 5 * 60)\n\n        if ip not in online_ips:\n            online_ips.append(ip)\n\n        cache.set(\"online_ips\", online_ips)\n\n    def process_response(self, request, response):\n        cast_time = time.time() - self.start_time\n        response.content = response.content.replace('<!!LOAD_TIMES!!>', str(cast_time)[:5])\n        return response\n"
  },
  {
    "path": "selfblog/blog/models.py",
    "content": "# coding:utf-8\nfrom datetime import datetime\n\nfrom django.contrib.auth.models import User\nfrom django.db import models\nfrom django.db.models import signals\nfrom django.dispatch import receiver\nfrom django.utils.functional import cached_property\n\nfrom django.conf import settings\nfrom utils.cache import cache_decorator\n\nSTATUS = {\n    0: u'正常',\n    1: u'草稿',\n    2: u'删除',\n}\n\n\nclass Category(models.Model):\n    name = models.CharField(max_length=40, verbose_name=u'名称')\n    alias = models.CharField(max_length=40, verbose_name=u'英文名')\n\n    is_nav = models.BooleanField(default=False, verbose_name=u'是否在导航位置显示')\n\n    parent = models.ForeignKey('self', default=None, blank=True, null=True, verbose_name=u'上级分类')\n    desc = models.CharField(max_length=100, blank=True, verbose_name=u'描述', help_text=u'点击分类之后显示')\n\n    rank = models.IntegerField(default=0, verbose_name=u'展示排序')\n    status = models.IntegerField(default=0, choices=STATUS.items(), verbose_name=u'状态')\n\n    create_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n    update_time = models.DateTimeField(u'更新时间', auto_now=True)\n\n    def __unicode__(self):\n        if self.parent:\n            return '%s:%s' % (self.parent, self.name)\n        else:\n            return '%s' % (self.name)\n\n    @classmethod\n    @cache_decorator(1*60)\n    def available_list(cls):\n        return cls.objects.filter(status=0)\n\n    class Meta:\n        ordering = ['rank', '-create_time']\n        verbose_name_plural = verbose_name = u\"分类\"\n        app_label = u'博客'\n\n\nclass Post(models.Model):\n    author = models.ForeignKey(User, verbose_name=u'作者')\n    category = models.ForeignKey(Category, verbose_name=u'分类')\n\n    title = models.CharField(max_length=100, verbose_name=u'标题')\n    alias = models.CharField(max_length=100, db_index=True, blank=True, null=True, verbose_name=u'英文标题', help_text=u'做伪静态url用')\n    is_top = models.BooleanField(default=False, verbose_name=u'置顶')\n\n    summary = models.TextField(verbose_name=u'摘要')\n    content = models.TextField(verbose_name=u'文章正文rst/md格式')\n\n    content_html = models.TextField(verbose_name=u'文章正文html')\n    view_times = models.IntegerField(default=1)\n\n    tags = models.CharField(max_length=100, null=True, blank=True, verbose_name=u'标签', help_text=u'用英文逗号分割')\n    status = models.IntegerField(default=0, choices=STATUS.items(), verbose_name=u'状态')\n\n    is_md = models.BooleanField(default=False, verbose_name=u'是否为Markdown格式')\n    is_old = models.BooleanField(default=False, verbose_name=u'是否为旧数据')\n    pub_time = models.DateTimeField(default=datetime.now, verbose_name=u'发布时间')\n\n    create_time = models.DateTimeField(u'创建时间', auto_now_add=True, editable=True)\n    update_time = models.DateTimeField(u'更新时间', auto_now=True)\n\n    def __unicode__(self):\n        return self.title\n\n    def tags_list(self):\n        return [tag.strip() for tag in self.tags.split(',')]\n\n    def get_absolute_url(self):\n        return '%s/%s.html' % (settings.DOMAIN, self.alias)\n\n    @cached_property\n    def next_post(self):\n        # 下一篇\n        return Post.objects.filter(id__gt=self.id, status=0).order_by('id').first()\n\n    @cached_property\n    def prev_post(self):\n        # 前一篇\n        return Post.objects.filter(id__lt=self.id, status=0).first()\n\n    @classmethod\n    @cache_decorator(1*60)\n    def get_recently_posts(cls, num):\n        return cls.objects.values('title', 'alias')\\\n            .filter(status=0).order_by('-create_time')[:num]\n\n    @classmethod\n    @cache_decorator(1*60)\n    def get_hots_posts(cls, num):\n        return cls.objects.values('title', 'alias')\\\n            .filter(status=0).order_by('-view_times')[:num]\n\n    @cache_decorator(3*60)\n    def related_posts(self):\n        related_posts = None\n        try:\n            related_posts = Post.objects.values('title', 'alias').\\\n                filter(tags__icontains=self.tags_list()[0]).\\\n                exclude(id=self.id)[:10]\n        except IndexError:\n            pass\n\n        if not related_posts:\n            related_posts = Post.objects.values('title', 'alias').\\\n                filter(category=self.category).\\\n                exclude(id=self.id)[:10]\n\n        return related_posts\n\n    class Meta:\n        ordering = ['-is_top', '-pub_time', '-create_time']\n        verbose_name_plural = verbose_name = u\"文章\"\n        app_label = u'博客'\n\n\n@receiver(signals.post_save, sender=Post)\ndef check_or_update_post_alias(sender, instance=None, **kwargs):\n    # 如果alias未设置则使用id\n    if not instance.alias:\n        instance.alias = instance.id\n        instance.save()\n\n\nclass Page(models.Model):\n    author = models.ForeignKey(User, verbose_name=u'作者')\n    title = models.CharField(max_length=100, verbose_name=u'标题')\n\n    alias = models.CharField(max_length=100, blank=True, null=True, verbose_name=u'英文标题', help_text=u'做伪静态url用')\n    content = models.TextField(verbose_name=u'page正文')\n\n    content_html = models.TextField(verbose_name=u'page正文html')\n    is_html = models.BooleanField(default=False, verbose_name=u'html代码')\n\n    link = models.CharField(max_length=200, blank=True, null=True, verbose_name=u'链接', help_text=u'该链接存在时其它内容无效')\n\n    rank = models.IntegerField(default=1, verbose_name=u'排序', help_text=u'从右到左的顺序')\n    status = models.IntegerField(default=0, choices=STATUS.items(), verbose_name=u'状态')\n\n    create_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n    update_time = models.DateTimeField(u'更新时间', auto_now=True)\n\n    def __unicode__(self):\n        return self.title\n\n    class Meta:\n        ordering = ['-rank', '-create_time']\n        verbose_name_plural = verbose_name = u\"页面\"\n        app_label = u'博客'\n\n\nclass Widget(models.Model):\n    title = models.CharField(max_length=100, verbose_name=u'标题')\n\n    content = models.TextField(verbose_name=u'widget内容', help_text=u'html代码不会被转义')\n    hide = models.BooleanField(default=False, verbose_name=u'隐藏')\n\n    rank = models.IntegerField(default=0, verbose_name=u'展示排序')\n\n    create_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n    update_time = models.DateTimeField(u'更新时间', auto_now=True)\n\n    def __unicode__(self):\n        return self.title\n\n    @classmethod\n    @cache_decorator(1*60)\n    def available_list(cls):\n        return cls.objects.filter(hide=False)\n\n    class Meta:\n        ordering = ['rank', '-create_time']\n        verbose_name_plural = verbose_name = u\"侧栏组件\"\n        app_label = u'博客'\n"
  },
  {
    "path": "selfblog/blog/templates/404.html",
    "content": "{% extends \"base.html\" %}\n\n\n{% block main %}\n    噢，没有你要找的东西吗，到右边搜搜看！\n\n    </br/>\n{% endblock %}\n"
  },
  {
    "path": "selfblog/blog/templates/500.html",
    "content": "{% extends \"base.html\" %}\n\n\n{% block main %}\n哦，程序又抽了\n\n\n{% endblock %}\n"
  },
  {
    "path": "selfblog/blog/templates/base.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>{% block title %}{% endblock %}the5fire的技术博客</title>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n        <meta name=\"description\" content=\"{% block desc %}关于编程（java,python,js等）、设计模式、系统（linux）、开源、学习心得、工作经验–人生苦短，我用python{% endblock %}\">\n        <meta name=\"keywords\" content=\"{% block keywords %}python,linux,vim,web开发,工作经验,项目实战,教程{% endblock %}\">\n        <meta name=\"author\" content=\"the5fire\">\n        <meta name=\"baidu-site-verification\" content=\"L1tGNksWV2rt8zho\" />\n        <meta name=\"google-site-verification\" content=\"DBmuxv3lJezFBdzrzoueLXVbY6gJ6cdbR1mroGVRiNQ\" />\n        <link rel=\"pingback\" href=\"/xmlrpc/\" />\n        <link rel=\"shortcut icon\" href=\"/static/favicon.ico\" type=\"image/x-icon\" />\n\n        <link href=\"/static/bootstrap/css/bootstrap.min.css\" rel=\"stylesheet\">\n        <link href=\"/static/bootstrap/css/docs.css\" rel=\"stylesheet\">\n        <link href=\"/static/blog/css/style.css\" rel=\"stylesheet\">\n        {%  block extend_style %}{% endblock %}\n    </head>\n    <body>\n        <div class=\"navbar navbar-inverse navbar-fixed-top\">\n            <div class=\"navbar-inner\">\n                <div class=\"container\">\n                    <button type=\"button\" class=\"btn btn-navbar\" data-toggle=\"collapse\" data-target=\".nav-collapse\">\n                        <span class=\"icon-bar\"></span>\n                        <span class=\"icon-bar\"></span>\n                        <span class=\"icon-bar\"></span>\n                    </button>\n                    <div class=\"nav-collapse collapse\">\n                        <ul class=\"nav\">\n                            <li class=\"\">\n                                <a href=\"/\">首页</a>\n                            </li>\n                                {% for page in pages %}\n                            <li class=\"\">\n                                {% if page.link %}\n                                <a href=\"{{ page.link }}\">{{ page.title }}</a>\n                                {% else %}\n                                <a href=\"/{{ page.alias }}/\">{{ page.title }}</a>\n                                {% endif %}\n                            </li>\n                                {% endfor %}\n                        </ul>\n                    </div>\n                    <a class=\"brand\" href=\"/\">the5fire</a>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"container\" id=\"content\">\n            <header class=\"\" id=\"overview\">\n            <div class=\"row\">\n                <div class=\"span9\">\n                    <h1><a href=\"/\">the5fire的技术博客</a></h1>\n                    <div id=\"blogdesc\">关注python、vim、linux、web开发和互联网--life is short, we need python.</div>\n                </div>\n\n                <div class=\"span3\">\n                    <div id=\"search_box\">\n                        <form class=\"form-search\" method=\"get\" action=\"/\">\n                            <input type=\"text\" class=\"input-medium search-query\" value=\"\" name=\"s\" id=\"s\">\n                            <button type=\"submit\" class=\"btn\">搜索</button>\n                        </form>\n                    </div>\n                </div>\n            </div>\n            </header>\n\n            <div class=\"subnav under_line\">\n                <ul class=\"nav nav-pills\">\n                    {% for category in categories %}\n                    {% if category.is_nav %}\n                    <li><a href=\"/category/{{ category.alias }}/\">{{ category.name }}</a></li>\n                    {% endif %}\n                    {% endfor %}\n                </ul>\n            </div>\n            \n            <div class=\"row\">\n                <div id=\"main\" class=\"span9\">\n                    {% block main %}{% endblock %}\n                </div>\n\n                <div class=\"sidebar span3\">\n                    {% include \"includes/sidebar.html\" %}\n                </div>\n            </div>\n\n            <div class=\"\">\n                其他分类：\n                <ul class=\"nav nav-pills\">\n                    {% for category in categories %}\n                    {% if not category.is_nav %}\n                    <li><a href=\"/category/{{ category.alias }}/\">{{ category.name }}</a></li>\n                    {% endif %}\n                    {% endfor %}\n                </ul>\n            </div>\n        </div>\n        \n\n        {% include \"includes/footer.html\" %}\n        {%  block extend_js %}{% endblock %}\n    </body>\n</html>\n"
  },
  {
    "path": "selfblog/blog/templates/detail.html",
    "content": "{% extends \"base.html\" %}\n{% load duoshuo_tags %}\n\n{% block title %}{{ post.title }} | {% endblock %}\n{% block desc %}{{ post.summary|truncatewords:140 }}{%  endblock %}\n{% block keywords %}{{ post.tags }}{% endblock %}\n\n{% block extend_style %} \n{% if post.is_md %}\n<link href=\"/static/blog/css/codehilite.css\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\" />\n{% else %}\n<link href=\"/static/blog/css/code.css\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\" />\n{% endif %}\n{% endblock %}\n\n{% block main %}\n<div class=\"detail\">\n    <h2 class=\"under_line\">\n        {% autoescape off %}\n        <span>{{ post.title }}</span>\n        {% endautoescape %}\n    </h2>\n\n    {% if post %}\n\n    <div class=\"info\">\n        作者：{{ post.author }} \n        | 分类：<a href=\"/category/{{ post.category.alias }}\" title=\"查看 post.category.name 中的全部文章\" rel=\"category tag\">{{ post.category.name }}</a> \n        | 标签： \n        {% for tag in post.tags_list %}\n        <a href=\"/tag/{{ tag }}\" rel=\"tag\">{{ tag }}</a>&nbsp;\n        {% endfor %}\n        | 阅读 {{ post.view_times }}  次\n        | 发布：{{ post.pub_time|date:\"Y-m-d P\" }}\n        {% if user.is_authenticated %}\n            <a href=\"{% url 'xadmin:blog_post_change' post.id %}\" target=\"_blank\">edit</a>\n        {% endif %}\n    </div>\n\n    {% include 'includes/share.html' %}\n    \n    <div class=\"clear\"></div>\n\n    <div class=\"content\">\n        {% autoescape off %}\n        {{ post.content_html }}\n        {% endautoescape %}\n    </div>\n\n    {% include 'includes/share.html' %}\n\n    <div class=\"clear box\"></div>\n\n    <div class=\"box\">\n        <div class=\"row\">\n            <div class=\"span4\">\n                <b>相关文章</b>\n                <ul>\n                    {% for item in related_posts %}\n                    <li><a href=\"/{{ item.alias }}.html\">{{ item.title }}</a></li>\n                    {% endfor %}\n                </ul>\n            </div>\n            <div class=\"span4\">\n                <b>别人正在读</b>\n                <ul>\n                    {% for ip, post in lru_views %}\n                        {% if ip != cur_user_ip %}\n                        <li><a href=\"{{ post.get_absolute_url }}\">{{ post.title }}</a></li>\n                        {% endif %}\n                    {% endfor %}\n                </ul>\n            </div>\n        </div>\n    </div>\n\n    <div class=\"box\">\n        【上一篇】\n        {% if post.prev_post %}\n            <a href=\"{{ post.prev_post.get_absolute_url }}\">{{ post.prev_post.title }}</a>\n        {% else %}\n            没有了\n        {% endif %}\n        <br/>\n        【下一篇】\n        {% if post.next_post %}\n            <a href=\"{{ post.next_post.get_absolute_url }}\">{{ post.next_post.title }}</a>\n        {% else %}\n            没有了\n        {% endif %}\n    </div>\n    {% endif %}\n\n    <span id=\"comments\" name=\"comments\"></span>\n\n    {% duoshuo_comments %}\n\n    {% include \"pingback.html\" %}\n</div>\n{% endblock %}\n\n{%  block extend_js %}\n<script src=\"/static/blog/js/jquery-1.8.1.min.js\"></script>\n<script src=\"/static/bootstrap/js/bootstrap-dropdown.js\"></script>\n<script>\n$('.dropdown-toggle').dropdown()\n</script>\n{% endblock %}\n\n"
  },
  {
    "path": "selfblog/blog/templates/includes/footer.html",
    "content": "<footer class=\"footer\">\n<div class=\"container\">\n    <div class=\"row\">\n        <div class=\"span4\">\n        </div>\n        <div class=\"span4\">\n            <p>版权所有 © 2010-2016 }} <a href=\"http://www.the5fire.com\">the5fire.com</a></p>\n            <p>CC BY-NC-SA 3.0</p>\n            <p>\n            Powered by <a href=\"http://www.djangoproject.com\" target=\"_blank\">Django</a>.\n            </p>\n            <p>\n            Host on <a href=\"https://m.do.co/c/4b3f2684a507\" target=\"_blank\">DigitalOcean $5/月</a>.\n            <p>\n            当前{{ online_num }}人在线,表示毫无压力\n            {% if online_num > 50 %}\n            <strong>囧~</strong>\n            {% endif %}\n            {% if online_num < 10 %}\n            <strong>汗~</strong>\n            {% endif %}\n            </p>\n            <p>本页面加载耗时:<!!LOAD_TIMES!!>s</p>\n            <p>\n                <a href=\"/sitemap.xml\">网站地图</a>\n            </p>\n        </div>\n        <div class=\"span4\">\n        </div>\n    </div>\n</div>\n</footer>\n"
  },
  {
    "path": "selfblog/blog/templates/includes/share.html",
    "content": "<div class=\"row\">\n    <div class=\"btn-group span3 pull-right\">\n        <button style=\"height: 24px; margin-top: 4px; font-size:14px\" class=\"btn btn-info dropdown-toggle pull-right tohide\" data-toggle=\"dropdown\"><i class=\"icon icon-share-alt icon-white\"></i> 分享到 <span class=\"caret\"></span></button>\n        <ul class=\"dropdown-menu\">\n            <li><a target=\"blank\" href=\"http://share.baidu.com/s?type=text&amp;searchPic=0&amp;sign=on&amp;to=tsina&amp;url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">新浪微博</a></li>\n            <li><a target=\"blank\" href=\"http://share.baidu.com/s?type=text&amp;searchPic=0&amp;sign=on&amp;to=tqq&amp;url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">腾讯微博</a></li>\n            <li><a target=\"blank\" href=\"http://s.evernote.com/grclip?url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">印象笔记</a></li>\n            <li><a target=\"blank\" href=\"http://share.baidu.com/s?type=text&amp;searchPic=0&amp;sign=on&amp;to=douban&amp;url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">豆瓣</a></li>\n            <li><a target=\"blank\" href=\"http://share.baidu.com/s?type=text&amp;searchPic=0&amp;sign=on&amp;to=renren&amp;url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">人人网</a></li>\n            <li><a target=\"blank\" href=\"http://share.baidu.com/s?type=text&amp;searchPic=0&amp;sign=on&amp;to=qzone&amp;url={{ post.get_absolute_url }}&amp;title={{ post.title }}\">QQ空间</a></li>\n            <li class=\"divider\"></li>\n            <li><a href=\"mailto:?subject=[the5fire]好文分享：{{ post.title }}&amp;body={{ post.get_absolute_url }}\">E-Mail</a></li>\n        </ul>\n    </div>\n</div>\n"
  },
  {
    "path": "selfblog/blog/templates/includes/sidebar.html",
    "content": "<div class=\"widget\">\n    {% for widget in widgets %}\n    {% if widget.content == 'recently_post'%}\n    <h3 class=\"under_line\">{{ widget.title }}</h3>\n    <div class=\"textwidget\">\n        <ul>\n        {% with r_posts=recently_posts %}\n        {% if r_posts %}\n        {% for post in r_posts %}\n        <li>\n        <a rel=\"bookmark\" href=\"/{{ post.alias }}.html\" title=\"详细阅读 {{ post.title }}\">{{ post.title }}</a>\n        </li>            \n        {% endfor %}\n        {% endif %}\n        {% endwith %}\n        </ul>\n    </div>\n    {% else %}{% if widget.content == 'hot_post' %}\n    <h3 class=\"under_line\">{{ widget.title }}</h3>\n    <div class=\"textwidget\">\n        <ul>\n        {% with h_posts=hot_posts %}\n        {% if h_posts %}\n        {% for post in h_posts %}\n        <li>\n        <a rel=\"bookmark\" href=\"/{{ post.alias }}.html\" title=\"详细阅读 {{ post.title }}\">{{ post.title }}</a>\n        </li>            \n        {% endfor %}\n        {% endif %}\n        {% endwith %}\n        </ul>\n    </div>\n    {% else %}\n    <h3 class=\"under_line\">{{ widget.title }}</h3>\n    <div class=\"textwidget\">\n        {% autoescape off %}\n        {{ widget.content }}\n        {% endautoescape %}\n    </div>\n    {% endif %}{% endif %}\n    {% endfor %}\n</div>\n"
  },
  {
    "path": "selfblog/blog/templates/index.html",
    "content": "{% extends \"base.html\" %}\n{% load substring %}\n\n{% if title %}\n    {% block title %}{{ title }} {% endblock %}\n{% endif %}\n\n{% block main %}\n    {% with post_list=posts.object_list %}\n    {% if post_list %}\n    {% for post in post_list %}\n        <div class=\"article\">\n            <h2 class='under_line'>\n                <a href=\"{{ post.get_absolute_url }}\" rel=\"bookmark\" title=\"详细阅读 {{ post.title }}\">\n                    {% autoescape off %}{{ post.title }}{% endautoescape %}\n                </a>\n            </h2>\n            <div class=\"info\">\n                作者：the5fire\n                | 分类：<a href=\"/category/{{ post.category.alias }}\" title=\"查看 post.category.name 中的全部文章\" rel=\"category tag\">{{ post.category.name }}</a> \n                | 标签： \n                {% for tag in post.tags_list %}\n                <a href=\"/tag/{{ tag }}\" rel=\"tag\">{{ tag.strip }}</a>&nbsp;\n                {% endfor %}\n                | 阅读 {{ post.view_times }}  次 \n                | 发布：{{ post.pub_time|date:\"Y-m-d P\" }}\n                {% if user.is_authenticated %}\n                    <a href=\"{% url 'xadmin:blog_post_change' post.id %}\" target=\"_blank\">edit</a>\n                {% endif %}\n            </div>\n\n            <div class=\"clear\"></div>\n\n            <div class=\"entry_post\">\n                <span>\n                    <p>\n                    {% autoescape on %}\n                    {{ post.summary|truncatewords:140 }}\n                    {% endautoescape %}\n                    </p>\n                </span>\n                <span class=\"pull-right\"><a href=\"{{ post.get_absolute_url }}\" title=\"{{ post.title }}\" rel=\"bookmark\">阅读全文</a></span>\n            </div>\n\n            <div class=\"clear\"></div>\n        </div>\n        <div class=\"clear\"></div>\n    {% endfor %}\n    {% endif %}\n    {% endwith %}\n        <hr/>\n        <div class=\"pagination pagination-centered pagination-small\">\n            <ul>\n                {% if posts.number <= 1 %}\n                    <li class=\"disabled\"><a>上一页</a></li>\n                {% else %}\n                    {% if query %}\n                    <li><a href=\"?s={{ query }}&page={{ posts.number|add:-1 }}\">上一页</a></li>\n                    {% else %}\n                    <li><a href=\"?page={{ posts.number|add:-1 }}\">上一页</a></li>\n                    {% endif %}\n                    {% for i in 'abcde'|make_list %}\n                        {% if posts.number|sub:forloop.revcounter > 0 %}\n                            {% if query %}\n                        <li><a href=\"?s={{ query }}&page={{ posts.number|sub:forloop.revcounter }}\">{{ posts.number|sub:forloop.revcounter }}</a></li>\n                            {% else %}\n                        <li><a href=\"?page={{ posts.number|sub:forloop.revcounter }}\">{{ posts.number|sub:forloop.revcounter }}</a></li>\n                            {% endif %}\n                        {% endif %}\n                    {% endfor %}\n                {% endif %}\n\n                <li class=\"active\"><a>{{ posts.number }}</a></li>\n\n                {% if posts.number < posts.paginator.num_pages %}\n                    {% for i in 'abcde'|make_list %}\n                        {% if posts.number|add:forloop.counter < posts.paginator.num_pages %}\n                            {% if query %}\n                            <li><a href=\"?s={{ query }}&page={{ posts.number|add:forloop.counter }}\">{{ posts.number|add:forloop.counter }}</a></li>\n                            {% else %}\n                            <li><a href=\"?page={{ posts.number|add:forloop.counter }}\">{{ posts.number|add:forloop.counter }}</a></li>\n                            {% endif %}\n                        {% endif %}\n                    {% endfor %}\n                    {% if query %}\n                    <li><a href=\"?s={{ query }}&page={{ posts.number|add:1 }}\">下一页</a></li>\n                    {% else %}\n                    <li><a href=\"?page={{ posts.number|add:1 }}\">下一页</a></li>\n                    {% endif %}\n                {% else %}\n                    <li class=\"disabled\"><a>下一页</a></li>\n                {% endif %}\n            </ul>\n        </div>\n{% endblock %}\n"
  },
  {
    "path": "selfblog/blog/templates/page.html",
    "content": "{% extends \"base.html\" %}\n{% load duoshuo_tags substring %}\n{% block title %}{{ page.title }} | {% endblock %}\n{% block desc %}{{ page.content|truncatewords:140 }}{%  endblock %}\n{% block keywords %}{% for tag in page.tags_list %}{{ tag }},{% endfor %}{% endblock %}\n{% block main %}\n<div class=\"detail\">\n    <h2>\n        <span>{{ page.title }}</span>\n    </h2>\n\n    <div class=\"info\">\n        作者：{{ page.author }} \n        | 发布：{{ page.create_time|date:\"Y-m-d P\" }}\n    </div>\n    \n    <div class=\"clear\"></div>\n\n    <div class=\"content\">\n        {% autoescape off %}\n        {{ page.content_html }}\n        {% endautoescape %}\n    </div>\n\n    {% duoshuo_comments %}\n</div>\n{% endblock %}\n"
  },
  {
    "path": "selfblog/blog/templates/pingback.html",
    "content": "{% load i18n pingback_tags %}\n{% load pingback_tags %}\n{% get_pingback_list for object as pingbacks %}\n{% get_pingback_count for object as pingback_count %}\n{% if pingbacks %}\n<h3>{{ pingback_count }} Pingbacks</h3>\n<div class=\"b-pingback\">\n    {% for pingback in pingbacks %}\n    <li class=\"b-meta\">\n    <a href=\"{{ pingback.get_absolute_url }}\"></a>{{ pingback.date|date:\"M d, Y\" }}: <a name=\"pingback-{{ pingback.id }}\" href=\"{{ pingback.url }}\" class=\"b-permlink\">{{ pingback.title }}</a>\n    </li>\n    {% endfor %}\n</div>\n{% endif %}\n"
  },
  {
    "path": "selfblog/blog/templates/sitemap.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset\n    xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n    xmlns:news=\"http://www.google.com/schemas/sitemap-news/0.9\">\n    {% spaceless %}\n    {% for url in urlset %}\n    <url>\n        <loc>{{ url.location }}</loc>\n        {% if url.lastmod %}<lastmod>{{ url.lastmod|date:\"Y-m-d\\TH:i:s+08:00\" }}</lastmod>{% endif %}\n        {% if url.changefreq %}<changefreq>{{ url.changefreq }}</changefreq>{% endif %}\n        {% if url.priority %}<priority>{{ url.priority }}</priority>{% endif %}\n    </url>\n    {% endfor %}\n    {% endspaceless %}\n</urlset>\n"
  },
  {
    "path": "selfblog/blog/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/blog/templatetags/substring.py",
    "content": "#coding:utf-8\n\nfrom django import template\n\nregister = template.Library()\n\n\n@register.filter(name='substring')\ndef substring(value, length):\n    if not value:\n        return u'无摘要'\n\n    if len(value) > length:\n        return '%s...' % value[:length]\n    return value[:length]\n\n\n@register.filter(name='sub')\ndef sub(value, param):\n    if not value:\n        return value\n    try:\n        value = int(value)\n        param = int(param)\n    except TypeError:\n        return value\n    return value - param\n"
  },
  {
    "path": "selfblog/blog/tests.py",
    "content": "\"\"\"\nThis file demonstrates writing tests using the unittest module. These will pass\nwhen you run \"manage.py test\".\n\nReplace this with more appropriate tests for your application.\n\"\"\"\n\nfrom django.test import TestCase\n\n\nclass SimpleTest(TestCase):\n    def test_basic_addition(self):\n        \"\"\"\n        Tests that 1 + 1 always equals 2.\n        \"\"\"\n        self.assertEqual(1 + 1, 2)\n"
  },
  {
    "path": "selfblog/blog/views.py",
    "content": "# coding:utf-8\nimport logging\n\nfrom django.db.models import Q\nfrom django.db.models import F\nfrom django.core.paginator import Paginator\nfrom django.views.generic import ListView, DetailView\nfrom django.shortcuts import render\nfrom ipware.ip import get_real_ip\n\nfrom django.conf import settings\nfrom .models import Post, Category, Page, Widget\nfrom utils.cache import LRUCacheDict, cache\n\nlogger = logging.getLogger(__name__)\n\n\nclass BaseMixin(object):\n\n    def get_context_data(self, *args, **kwargs):\n        if 'object' in kwargs or 'query' in kwargs:\n            context = super(BaseMixin, self).get_context_data(**kwargs)\n        else:\n            context = {}\n\n        try:\n            context['categories'] = Category.available_list()\n            context['widgets'] = Widget.available_list()\n            context['recently_posts'] = Post.get_recently_posts(settings.RECENTLY_NUM)\n            context['hot_posts'] = Post.get_hots_posts(settings.HOT_NUM)\n            context['pages'] = Page.objects.filter(status=0)\n            context['online_num'] = len(cache.get('online_ips', []))\n        except Exception as e:\n            logger.exception(u'加载基本信息出错[%s]！', e)\n\n        return context\n\n\nclass IndexView(BaseMixin, ListView):\n    query = None\n    template_name = 'index.html'\n\n    def get(self, request, *args, **kwargs):\n        try:\n            self.cur_page = int(request.GET.get('page', 1))\n        except TypeError:\n            self.cur_page = 1\n\n        if self.cur_page < 1:\n            self.cur_page = 1\n\n        return super(IndexView, self).get(request, *args, **kwargs)\n\n    def get_context_data(self, **kwargs):\n        paginator = Paginator(self.object_list, settings.PAGE_NUM)\n        kwargs['posts'] = paginator.page(self.cur_page)\n        kwargs['query'] = self.query\n        return super(IndexView, self).get_context_data(**kwargs)\n\n    def get_queryset(self):\n        self.query = self.request.GET.get('s')\n        if self.query:\n            qset = (\n                Q(title__icontains=self.query) |\n                Q(content__icontains=self.query)\n            )\n            posts = Post.objects.defer('content', 'content_html')\\\n                .filter(qset, status=0)\n            for post in posts:\n                post.title = post.title.replace(self.query, '<span class=\"hightline\">%s</span>' % self.query)\n                post.summary = post.summary.replace(self.query, '<span class=\"hightline\">%s</span>' % self.query)\n        else:\n            posts = Post.objects.defer('content', 'content_html')\\\n                .filter(status=0)\n\n        return posts\n\n\nclass CategoryListView(IndexView):\n    def get_queryset(self):\n        alias = self.kwargs.get('alias')\n\n        try:\n            self.category = Category.objects.get(alias=alias)\n        except Category.DoesNotExist:\n            return []\n\n        posts = self.category.post_set.defer('content', 'content_html').filter(status=0)\n        return posts\n\n    def get_context_data(self, **kwargs):\n        if hasattr(self, 'category'):\n            kwargs['title'] = self.category.name + ' | '\n\n        return super(CategoryListView, self).get_context_data(**kwargs)\n\n\nclass TagsListView(IndexView):\n    def get_queryset(self):\n        self.tag = self.kwargs.get('tag')\n        posts = Post.objects.defer('content', 'content_html')\\\n            .filter(tags__icontains=self.tag, status=0)\n        return posts\n\n    def get_context_data(self, **kwargs):\n        kwargs['title'] = self.tag + ' | '\n        return super(TagsListView, self).get_context_data(**kwargs)\n\n\nclass PostDetailView(BaseMixin, DetailView):\n    object = None\n    template_name = 'detail.html'\n    queryset = Post.objects.filter(status=0)\n    slug_field = 'alias'\n\n    def get(self, request, *args, **kwargs):\n        ip = get_real_ip\n        self.cur_user_ip = ip\n\n        alias = self.kwargs.get('slug')\n        alias = alias.replace(' ', '')\n        try:\n            self.object = self.queryset.get(alias=alias)\n        except Post.DoesNotExist:\n            referer = request.META.get('HTTP_REFERER')\n            logger.error(u'ref[%s] [%s]访问不存在的文章：[%s]', referer, ip, alias)\n            context = super(PostDetailView, self).get_context_data(**kwargs)\n            return render(request, '404.html', context)\n\n        visited_ips = cache.get(self.object.id, [])\n\n        if ip not in visited_ips:\n            Post.objects.filter(id=self.object.id).update(view_times=F('view_times')+1)\n\n            visited_ips.append(ip)\n\n            self.set_lru_read(ip, self.object)\n\n            DAY = 24 * 60  # 一天\n            cache.set(self.object.id, visited_ips, DAY)\n\n        context = self.get_context_data(object=self.object)\n        return self.render_to_response(context)\n\n    def set_lru_read(self, ip, post):\n        # 保存别人正在读\n        lru_views = cache.get('lru_views')\n        if not lru_views:\n            lru_views = LRUCacheDict(max_size=10, expiration=settings.FIF_MIN)\n\n        if post not in lru_views.values():\n            lru_views[ip] = post\n\n        cache.set('lru_views', lru_views, settings.FIF_MIN)\n\n    def get_context_data(self, **kwargs):\n        context = super(PostDetailView, self).get_context_data(**kwargs)\n\n        context['lru_views'] = cache.get('lru_views', {}).items()\n        context['cur_user_ip'] = self.cur_user_ip\n\n        context['related_posts'] = self.object.related_posts\n\n        return context\n\n\nclass PageDetailView(BaseMixin, DetailView):\n    template_name = \"page.html\"\n    queryset = Page.objects.filter(status=0)\n    slug_field = 'alias'\n\n    def get(self, request, *args, **kwargs):\n        alias = self.kwargs.get('slug')\n        try:\n            self.object = self.queryset.get(alias=alias)\n            context = self.get_context_data(object=self.object)\n        except Page.DoesNotExist:\n            logger.error(u'访问不存在的页面：[%s]' % alias)\n            context = self.get_context_data(**kwargs)\n            return render(request, '404.html', context)\n\n        return self.render_to_response(context)\n"
  },
  {
    "path": "selfblog/dump-auth.json",
    "content": "[{\"pk\": 1, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_permission\", \"name\": \"Can add permission\", \"content_type\": 1}}, {\"pk\": 2, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_permission\", \"name\": \"Can change permission\", \"content_type\": 1}}, {\"pk\": 3, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_permission\", \"name\": \"Can delete permission\", \"content_type\": 1}}, {\"pk\": 4, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_group\", \"name\": \"Can add group\", \"content_type\": 2}}, {\"pk\": 5, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_group\", \"name\": \"Can change group\", \"content_type\": 2}}, {\"pk\": 6, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_group\", \"name\": \"Can delete group\", \"content_type\": 2}}, {\"pk\": 7, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_user\", \"name\": \"Can add user\", \"content_type\": 3}}, {\"pk\": 8, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_user\", \"name\": \"Can change user\", \"content_type\": 3}}, {\"pk\": 9, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_user\", \"name\": \"Can delete user\", \"content_type\": 3}}, {\"pk\": 10, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_group\", \"name\": \"Can view group\", \"content_type\": 2}}, {\"pk\": 11, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_permission\", \"name\": \"Can view permission\", \"content_type\": 1}}, {\"pk\": 12, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_user\", \"name\": \"Can view user\", \"content_type\": 3}}, {\"pk\": 13, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_contenttype\", \"name\": \"Can add content type\", \"content_type\": 4}}, {\"pk\": 14, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_contenttype\", \"name\": \"Can change content type\", \"content_type\": 4}}, {\"pk\": 15, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_contenttype\", \"name\": \"Can delete content type\", \"content_type\": 4}}, {\"pk\": 16, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_contenttype\", \"name\": \"Can view content type\", \"content_type\": 4}}, {\"pk\": 17, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_session\", \"name\": \"Can add session\", \"content_type\": 5}}, {\"pk\": 18, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_session\", \"name\": \"Can change session\", \"content_type\": 5}}, {\"pk\": 19, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_session\", \"name\": \"Can delete session\", \"content_type\": 5}}, {\"pk\": 20, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_session\", \"name\": \"Can view session\", \"content_type\": 5}}, {\"pk\": 21, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_site\", \"name\": \"Can add site\", \"content_type\": 6}}, {\"pk\": 22, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_site\", \"name\": \"Can change site\", \"content_type\": 6}}, {\"pk\": 23, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_site\", \"name\": \"Can delete site\", \"content_type\": 6}}, {\"pk\": 24, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_site\", \"name\": \"Can view site\", \"content_type\": 6}}, {\"pk\": 25, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_logentry\", \"name\": \"Can add log entry\", \"content_type\": 7}}, {\"pk\": 26, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_logentry\", \"name\": \"Can change log entry\", \"content_type\": 7}}, {\"pk\": 27, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_logentry\", \"name\": \"Can delete log entry\", \"content_type\": 7}}, {\"pk\": 28, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_logentry\", \"name\": \"Can view log entry\", \"content_type\": 7}}, {\"pk\": 29, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_pingback\", \"name\": \"Can add pingback\", \"content_type\": 8}}, {\"pk\": 30, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_pingback\", \"name\": \"Can change pingback\", \"content_type\": 8}}, {\"pk\": 31, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_pingback\", \"name\": \"Can delete pingback\", \"content_type\": 8}}, {\"pk\": 32, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_pingbackclient\", \"name\": \"Can add pingback client\", \"content_type\": 9}}, {\"pk\": 33, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_pingbackclient\", \"name\": \"Can change pingback client\", \"content_type\": 9}}, {\"pk\": 34, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_pingbackclient\", \"name\": \"Can delete pingback client\", \"content_type\": 9}}, {\"pk\": 35, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_directoryping\", \"name\": \"Can add directory ping\", \"content_type\": 10}}, {\"pk\": 36, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_directoryping\", \"name\": \"Can change directory ping\", \"content_type\": 10}}, {\"pk\": 37, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_directoryping\", \"name\": \"Can delete directory ping\", \"content_type\": 10}}, {\"pk\": 38, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_directoryping\", \"name\": \"Can view directory ping\", \"content_type\": 10}}, {\"pk\": 39, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_pingback\", \"name\": \"Can view pingback\", \"content_type\": 8}}, {\"pk\": 40, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_pingbackclient\", \"name\": \"Can view pingback client\", \"content_type\": 9}}, {\"pk\": 41, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_category\", \"name\": \"Can add \\u5206\\u7c7b\", \"content_type\": 11}}, {\"pk\": 42, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_category\", \"name\": \"Can change \\u5206\\u7c7b\", \"content_type\": 11}}, {\"pk\": 43, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_category\", \"name\": \"Can delete \\u5206\\u7c7b\", \"content_type\": 11}}, {\"pk\": 44, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_post\", \"name\": \"Can add \\u6587\\u7ae0\", \"content_type\": 12}}, {\"pk\": 45, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_post\", \"name\": \"Can change \\u6587\\u7ae0\", \"content_type\": 12}}, {\"pk\": 46, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_post\", \"name\": \"Can delete \\u6587\\u7ae0\", \"content_type\": 12}}, {\"pk\": 47, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_page\", \"name\": \"Can add \\u9875\\u9762\", \"content_type\": 13}}, {\"pk\": 48, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_page\", \"name\": \"Can change \\u9875\\u9762\", \"content_type\": 13}}, {\"pk\": 49, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_page\", \"name\": \"Can delete \\u9875\\u9762\", \"content_type\": 13}}, {\"pk\": 50, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_widget\", \"name\": \"Can add \\u4fa7\\u680f\\u7ec4\\u4ef6\", \"content_type\": 14}}, {\"pk\": 51, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_widget\", \"name\": \"Can change \\u4fa7\\u680f\\u7ec4\\u4ef6\", \"content_type\": 14}}, {\"pk\": 52, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_widget\", \"name\": \"Can delete \\u4fa7\\u680f\\u7ec4\\u4ef6\", \"content_type\": 14}}, {\"pk\": 53, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_widget\", \"name\": \"Can view \\u4fa7\\u680f\\u7ec4\\u4ef6\", \"content_type\": 14}}, {\"pk\": 54, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_category\", \"name\": \"Can view \\u5206\\u7c7b\", \"content_type\": 11}}, {\"pk\": 55, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_post\", \"name\": \"Can view \\u6587\\u7ae0\", \"content_type\": 12}}, {\"pk\": 56, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_page\", \"name\": \"Can view \\u9875\\u9762\", \"content_type\": 13}}, {\"pk\": 57, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_menu\", \"name\": \"Can add \\u83dc\\u5355\", \"content_type\": 15}}, {\"pk\": 58, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_menu\", \"name\": \"Can change \\u83dc\\u5355\", \"content_type\": 15}}, {\"pk\": 59, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_menu\", \"name\": \"Can delete \\u83dc\\u5355\", \"content_type\": 15}}, {\"pk\": 60, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_responsemessage\", \"name\": \"Can add \\u54cd\\u5e94\\u6d88\\u606f\", \"content_type\": 16}}, {\"pk\": 61, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_responsemessage\", \"name\": \"Can change \\u54cd\\u5e94\\u6d88\\u606f\", \"content_type\": 16}}, {\"pk\": 62, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_responsemessage\", \"name\": \"Can delete \\u54cd\\u5e94\\u6d88\\u606f\", \"content_type\": 16}}, {\"pk\": 63, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_message\", \"name\": \"Can add \\u7528\\u6237\\u6d88\\u606f\", \"content_type\": 17}}, {\"pk\": 64, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_message\", \"name\": \"Can change \\u7528\\u6237\\u6d88\\u606f\", \"content_type\": 17}}, {\"pk\": 65, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_message\", \"name\": \"Can delete \\u7528\\u6237\\u6d88\\u606f\", \"content_type\": 17}}, {\"pk\": 66, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_event\", \"name\": \"Can add \\u63a5\\u53d7\\u5230\\u7684\\u4e8b\\u4ef6\", \"content_type\": 18}}, {\"pk\": 67, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_event\", \"name\": \"Can change \\u63a5\\u53d7\\u5230\\u7684\\u4e8b\\u4ef6\", \"content_type\": 18}}, {\"pk\": 68, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_event\", \"name\": \"Can delete \\u63a5\\u53d7\\u5230\\u7684\\u4e8b\\u4ef6\", \"content_type\": 18}}, {\"pk\": 69, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_responsemessage\", \"name\": \"Can view \\u54cd\\u5e94\\u6d88\\u606f\", \"content_type\": 16}}, {\"pk\": 70, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_event\", \"name\": \"Can view \\u63a5\\u53d7\\u5230\\u7684\\u4e8b\\u4ef6\", \"content_type\": 18}}, {\"pk\": 71, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_message\", \"name\": \"Can view \\u7528\\u6237\\u6d88\\u606f\", \"content_type\": 17}}, {\"pk\": 72, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"view_menu\", \"name\": \"Can view \\u83dc\\u5355\", \"content_type\": 15}}, {\"pk\": 73, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_bookmark\", \"name\": \"Can add Bookmark\", \"content_type\": 19}}, {\"pk\": 74, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_bookmark\", \"name\": \"Can change Bookmark\", \"content_type\": 19}}, {\"pk\": 75, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_bookmark\", \"name\": \"Can delete Bookmark\", \"content_type\": 19}}, {\"pk\": 76, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_usersettings\", \"name\": \"Can add User Setting\", \"content_type\": 20}}, {\"pk\": 77, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_usersettings\", \"name\": \"Can change User Setting\", \"content_type\": 20}}, {\"pk\": 78, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_usersettings\", \"name\": \"Can delete User Setting\", \"content_type\": 20}}, {\"pk\": 79, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"add_userwidget\", \"name\": \"Can add User Widget\", \"content_type\": 21}}, {\"pk\": 80, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"change_userwidget\", \"name\": \"Can change User Widget\", \"content_type\": 21}}, {\"pk\": 81, \"model\": \"auth.permission\", \"fields\": {\"codename\": \"delete_userwidget\", \"name\": \"Can delete User Widget\", \"content_type\": 21}}, {\"pk\": 1, \"model\": \"auth.user\", \"fields\": {\"username\": \"the5fire\", \"first_name\": \"\", \"last_name\": \"\", \"is_active\": true, \"is_superuser\": true, \"is_staff\": true, \"last_login\": \"2014-05-31T22:41:05.210\", \"groups\": [], \"user_permissions\": [], \"password\": \"pbkdf2_sha256$12000$l7q6hwQuE3jV$Nt6Wt/rQqA8c5IidX/2ORPwqoUiTfMz/qykRRdvEWyI=\", \"email\": \"thefivefire@gmail.com\", \"date_joined\": \"2014-05-31T22:40:32.283\"}}]"
  },
  {
    "path": "selfblog/dump-blog.json",
    "content": "[{\"pk\": 1, \"model\": \"blog.category\", \"fields\": {\"is_nav\": true, \"status\": 0, \"update_time\": \"2014-05-31T23:09:20.497\", \"name\": \"\\u535a\\u5ba2\", \"parent\": null, \"rank\": 0, \"alias\": \"blog\", \"create_time\": \"2014-05-31T23:09:20.496\", \"desc\": \"\"}}, {\"pk\": 1, \"model\": \"blog.post\", \"fields\": {\"category\": 1, \"status\": 0, \"update_time\": \"2014-05-31T23:18:59.895\", \"pub_time\": \"2014-05-31T23:09:26\", \"is_old\": false, \"title\": \"\\u7528reStructuredText\\u6765\\u5199\\u535a\\u5ba2(\\u6d4b\\u8bd5)\", \"author\": 1, \"view_times\": 3, \"summary\": \"\\u5b83\\u662f\\u4e00\\u4e2a\\u7c7b\\u4f3c\\u4e8eMarkDown\\u7684\\u6807\\u8bb0\\u8bed\\u8a00\\uff0c\\u5177\\u4f53\\u53ef\\u53c2\\u8003\\u8fd9\\u91cc\\uff1ahttp://zh.wikipedia.org/wiki/ReStructuredText\\r\\n\\r\\n\\u4e0b\\u9762\\u7528\\u51e0\\u4e2a\\u4f8b\\u5b50\\u6765\\u8bf4\\u660e\\u8fd9\\u4e2a\\u4e1c\\u897f\\u600e\\u4e48\\u7528\\r\\n\", \"content\": \"reStructuredText\\u662f\\u4ec0\\u4e48\\r\\n######################\\r\\n\\r\\n\\u5b83\\u662f\\u4e00\\u4e2a\\u7c7b\\u4f3c\\u4e8eMarkDown\\u7684\\u6807\\u8bb0\\u8bed\\u8a00\\uff0c\\u5177\\u4f53\\u53ef\\u53c2\\u8003\\u8fd9\\u91cc\\uff1ahttp://zh.wikipedia.org/wiki/ReStructuredText, \\u624b\\u518c\\u5728\\u8fd9\\u91cc\\uff1ahttp://sphinx-doc-zh.readthedocs.org/en/latest/rest.html\\r\\n\\u4e0b\\u9762\\u7528\\u51e0\\u4e2a\\u4f8b\\u5b50\\u6765\\u8bf4\\u660e\\u8fd9\\u4e2a\\u4e1c\\u897f\\u600e\\u4e48\\u7528\\r\\n\\r\\n\\u7ae0\\u8282\\r\\n#########\\r\\n ::\\r\\n\\r\\n    # \\u6709\\u4e0a\\u6807\\u7ebf, \\u7528\\u4ee5\\u90e8\\u5206\\r\\n    * \\u6709\\u4e0a\\u6807\\u7ebf, \\u7528\\u4ee5\\u7ae0\\u8282\\r\\n    = \\u7528\\u4ee5\\u5c0f\\u8282 \\r\\n    - \\u7528\\u4ee5\\u5b50\\u8282 \\r\\n    ^ \\u7528\\u4ee5\\u5b50\\u8282\\u7684\\u5b50\\u8282 \\r\\n    \\\" \\u7528\\u4ee5\\u6bb5\\u843d \\r\\n\\r\\n\\u6bb5\\u843d\\r\\n-----------------\\r\\n\\r\\n\\u7528\\u7a7a\\u884c\\u9694\\u5f00\\u5c31\\u81ea\\u52a8\\u8bc6\\u522b\\u4e3a\\u4e00\\u4e2a\\u6bb5\\u843d\\r\\n\\r\\n\\u94fe\\u63a5\\r\\n----------------\\r\\n\\u6548\\u679c:\\r\\n\\r\\n    `Link text <http://example.com/>`_ test  \\r\\n\\r\\ncode:\\r\\n::\\r\\n\\r\\n  `Link text <http://example.com/>`_  \\r\\n   \\u4e0a\\u9762\\u7684\\u4ee3\\u7801\\u653e\\u5230\\u5185\\u5bb9\\u4e2d\\u7684\\u9700\\u8981\\u524d\\u540e\\u7a7a\\u683c\\u3002\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\u4ee3\\u7801<code>\\r\\n----------------------------\\r\\n\\u6548\\u679c\\uff1a\\r\\n\\r\\n.. code:: python\\r\\n\\r\\n    #coding:utf-8\\r\\n\\r\\n    def hello():\\r\\n        print 'hello the5fire'\\r\\n\\r\\ncode:\\r\\n::\\r\\n\\r\\n    .. code:: python\\r\\n\\r\\n        #coding:utf-8\\r\\n\\r\\n        def hello():\\r\\n            print 'hello the5fire'\\r\\n \\r\\n\", \"alias\": \"blog-with-restructuredtext\", \"is_top\": false, \"create_time\": \"2014-05-31T23:17:00.534\", \"content_html\": \"<div class=\\\"section\\\" id=\\\"restructuredtext\\\">\\n<h1>reStructuredText\\u662f\\u4ec0\\u4e48</h1>\\n<p>\\u5b83\\u662f\\u4e00\\u4e2a\\u7c7b\\u4f3c\\u4e8eMarkDown\\u7684\\u6807\\u8bb0\\u8bed\\u8a00\\uff0c\\u5177\\u4f53\\u53ef\\u53c2\\u8003\\u8fd9\\u91cc\\uff1a<a class=\\\"reference external\\\" href=\\\"http://zh.wikipedia.org/wiki/ReStructuredText\\\">http://zh.wikipedia.org/wiki/ReStructuredText</a>, \\u624b\\u518c\\u5728\\u8fd9\\u91cc\\uff1a<a class=\\\"reference external\\\" href=\\\"http://sphinx-doc-zh.readthedocs.org/en/latest/rest.html\\\">http://sphinx-doc-zh.readthedocs.org/en/latest/rest.html</a>\\n\\u4e0b\\u9762\\u7528\\u51e0\\u4e2a\\u4f8b\\u5b50\\u6765\\u8bf4\\u660e\\u8fd9\\u4e2a\\u4e1c\\u897f\\u600e\\u4e48\\u7528</p>\\n</div>\\n<div class=\\\"section\\\" id=\\\"id1\\\">\\n<h1>\\u7ae0\\u8282</h1>\\n<blockquote>\\n<pre class=\\\"literal-block\\\">\\n# \\u6709\\u4e0a\\u6807\\u7ebf, \\u7528\\u4ee5\\u90e8\\u5206\\n* \\u6709\\u4e0a\\u6807\\u7ebf, \\u7528\\u4ee5\\u7ae0\\u8282\\n= \\u7528\\u4ee5\\u5c0f\\u8282\\n- \\u7528\\u4ee5\\u5b50\\u8282\\n^ \\u7528\\u4ee5\\u5b50\\u8282\\u7684\\u5b50\\u8282\\n&quot; \\u7528\\u4ee5\\u6bb5\\u843d\\n</pre>\\n</blockquote>\\n<div class=\\\"section\\\" id=\\\"id2\\\">\\n<h2>\\u6bb5\\u843d</h2>\\n<p>\\u7528\\u7a7a\\u884c\\u9694\\u5f00\\u5c31\\u81ea\\u52a8\\u8bc6\\u522b\\u4e3a\\u4e00\\u4e2a\\u6bb5\\u843d</p>\\n</div>\\n<div class=\\\"section\\\" id=\\\"id3\\\">\\n<h2>\\u94fe\\u63a5</h2>\\n<p>\\u6548\\u679c:</p>\\n<blockquote>\\n<a class=\\\"reference external\\\" href=\\\"http://example.com/\\\">Link text</a> test</blockquote>\\n<p>code:</p>\\n<pre class=\\\"literal-block\\\">\\n`Link text &lt;http://example.com/&gt;`_\\n \\u4e0a\\u9762\\u7684\\u4ee3\\u7801\\u653e\\u5230\\u5185\\u5bb9\\u4e2d\\u7684\\u9700\\u8981\\u524d\\u540e\\u7a7a\\u683c\\u3002\\n</pre>\\n</div>\\n<div class=\\\"section\\\" id=\\\"code\\\">\\n<h2>\\u4ee3\\u7801&lt;code&gt;</h2>\\n<p>\\u6548\\u679c\\uff1a</p>\\n<pre class=\\\"code python literal-block\\\">\\n<span class=\\\"comment\\\">#coding:utf-8</span>\\n\\n<span class=\\\"keyword\\\">def</span> <span class=\\\"name function\\\">hello</span><span class=\\\"punctuation\\\">():</span>\\n    <span class=\\\"keyword\\\">print</span> <span class=\\\"literal string\\\">'hello the5fire'</span>\\n</pre>\\n<p>code:</p>\\n<pre class=\\\"literal-block\\\">\\n.. code:: python\\n\\n    #coding:utf-8\\n\\n    def hello():\\n        print 'hello the5fire'\\n</pre>\\n</div>\\n</div>\\n\", \"tags\": \"reStructuredText,blog\"}}, {\"pk\": 1, \"model\": \"blog.page\", \"fields\": {\"status\": 0, \"update_time\": \"2014-05-31T23:06:50.128\", \"author\": 1, \"is_html\": true, \"title\": \"\\u5173\\u4e8e\", \"rank\": 1, \"content\": \"<h1>\\u5173\\u4e8e\\u535a\\u4e3b</h1>\\r\\n<p>life is short, we need python</p>\", \"alias\": \"about\", \"create_time\": \"2014-05-31T23:06:50.128\", \"link\": \"\", \"content_html\": \"<h1>\\u5173\\u4e8e\\u535a\\u4e3b</h1>\\r\\n<p>life is short, we need python</p>\"}}, {\"pk\": 1, \"model\": \"blog.widget\", \"fields\": {\"update_time\": \"2014-05-31T22:41:43.761\", \"hide\": false, \"title\": \"\\u5173\\u4e8e\\u535a\\u4e3b\", \"rank\": 0, \"content\": \"Python\\u7a0b\\u5e8f\\u5458\\u4e00\\u679a\", \"create_time\": \"2014-05-31T22:41:43.761\"}}, {\"pk\": 2, \"model\": \"blog.widget\", \"fields\": {\"update_time\": \"2014-05-31T23:04:42.076\", \"hide\": false, \"title\": \"html\\u5c55\\u793a\", \"rank\": 1, \"content\": \"<h1>test<h1>\\r\\n<p>\\u6d4b\\u8bd5\\u6587\\u672c</p>\\r\\n<a href=\\\"http://the5fire.com\\\">\\u4f5c\\u8005\\u535a\\u5ba2</a>\", \"create_time\": \"2014-05-31T23:04:42.076\"}}]"
  },
  {
    "path": "selfblog/feeds.py",
    "content": "#coding:utf-8\nfrom django.contrib.syndication.views import Feed\nfrom django.utils.feedgenerator import Rss201rev2Feed\n\nfrom blog.models import Post\n\n\nclass ExtendedRSSFeed(Rss201rev2Feed):\n    mime_type = 'application/xml'\n    \"\"\"\n    Create a type of RSS feed that has content:encoded elements.\n    \"\"\"\n    def root_attributes(self):\n        attrs = super(ExtendedRSSFeed, self).root_attributes()\n        attrs['xmlns:content'] = 'http://purl.org/rss/1.0/modules/content/'\n        return attrs\n\n    def add_item_elements(self, handler, item):\n        super(ExtendedRSSFeed, self).add_item_elements(handler, item)\n        handler.addQuickElement(u'content:encoded', item['content_encoded'])\n\n\nclass LatestEntriesFeed(Feed):\n    feed_type = ExtendedRSSFeed\n\n    # Elements for the top-level, channel.\n    title = u\"the5fire的技术博客\"\n    link = \"http://www.the5fire.com\"\n    author = 'the5fire'\n    description = u\"关注python、vim、linux、web开发和互联网--life is short, we need python.\"\n\n    def items(self):\n        return Post.objects.filter(status=0).order_by('-create_time')[:10]\n\n    def item_extra_kwargs(self, item):\n        return {'content_encoded': self.item_content_encoded(item)}\n\n    # Elements for each item.\n    def item_title(self, item):\n        return item.title\n\n    def item_description(self, item):\n        return item.content_html\n\n    def item_author_name(self, item):\n        if (item.author.get_full_name()):\n            return item.author.get_full_name()\n        else:\n            return item.author\n\n    def item_pubdate(self, item):\n        return item.create_time\n\n    def item_content_encoded(self, item):\n        return item.content_html\n"
  },
  {
    "path": "selfblog/init_database.sh",
    "content": "#!/bin/bash\nnohup python manage.py syncdb --noinput > /dev/null 2>&1 &\nsleep 5\nnohup python manage.py loaddata dump-auth.json > /dev/null 2>&1 &\nnohup python manage.py loaddata dump-blog.json > /dev/null 2>&1 &\n"
  },
  {
    "path": "selfblog/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\nif __name__ == \"__main__\":\n    PROFILE = os.environ.get('DJANGOSELFBLOG_PROFILE', 'develop')\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"selfblog.settings.%s\" % PROFILE)\n    from django.core.management import execute_from_command_line\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "selfblog/run.sh",
    "content": "#!/bin/bash\nnohup python manage.py runserver 0.0.0.0:8000> /dev/null 2>&1 &\n"
  },
  {
    "path": "selfblog/selfblog/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/selfblog/adminx.py",
    "content": "# coding: utf-8\nfrom __future__ import absolute_import, unicode_literals\n\nimport xadmin\nfrom xadmin import views\n\n\nclass GlobeSetting(object):\n    site_title = 'the5fire博客后台'\n    site_footer = 'power by the5fire'\n\nxadmin.site.register(views.CommAdminView, GlobeSetting)\n"
  },
  {
    "path": "selfblog/selfblog/settings/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/selfblog/settings/base.py",
    "content": "# coding:utf-8\nimport os\nfrom os import path\n\nROOT_PATH = path.abspath(path.join(path.dirname('settings.py'), path.pardir))\n\nADMINS = (\n    ('the5fire', 'thefivefire@gmail.com'),\n)\nALLOWED_HOSTS = ['localhost', '.the5fire.com']\n\nMANAGERS = ADMINS\nTIME_ZONE = 'Asia/Shanghai'\nLANGUAGE_CODE = 'zh-cn'\nSITE_ID = 1\nUSE_I18N = True\nUSE_L10N = True\n\nMEDIA_ROOT = ''\nMEDIA_URL = '/media/'\n# STATIC_ROOT = ''\nSTATIC_URL = '/static/'\n\n# Additional locations of static files\nSTATICFILES_DIRS = (\n    path.join(ROOT_PATH, 'selfblog/static'),\n)\n\n# List of finder classes that know how to find static files in\n# various locations.\nSTATICFILES_FINDERS = (\n    'django.contrib.staticfiles.finders.FileSystemFinder',\n    'django.contrib.staticfiles.finders.AppDirectoriesFinder',\n    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',\n)\n\n# Make this unique, and don't share it with anybody.\nSECRET_KEY = 'm_t&=vit))7cic$zfdl^7wfsc+$e1@_p=4@bmc54pp%25n#*%1'\n\n# List of callables that know how to import templates from various sources.\nTEMPLATE_LOADERS = (\n    'django.template.loaders.filesystem.Loader',\n    'django.template.loaders.app_directories.Loader',\n    # 'django.template.loaders.eggs.Loader',\n)\n\nMIDDLEWARE_CLASSES = (\n    'django.middleware.gzip.GZipMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'pingback.middleware.PingbackMiddleware',\n    'blog.middleware.OnlineMiddleware',\n)\nINTERNAL_IPS = ('127.0.0.1',)\n\nROOT_URLCONF = 'selfblog.urls'\nWSGI_APPLICATION = 'selfblog.wsgi.application'\n\nTEMPLATE_DIRS = (\n    path.join(ROOT_PATH, 'blog/templates'),\n)\n\nDIRECTORY_URLS = (\n    'http://ping.blogs.yandex.ru/RPC2',\n    'http://rpc.technorati.com/rpc/ping',\n)\n\nINSTALLED_APPS = (\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.sites',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'django.contrib.admin',\n    'django_xmlrpc',\n\n    'xadmin',\n    'crispy_forms',\n    'pingback',\n    'duoshuo',\n\n    'blog',\n    'weixin',\n)\n\n\nLOG_PATH = os.path.join(ROOT_PATH, '..', '..')\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': True,\n    'filters': {\n        'require_debug_false': {\n            '()': 'django.utils.log.RequireDebugFalse'\n        }\n    },\n    'formatters': {\n        'simple': {\n            'format': '[%(levelname)s] %(module)s : %(message)s'\n        },\n        'verbose': {\n            'format': '[%(asctime)s] [%(levelname)s] %(module)s : %(message)s'\n        }\n    },\n\n    'handlers': {\n        'console': {\n            'level': 'INFO',\n            'class': 'logging.StreamHandler',\n            'formatter': 'verbose'\n        },\n        'file_info': {\n            'level': 'INFO',\n            'class': 'logging.handlers.RotatingFileHandler',\n            'formatter': 'verbose',\n            'filename': os.path.join(LOG_PATH, 'info.log'),\n            'maxBytes': 1024 * 1024 * 100,\n            'backupCount': 10,\n            'mode': 'a',\n        },\n        'mail_admins': {\n            'level': 'ERROR',\n            'class': 'django.utils.log.AdminEmailHandler',\n            'filters': ['require_debug_false']\n        }\n    },\n    'loggers': {\n        '': {\n            'handlers': ['file_info', 'console'],\n            'level': 'INFO',\n            'propagate': True,\n        },\n        'django': {\n            'handlers': ['file_info', 'console'],\n            'level': 'DEBUG',\n            'propagate': True,\n        },\n        'django.request': {\n            'handlers': ['mail_admins', 'console'],\n            'level': 'ERROR',\n            'propagate': True,\n        },\n    }\n}\nCACHES = {\n    'default': {\n        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',\n        'LOCATION': 'unique-snowflake',\n        'options': {\n            'MAX_ENTRIES': 1024,\n        }\n    },\n    'memcache': {\n        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',\n        'LOCATION': 'unix:/home/the5fire/memcached.sock',\n        'options': {\n            'MAX_ENTRIES': 1024,\n        }\n    },\n}\n\n\n# 配置文章开头使用rst格式无显示的问题\nRESTRUCTUREDTEXT_FILTER_SETTINGS = {\n    'doctitle_xform': False,\n}\n\nPAGE_NUM = 10\nRECENTLY_NUM = 15\nHOT_NUM = 15\nONE_DAY = 24*60*60\nFIF_MIN = 15 * 60\nFIVE_MIN = 5 * 60\n\nDUOSHUO_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxx'\nDUOSHUO_SHORT_NAME = 'xxxxxxxx'\n\n# 微信\nWEIXIN_APPID = 0\nWEIXIN_APPSECRET = ''\n"
  },
  {
    "path": "selfblog/selfblog/settings/develop.py",
    "content": "# coding:utf-8\n\nfrom .base import *  # noqa\n\nDEBUG = True\nTEMPLATE_DEBUG = DEBUG\n\nDOMAIN = 'http://localhost:8000'\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': 'selfblog.sqlite3',\n        'USER': 'root',\n        'PASSWORD': 'root',\n        'HOST': '',\n        'PORT': '',\n    }\n}\n\nINSTALLED_APPS = INSTALLED_APPS + ('debug_toolbar', )\nMIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + ('debug_toolbar.middleware.DebugToolbarMiddleware', )\n"
  },
  {
    "path": "selfblog/selfblog/settings/product.py",
    "content": "# coding:utf-8\n\nfrom .base import * # noqa\n\nDEBUG = True\nTEMPLATE_DEBUG = DEBUG\n\nDOMAIN = 'http://www.the5fire.com'   # yourdomain\nDB_NAME = 'mydb'\nDB_USER = 'the5fire'\nDB_PWD = 'the5fire'\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.mysql',\n        'NAME': 'mydb',\n        'USER': 'the5fire',\n        'PASSWORD': 'the5fire',\n        'HOST': '',\n        'PORT': '',\n    }\n}\n"
  },
  {
    "path": "selfblog/selfblog/urls.py",
    "content": "# coding:utf-8\nfrom django.conf.urls import patterns, include, url\nfrom django.contrib.staticfiles.urls import staticfiles_urlpatterns\nfrom django.contrib.sitemaps import views as sitemap_views\nfrom django.views.decorators.cache import cache_page\n\nimport xadmin\nxadmin.autodiscover()\n\nfrom blog.views import (IndexView, CategoryListView, TagsListView,\n                        PostDetailView, PageDetailView)\nfrom feeds import LatestEntriesFeed\nfrom sitemap import PostSitemap\nimport adminx  # noqa 初始化adminx配置\n\nurlpatterns = patterns(\n    '',\n    url(r'^$', IndexView.as_view(), name='home'),\n    url(r'^feed|rss/$', LatestEntriesFeed()),\n    url(r'^sitemap\\.xml$', cache_page(60 * 60 * 12)(sitemap_views.sitemap), {'sitemaps': {'posts': PostSitemap}}),\n\n    url(r'^category/(?P<alias>\\w+)/', CategoryListView.as_view()),\n    url(r'^tag/(?P<tag>[\\w|\\.|\\-]+)/$', TagsListView.as_view()),\n\n    url(r'^xadmin/', include(xadmin.site.urls), name='xadmin'),\n\n    url(r'^xmlrpc/$', 'django_xmlrpc.views.handle_xmlrpc', {}, 'xmlrpc'),\n\n    # 放到最后\n    url(r'^(?P<slug>[\\w|\\-|\\d|\\W]+?).html$', PostDetailView.as_view()),\n    url(r'^(?P<slug>\\w+)/$', PageDetailView.as_view()),\n)\n\nurlpatterns += staticfiles_urlpatterns()\n"
  },
  {
    "path": "selfblog/selfblog/wsgi.py",
    "content": "import os\n\nPROFILE = os.environ.get('DJANGOSELFBLOG_PROFILE', 'develop')\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"selfblog.settings.%s\" % PROFILE)\n\nfrom django.core.wsgi import get_wsgi_application\napplication = get_wsgi_application()\n\n# Apply WSGI middleware here.\n# from helloworld.wsgi import HelloWorldApplication\n# application = HelloWorldApplication(application)\n"
  },
  {
    "path": "selfblog/sitemap.py",
    "content": "#coding:utf-8\n\nfrom django.contrib.sitemaps import Sitemap\n\nfrom blog.models import Post\n\nclass PostSitemap(Sitemap):\n    changefreq = \"weekly\"\n    priority = 0.2\n\n    def items(self):\n        return Post.objects.filter(status=0)\n\n    def lastmod(self, obj):\n        return obj.create_time\n\n    def location(self, obj):\n        return '/%s.html' % obj.alias\n"
  },
  {
    "path": "selfblog/static/admin/blog/change_form.html",
    "content": "{% extends \"admin/change_form.html\" %}\n\n{% block after_related_objects %}\n  {% if original.pk %}\n    <div class=\"submit-row\">\n      <p class=\"deletelink-box\">Manage this request</p>\n      {% if original.requested %}\n        <input type=\"submit\" value=\"Approve\" name=\"approve\">\n        <input type=\"submit\" value=\"Deny\" name=\"deny\">\n      {% endif %}\n      {% if original.submitted %}\n        <input type=\"submit\" value=\"Accept\" name=\"accept\">\n        <input type=\"submit\" value=\"Return\" name=\"return\">\n      {% endif %}\n      {% if original.submitted or original.assigned %}\n        <input type=\"submit\" value=\"Cancel\" name=\"cancel\">\n      {% endif %}\n      {% if original.accepted %}\n        <input type=\"submit\" value=\"Complete\" name=\"complete\">\n      {% endif %}\n      {% if original.cancelled %}\n        <input type=\"submit\" value=\"Reopen\" name=\"reopen\">\n      {% endif %}\n    </div>\n  {% endif %}\n{% endblock %}\n"
  },
  {
    "path": "selfblog/static/admin/css/base.css",
    "content": "/*\n    DJANGO Admin styles\n*/\n\nbody {\n    margin: 0;\n    padding: 0;\n    font-size: 12px;\n    font-family: \"Lucida Grande\",\"DejaVu Sans\",\"Bitstream Vera Sans\",Verdana,Arial,sans-serif;\n    color: #333;\n    background: #fff;\n}\n\n/* LINKS */\n\na:link, a:visited {\n    color: #5b80b2;\n    text-decoration: none;\n}\n\na:hover {\n    color: #036;\n}\n\na img {\n    border: none;\n}\n\na.section:link, a.section:visited {\n    color: white;\n    text-decoration: none;\n}\n\n/* GLOBAL DEFAULTS */\n\np, ol, ul, dl {\n    margin: .2em 0 .8em 0;\n}\n\np {\n    padding: 0;\n    line-height: 140%;\n}\n\nh1,h2,h3,h4,h5 {\n    font-weight: bold;\n}\n\nh1 {\n    font-size: 18px;\n    color: #666;\n    padding: 0 6px 0 0;\n    margin: 0 0 .2em 0;\n}\n\nh2 {\n    font-size: 16px;\n    margin: 1em 0 .5em 0;\n}\n\nh2.subhead {\n    font-weight: normal;\n    margin-top: 0;\n}\n\nh3 {\n    font-size: 14px;\n    margin: .8em 0 .3em 0;\n    color: #666;\n    font-weight: bold;\n}\n\nh4 {\n    font-size: 12px;\n    margin: 1em 0 .8em 0;\n    padding-bottom: 3px;\n}\n\nh5 {\n    font-size: 10px;\n    margin: 1.5em 0 .5em 0;\n    color: #666;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n}\n\nul li {\n    list-style-type: square;\n    padding: 1px 0;\n}\n\nul.plainlist {\n    margin-left: 0 !important;\n}\n\nul.plainlist li {\n    list-style-type: none;\n}\n\nli ul {\n    margin-bottom: 0;\n}\n\nli, dt, dd {\n    font-size: 11px;\n    line-height: 14px;\n}\n\ndt {\n    font-weight: bold;\n    margin-top: 4px;\n}\n\ndd {\n    margin-left: 0;\n}\n\nform {\n    margin: 0;\n    padding: 0;\n}\n\nfieldset {\n    margin: 0;\n    padding: 0;\n}\n\nblockquote {\n    font-size: 11px;\n    color: #777;\n    margin-left: 2px;\n    padding-left: 10px;\n    border-left: 5px solid #ddd;\n}\n\ncode, pre {\n    font-family: \"Bitstream Vera Sans Mono\", Monaco, \"Courier New\", Courier, monospace;\n    background: inherit;\n    color: #666;\n    font-size: 11px;\n}\n\npre.literal-block {\n    margin: 10px;\n    background: #eee;\n    padding: 6px 8px;\n}\n\ncode strong {\n    color: #930;\n}\n\nhr {\n    clear: both;\n    color: #eee;\n    background-color: #eee;\n    height: 1px;\n    border: none;\n    margin: 0;\n    padding: 0;\n    font-size: 1px;\n    line-height: 1px;\n}\n\n/* TEXT STYLES & MODIFIERS */\n\n.small {\n    font-size: 11px;\n}\n\n.tiny {\n    font-size: 10px;\n}\n\np.tiny {\n    margin-top: -2px;\n}\n\n.mini {\n    font-size: 9px;\n}\n\np.mini {\n    margin-top: -3px;\n}\n\n.help, p.help {\n    font-size: 10px !important;\n    color: #999;\n}\n\np img, h1 img, h2 img, h3 img, h4 img, td img {\n    vertical-align: middle;\n}\n\n.quiet, a.quiet:link, a.quiet:visited {\n    color: #999 !important;\n    font-weight: normal !important;\n}\n\n.quiet strong {\n    font-weight: bold !important;\n}\n\n.float-right {\n    float: right;\n}\n\n.float-left {\n    float: left;\n}\n\n.clear {\n    clear: both;\n}\n\n.align-left {\n    text-align: left;\n}\n\n.align-right {\n    text-align: right;\n}\n\n.example {\n    margin: 10px 0;\n    padding: 5px 10px;\n    background: #efefef;\n}\n\n.nowrap {\n    white-space: nowrap;\n}\n\n/* TABLES */\n\ntable {\n    border-collapse: collapse;\n    border-color: #ccc;\n}\n\ntd, th {\n    font-size: 11px;\n    line-height: 13px;\n    border-bottom: 1px solid #eee;\n    vertical-align: top;\n    padding: 5px;\n    font-family: \"Lucida Grande\", Verdana, Arial, sans-serif;\n}\n\nth {\n    text-align: left;\n    font-size: 12px;\n    font-weight: bold;\n}\n\nthead th,\ntfoot td {\n    color: #666;\n    padding: 2px 5px;\n    font-size: 11px;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;\n    border-left: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n}\n\ntfoot td {\n    border-bottom: none;\n    border-top: 1px solid #ddd;\n}\n\nthead th:first-child,\ntfoot td:first-child {\n    border-left: none !important;\n}\n\nthead th.optional {\n    font-weight: normal !important;\n}\n\nfieldset table {\n    border-right: 1px solid #eee;\n}\n\ntr.row-label td {\n    font-size: 9px;\n    padding-top: 2px;\n    padding-bottom: 0;\n    border-bottom: none;\n    color: #666;\n    margin-top: -1px;\n}\n\ntr.alt {\n    background: #f6f6f6;\n}\n\n.row1 {\n    background: #EDF3FE;\n}\n\n.row2 {\n    background: white;\n}\n\n/* SORTABLE TABLES */\n\nthead th a:link, thead th a:visited {\n    color: #666;\n    display: block;\n}\n\ntable thead th.sorted {\n    background-position: bottom left !important;\n}\n\ntable thead th.sorted a {\n    padding-right: 13px;\n}\n\ntable thead th.ascending a {\n    background: url(../img/admin/arrow-up.gif) right .4em no-repeat;\n}\n\ntable thead th.descending a {\n    background: url(../img/admin/arrow-down.gif) right .4em no-repeat;\n}\n\n/* ORDERABLE TABLES */\n\ntable.orderable tbody tr td:hover {\n    cursor: move;\n}\n\ntable.orderable tbody tr td:first-child {\n    padding-left: 14px;\n    background-image: url(../img/admin/nav-bg-grabber.gif);\n    background-repeat: repeat-y;\n}\n\ntable.orderable-initalized .order-cell, body>tr>td.order-cell {\n    display: none;\n}\n\n/* FORM DEFAULTS */\n\ninput, textarea, select, .form-row p {\n    margin: 2px 0;\n    padding: 2px 3px;\n    vertical-align: middle;\n    font-family: \"Lucida Grande\", Verdana, Arial, sans-serif;\n    font-weight: normal;\n    font-size: 11px;\n}\n\ntextarea {\n    vertical-align: top !important;\n}\n\ninput[type=text], input[type=password], textarea, select, .vTextField {\n    border: 1px solid #ccc;\n}\n\n/* FORM BUTTONS */\n\n.button, input[type=submit], input[type=button], .submit-row input {\n    background: white url(../img/admin/nav-bg.gif) bottom repeat-x;\n    padding: 3px 5px;\n    color: black;\n    border: 1px solid #bbb;\n    border-color: #ddd #aaa #aaa #ddd;\n}\n\n.button:active, input[type=submit]:active, input[type=button]:active {\n    background-image: url(../img/admin/nav-bg-reverse.gif);\n    background-position: top;\n}\n\n.button[disabled], input[type=submit][disabled], input[type=button][disabled] {\n\tbackground-image: url(../img/admin/nav-bg.gif);\n\tbackground-position: bottom;\n\topacity: 0.4;\n}\n\n.button.default, input[type=submit].default, .submit-row input.default {\n    border: 2px solid #5b80b2;\n    background: #7CA0C7 url(../img/admin/default-bg.gif) bottom repeat-x;\n    font-weight: bold;\n    color: white;\n    float: right;\n}\n\n.button.default:active, input[type=submit].default:active {\n    background-image: url(../img/admin/default-bg-reverse.gif);\n    background-position: top;\n}\n\n.button[disabled].default, input[type=submit][disabled].default, input[type=button][disabled].default {\n\tbackground-image: url(../img/admin/default-bg.gif);\n\tbackground-position: bottom;\n\topacity: 0.4;\n}\n\n\n/* MODULES */\n\n.module {\n    border: 1px solid #ccc;\n    margin-bottom: 5px;\n    background: white;\n}\n\n.module p, .module ul, .module h3, .module h4, .module dl, .module pre {\n    padding-left: 10px;\n    padding-right: 10px;\n}\n\n.module blockquote {\n    margin-left: 12px;\n}\n\n.module ul, .module ol {\n    margin-left: 1.5em;\n}\n\n.module h3 {\n    margin-top: .6em;\n}\n\n.module h2, .module caption, .inline-group h2 {\n    margin: 0;\n    padding: 2px 5px 3px 5px;\n    font-size: 11px;\n    text-align: left;\n    font-weight: bold;\n    background: #7CA0C7 url(../img/admin/default-bg.gif) top left repeat-x;\n    color: white;\n}\n\n.module table {\n    border-collapse: collapse;\n}\n\n/* MESSAGES & ERRORS */\n\nul.messagelist {\n    padding: 0 0 5px 0;\n    margin: 0;\n}\n\nul.messagelist li {\n    font-size: 12px;\n    display: block;\n    padding: 4px 5px 4px 25px;\n    margin: 0 0 3px 0;\n    border-bottom: 1px solid #ddd;\n    color: #666;\n    background: #ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat;\n}\n\nul.messagelist li.warning{\n    background-image: url(../img/admin/icon_alert.gif);\n}\n\nul.messagelist li.error{\n    background-image: url(../img/admin/icon_error.gif);\n}\n\n.errornote {\n    font-size: 12px !important;\n    display: block;\n    padding: 4px 5px 4px 25px;\n    margin: 0 0 3px 0;\n    border: 1px solid red;\n    color: red;\n    background: #ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat;\n}\n\nul.errorlist {\n    margin: 0 !important;\n    padding: 0 !important;\n}\n\n.errorlist li {\n    font-size: 12px !important;\n    display: block;\n    padding: 4px 5px 4px 25px;\n    margin: 0 0 3px 0;\n    border: 1px solid red;\n    color: white;\n    background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat;\n}\n\n.errorlist li a {\n \tcolor: white;\n    text-decoration: underline;\n}\n\ntd ul.errorlist {\n    margin: 0 !important;\n    padding: 0 !important;\n}\n\ntd ul.errorlist li {\n    margin: 0 !important;\n}\n\n.errors {\n    background: #ffc;\n}\n\n.errors input, .errors select, .errors textarea {\n    border: 1px solid red;\n}\n\ndiv.system-message {\n    background: #ffc;\n    margin: 10px;\n    padding: 6px 8px;\n    font-size: .8em;\n}\n\ndiv.system-message p.system-message-title {\n    padding: 4px 5px 4px 25px;\n    margin: 0;\n    color: red;\n    background: #ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat;\n}\n\n.description {\n    font-size: 12px;\n    padding: 5px 0 0 12px;\n}\n\n/* BREADCRUMBS */\n\ndiv.breadcrumbs {\n    background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x;\n    padding: 2px 8px 3px 8px;\n    font-size: 11px;\n    color: #999;\n    border-top: 1px solid white;\n    border-bottom: 1px solid #ccc;\n    text-align: left;\n}\n\n/* ACTION ICONS */\n\n.addlink {\n    padding-left: 12px;\n    background: url(../img/admin/icon_addlink.gif) 0 .2em no-repeat;\n}\n\n.changelink {\n    padding-left: 12px;\n    background: url(../img/admin/icon_changelink.gif) 0 .2em no-repeat;\n}\n\n.deletelink {\n    padding-left: 12px;\n    background: url(../img/admin/icon_deletelink.gif) 0 .25em no-repeat;\n}\n\na.deletelink:link, a.deletelink:visited {\n    color: #CC3434;\n}\n\na.deletelink:hover {\n    color: #993333;\n}\n\n/* OBJECT TOOLS */\n\n.object-tools {\n    font-size: 10px;\n    font-weight: bold;\n    font-family: Arial,Helvetica,sans-serif;\n    padding-left: 0;\n    float: right;\n    position: relative;\n    margin-top: -2.4em;\n    margin-bottom: -2em;\n}\n\n.form-row .object-tools {\n    margin-top: 5px;\n    margin-bottom: 5px;\n    float: none;\n    height: 2em;\n    padding-left: 3.5em;\n}\n\n.object-tools li {\n    display: block;\n    float: left;\n    background: url(../img/admin/tool-left.gif) 0 0 no-repeat;\n    padding: 0 0 0 8px;\n    margin-left: 2px;\n    height: 16px;\n}\n\n.object-tools li:hover {\n    background: url(../img/admin/tool-left_over.gif) 0 0 no-repeat;\n}\n\n.object-tools a:link, .object-tools a:visited {\n    display: block;\n    float: left;\n    color: white;\n    padding: .1em 14px .1em 8px;\n    height: 14px;\n    background: #999 url(../img/admin/tool-right.gif) 100% 0 no-repeat;\n}\n\n.object-tools a:hover, .object-tools li:hover a {\n    background: #5b80b2 url(../img/admin/tool-right_over.gif) 100% 0 no-repeat;\n}\n\n.object-tools a.viewsitelink, .object-tools a.golink {\n    background: #999 url(../img/admin/tooltag-arrowright.gif) top right no-repeat;\n    padding-right: 28px;\n}\n\n.object-tools a.viewsitelink:hover, .object-tools a.golink:hover {\n    background: #5b80b2 url(../img/admin/tooltag-arrowright_over.gif) top right no-repeat;\n}\n\n.object-tools a.addlink {\n    background: #999 url(../img/admin/tooltag-add.gif) top right no-repeat;\n    padding-right: 28px;\n}\n\n.object-tools a.addlink:hover {\n    background: #5b80b2 url(../img/admin/tooltag-add_over.gif) top right no-repeat;\n}\n\n/* OBJECT HISTORY */\n\ntable#change-history {\n    width: 100%;\n}\n\ntable#change-history tbody th {\n    width: 16em;\n}\n\n/* PAGE STRUCTURE */\n\n#container {\n    position: relative;\n    width: 100%;\n    min-width: 760px;\n    padding: 0;\n}\n\n#content {\n    margin: 10px 15px;\n}\n\n#header {\n    width: 100%;\n}\n\n#content-main {\n    float: left;\n    width: 100%;\n}\n\n#content-related {\n    float: right;\n    width: 18em;\n    position: relative;\n    margin-right: -19em;\n}\n\n#footer {\n    clear: both;\n    padding: 10px;\n}\n\n/* COLUMN TYPES */\n\n.colMS {\n    margin-right: 20em !important;\n}\n\n.colSM {\n    margin-left: 20em !important;\n}\n\n.colSM #content-related {\n    float: left;\n    margin-right: 0;\n    margin-left: -19em;\n}\n\n.colSM #content-main {\n    float: right;\n}\n\n.popup .colM {\n    width: 95%;\n}\n\n.subcol {\n    float: left;\n    width: 46%;\n    margin-right: 15px;\n}\n\n.dashboard #content {\n    width: 500px;\n}\n\n/* HEADER */\n\n#header {\n    background: #417690;\n    color: #ffc;\n    overflow: hidden;\n}\n\n#header a:link, #header a:visited {\n    color: white;\n}\n\n#header a:hover {\n    text-decoration: underline;\n}\n\n#branding h1 {\n    padding: 0 10px;\n    font-size: 18px;\n    margin: 8px 0;\n    font-weight: normal;\n    color: #f4f379;\n}\n\n#branding h2 {\n    padding: 0 10px;\n    font-size: 14px;\n    margin: -8px 0 8px 0;\n    font-weight: normal;\n    color: #ffc;\n}\n\n#user-tools {\n    position: absolute;\n    top: 0;\n    right: 0;\n    padding: 1.2em 10px;\n    font-size: 11px;\n    text-align: right;\n}\n\n/* SIDEBAR */\n\n#content-related h3 {\n    font-size: 12px;\n    color: #666;\n    margin-bottom: 3px;\n}\n\n#content-related h4 {\n    font-size: 11px;\n}\n\n#content-related .module h2 {\n    background: #eee url(../img/admin/nav-bg.gif) bottom left repeat-x;\n    color: #666;\n}\n\n"
  },
  {
    "path": "selfblog/static/admin/css/changelists.css",
    "content": "/* CHANGELISTS */\n\n#changelist {\n    position: relative;\n    width: 100%;\n}\n\n#changelist table {\n    width: 100%;\n}\n\n.change-list .hiddenfields { display:none; }\n\n.change-list .filtered table {\n    border-right: 1px solid #ddd;\n}\n\n.change-list .filtered {\n    min-height: 400px;\n}\n\n.change-list .filtered {\n    background: white url(../img/admin/changelist-bg.gif) top right repeat-y !important;\n}\n\n.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {\n    margin-right: 160px !important;\n    width: auto !important;\n}\n\n.change-list .filtered table tbody th {\n    padding-right: 1em;\n}\n\n#changelist .toplinks {\n    border-bottom: 1px solid #ccc !important;\n}\n\n#changelist .paginator {\n    color: #666;\n    border-top: 1px solid #eee;\n    border-bottom: 1px solid #eee;\n    background: white url(../img/admin/nav-bg.gif) 0 180% repeat-x;\n    overflow: hidden;\n}\n\n.change-list .filtered .paginator {\n    border-right: 1px solid #ddd;\n}\n\n/* CHANGELIST TABLES */\n\n#changelist table thead th {\n    white-space: nowrap;\n    vertical-align: middle;\n}\n\n#changelist table thead th.action-checkbox-column {\n    width: 1.5em;\n    text-align: center;\n}\n\n#changelist table tbody td, #changelist table tbody th {\n    border-left: 1px solid #ddd;\n}\n\n#changelist table tbody td:first-child, #changelist table tbody th:first-child {\n    border-left: 0;\n    border-right: 1px solid #ddd;\n}\n\n#changelist table tbody td.action-checkbox {\n    text-align:center;\n}\n\n#changelist table tfoot {\n    color: #666;\n}\n\n/* TOOLBAR */\n\n#changelist #toolbar {\n    padding: 3px;\n    border-bottom: 1px solid #ddd;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;\n    color: #666;\n}\n\n#changelist #toolbar form input {\n    font-size: 11px;\n    padding: 1px 2px;\n}\n\n#changelist #toolbar form #searchbar {\n    padding: 2px;\n}\n\n#changelist #changelist-search img {\n    vertical-align: middle;\n}\n\n/* FILTER COLUMN */\n\n#changelist-filter {\n    position: absolute;\n    top: 0;\n    right: 0;\n    z-index: 1000;\n    width: 160px;\n    border-left: 1px solid #ddd;\n    background: #efefef;\n    margin: 0;\n}\n\n#changelist-filter h2 {\n    font-size: 11px;\n    padding: 2px 5px;\n    border-bottom: 1px solid #ddd;\n}\n\n#changelist-filter h3 {\n    font-size: 12px;\n    margin-bottom: 0;\n}\n\n#changelist-filter ul {\n    padding-left: 0;\n    margin-left: 10px;\n}\n\n#changelist-filter li {\n    list-style-type: none;\n    margin-left: 0;\n    padding-left: 0;\n}\n\n#changelist-filter a {\n    color: #999;\n}\n\n#changelist-filter a:hover {\n    color: #036;\n}\n\n#changelist-filter li.selected {\n    border-left: 5px solid #ccc;\n    padding-left: 5px;\n    margin-left: -10px;\n}\n\n#changelist-filter li.selected a {\n    color: #5b80b2 !important;\n}\n\n/* DATE DRILLDOWN */\n\n.change-list ul.toplinks {\n    display: block;\n    background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x;\n    border-top: 1px solid white;\n    float: left;\n    padding: 0 !important;\n    margin: 0 !important;\n    width: 100%;\n}\n\n.change-list ul.toplinks li {\n    float: left;\n    width: 9em;\n    padding: 3px 6px;\n    font-weight: bold;\n    list-style-type: none;\n}\n\n.change-list ul.toplinks .date-back a {\n    color: #999;\n}\n\n.change-list ul.toplinks .date-back a:hover {\n    color: #036;\n}\n\n/* PAGINATOR */\n\n.paginator {\n    font-size: 11px;\n    padding-top: 10px;\n    padding-bottom: 10px;\n    line-height: 22px;\n    margin: 0;\n    border-top: 1px solid #ddd;\n}\n\n.paginator a:link, .paginator a:visited {\n    padding: 2px 6px;\n    border: solid 1px #ccc;\n    background: white;\n    text-decoration: none;\n}\n\n.paginator a.showall {\n    padding: 0 !important;\n    border: none !important;\n}\n\n.paginator a.showall:hover {\n    color: #036 !important;\n    background: transparent !important;\n}\n\n.paginator .end {\n    border-width: 2px !important;\n    margin-right: 6px;\n}\n\n.paginator .this-page {\n    padding: 2px 6px;\n    font-weight: bold;\n    font-size: 13px;\n    vertical-align: top;\n}\n\n.paginator a:hover {\n    color: white;\n    background: #5b80b2;\n    border-color: #036;\n}\n\n/* ACTIONS */\n\n.filtered .actions {\n    margin-right: 160px !important;\n    border-right: 1px solid #ddd;\n}\n\n#changelist table input {\n    margin: 0;\n}\n\n#changelist table tbody tr.selected {\n    background-color: #FFFFCC;\n}\n\n#changelist .actions {\n    color: #999;\n    padding: 3px;\n    border-top: 1px solid #fff;\n    border-bottom: 1px solid #ddd;\n    background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x;\n}\n\n#changelist .actions.selected {\n    background: #fffccf;\n    border-top: 1px solid #fffee8;\n    border-bottom: 1px solid #edecd6;\n}\n\n#changelist .actions span.all,\n#changelist .actions span.action-counter,\n#changelist .actions span.clear,\n#changelist .actions span.question {\n    font-size: 11px;\n    margin: 0 0.5em;\n    display: none;\n}\n\n#changelist .actions:last-child {\n    border-bottom: none;\n}\n\n#changelist .actions select {\n    border: 1px solid #aaa;\n    margin-left: 0.5em;\n    padding: 1px 2px;\n}\n\n#changelist .actions label {\n    font-size: 11px;\n    margin-left: 0.5em;\n}\n\n#changelist #action-toggle {\n    display: none;\n}\n\n#changelist .actions .button {\n    font-size: 11px;\n    padding: 1px 2px;\n}\n"
  },
  {
    "path": "selfblog/static/admin/css/dashboard.css",
    "content": "/* DASHBOARD */\n\n.dashboard .module table th {\n    width: 100%;\n}\n\n.dashboard .module table td {\n    white-space: nowrap;\n}\n\n.dashboard .module table td a {\n    display: block;\n    padding-right: .6em;\n}\n\n/* RECENT ACTIONS MODULE */\n\n.module ul.actionlist {\n    margin-left: 0;\n}\n\nul.actionlist li {\n    list-style-type: none;\n}\n\nul.actionlist li.changelink {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    -o-text-overflow: ellipsis;\n}"
  },
  {
    "path": "selfblog/static/admin/css/forms.css",
    "content": "@import url('widgets.css');\n\n/* FORM ROWS */\n\n.form-row {\n    overflow: hidden;\n    padding: 8px 12px;\n    font-size: 11px;\n    border-bottom: 1px solid #eee;\n}\n\n.form-row img, .form-row input {\n    vertical-align: middle;\n}\n\nform .form-row p {\n    padding-left: 0;\n    font-size: 11px;\n}\n\n/* FORM LABELS */\n\nform h4 {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n}\n\nlabel {\n    font-weight: normal !important;\n    color: #666;\n    font-size: 12px;\n}\n\n.required label, label.required {\n    font-weight: bold !important;\n    color: #333 !important;\n}\n\n/* RADIO BUTTONS */\n\nform ul.radiolist li {\n    list-style-type: none;\n}\n\nform ul.radiolist label {\n    float: none;\n    display: inline;\n}\n\nform ul.inline {\n    margin-left: 0;\n    padding: 0;\n}\n\nform ul.inline li {\n    float: left;\n    padding-right: 7px;\n}\n\n/* ALIGNED FIELDSETS */\n\n.aligned label {\n    display: block;\n    padding: 3px 10px 0 0;\n    float: left;\n    width: 8em;\n}\n\n.aligned ul label {\n    display: inline;\n    float: none;\n    width: auto;\n}\n\n.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {\n    width: 350px;\n}\n\nform .aligned p, form .aligned ul {\n    margin-left: 7em;\n    padding-left: 30px;\n}\n\nform .aligned table p {\n    margin-left: 0;\n    padding-left: 0;\n}\n\nform .aligned p.help {\n    padding-left: 38px;\n}\n\n.aligned .vCheckboxLabel {\n    float: none !important;\n    display: inline;\n    padding-left: 4px;\n}\n\n.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {\n    width: 610px;\n}\n\n.checkbox-row p.help {\n    margin-left: 0;\n    padding-left: 0 !important;\n}\n\nfieldset .field-box {\n    float: left;\n    margin-right: 20px;\n}\n\n/* WIDE FIELDSETS */\n\n.wide label {\n    width: 15em !important;\n}\n\nform .wide p {\n    margin-left: 15em;\n}\n\nform .wide p.help {\n    padding-left: 38px;\n}\n\n.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {\n    width: 450px;\n}\n\n/* COLLAPSED FIELDSETS */\n\nfieldset.collapsed * {\n    display: none;\n}\n\nfieldset.collapsed h2, fieldset.collapsed {\n    display: block !important;\n}\n\nfieldset.collapsed h2 {\n    background-image: url(../img/admin/nav-bg.gif);\n    background-position: bottom left;\n    color: #999;\n}\n\nfieldset.collapsed .collapse-toggle {\n    background: transparent;\n    display: inline !important;\n}\n\n/* MONOSPACE TEXTAREAS */\n\nfieldset.monospace textarea {\n    font-family: \"Bitstream Vera Sans Mono\",Monaco,\"Courier New\",Courier,monospace;\n}\n\n/* SUBMIT ROW */\n\n.submit-row {\n    padding: 5px 7px;\n    text-align: right;\n    background: white url(../img/admin/nav-bg.gif) 0 100% repeat-x;\n    border: 1px solid #ccc;\n    margin: 5px 0;\n    overflow: hidden;\n}\n\n.submit-row input {\n    margin: 0 0 0 5px;\n}\n\n.submit-row p {\n    margin: 0.3em;\n}\n\n.submit-row p.deletelink-box {\n    float: left;\n}\n\n.submit-row .deletelink {\n    background: url(../img/admin/icon_deletelink.gif) 0 50% no-repeat;\n    padding-left: 14px;\n}\n\n/* CUSTOM FORM FIELDS */\n\n.vSelectMultipleField {\n    vertical-align: top !important;\n}\n\n.vCheckboxField {\n    border: none;\n}\n\n.vDateField, .vTimeField {\n    margin-right: 2px;\n}\n\n.vURLField {\n    width: 30em;\n}\n\n.vLargeTextField, .vXMLLargeTextField {\n    width: 48em;\n}\n\n.flatpages-flatpage #id_content {\n    height: 40.2em;\n}\n\n.module table .vPositiveSmallIntegerField {\n    width: 2.2em;\n}\n\n.vTextField {\n    width: 20em;\n}\n\n.vIntegerField {\n    width: 5em;\n}\n\n.vForeignKeyRawIdAdminField {\n    width: 5em;\n}\n\n/* INLINES */\n\n.inline-group {\n    padding: 0;\n    border: 1px solid #ccc;\n    margin: 10px 0;\n}\n\n.inline-group .aligned label {\n    width: 8em;\n}\n\n.inline-related {\n    position: relative;\n}\n\n.inline-related h3 {\n    margin: 0;\n    color: #666;\n    padding: 3px 5px;\n    font-size: 11px;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;\n    border-bottom: 1px solid #ddd;\n}\n\n.inline-related h3 span.delete {\n    float: right;\n}\n\n.inline-related h3 span.delete label {\n    margin-left: 2px;\n    font-size: 11px;\n}\n\n.inline-related fieldset {\n    margin: 0;\n    background: #fff;\n    border: none;\n}\n\n.inline-related fieldset.module h3 {\n    margin: 0;\n    padding: 2px 5px 3px 5px;\n    font-size: 11px;\n    text-align: left;\n    font-weight: bold;\n    background: #bcd;\n    color: #fff;\n}\n\n.inline-group .tabular fieldset.module {\n    border: none;\n    border-bottom: 1px solid #ddd;\n}\n\n.inline-related.tabular fieldset.module table {\n    width: 100%;\n}\n\n.last-related fieldset {\n    border: none;\n}\n\n.inline-group .tabular tr.has_original td {\n    padding-top: 2em;\n}\n\n.inline-group .tabular tr td.original {\n    padding: 2px 0 0 0;\n    width: 0;\n    _position: relative;\n}\n\n.inline-group .tabular th.original {\n    width: 0px;\n    padding: 0;\n}\n\n.inline-group .tabular td.original p {\n    position: absolute;\n    left: 0;\n    height: 1.1em;\n    padding: 2px 7px;\n    overflow: hidden;\n    font-size: 9px;\n    font-weight: bold;\n    color: #666;\n    _width: 700px;\n}\n\n.inline-group ul.tools {\n    padding: 0;\n    margin: 0;\n    list-style: none;\n}\n\n.inline-group ul.tools li {\n    display: inline;\n    padding: 0 5px;\n}\n\n.inline-group div.add-row,\n.inline-group .tabular tr.add-row td {\n    color: #666;\n    padding: 3px 5px;\n    border-bottom: 1px solid #ddd;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;\n}\n\n.inline-group .tabular tr.add-row td {\n    padding: 4px 5px 3px;\n    border-bottom: none;\n}\n\n.inline-group ul.tools a.add,\n.inline-group div.add-row a,\n.inline-group .tabular tr.add-row td a {\n    background: url(../img/admin/icon_addlink.gif) 0 50% no-repeat;\n    padding-left: 14px;\n    font-size: 11px;\n    outline: 0; /* Remove dotted border around link */\n}\n\n.empty-form {\n    display: none;\n}\n\n/* IE7 specific bug fixes */\n\n.submit-row input {\n    float: right;\n}"
  },
  {
    "path": "selfblog/static/admin/css/ie.css",
    "content": "/* IE 6 & 7 */\n\n/* Proper fixed width for dashboard in IE6 */\n\n.dashboard #content {\n    *width: 768px;\n}\n\n.dashboard #content-main {\n    *width: 535px;\n}\n\n/* IE 6 ONLY */\n\n/* Keep header from flowing off the page */\n\n#container {\n    _position: static;\n}\n\n/* Put the right sidebars back on the page */\n\n.colMS #content-related {\n    _margin-right: 0;\n    _margin-left: 10px;\n    _position: static;\n}\n\n/* Put the left sidebars back on the page */\n\n.colSM #content-related {\n    _margin-right: 10px;\n    _margin-left: -115px;\n    _position: static;\n}\n\n.form-row {\n    _height: 1%;\n}\n\n/* Fix right margin for changelist filters in IE6 */\n\n#changelist-filter ul {\n    _margin-right: -10px;\n}\n\n/* IE ignores min-height, but treats height as if it were min-height */\n\n.change-list .filtered {\n    _height: 400px;\n}\n\n/* IE doesn't know alpha transparency in PNGs */\n\n.inline-deletelink {\n    background: transparent url(../img/admin/inline-delete-8bit.png) no-repeat;\n}"
  },
  {
    "path": "selfblog/static/admin/css/jquery-ui-grappelli-extensions.css",
    "content": "\n\n\n/*  Widget Basics\n------------------------------------------------------------------------------------------------------ */\n\n.module.ui-widget {\n    border: none;\n    background: #fff;\n}\n.ui-widget-content {\n    border: 1px solid #ccc;\n    border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;\n    border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;\n    background: #eee;\n}\n\n\n\n/*  Sortable\n------------------------------------------------------------------------------------------------------ */\n\n.ui-sortable-helper, \n.ui-sortable-placeholder {\n    opacity: .8;\n}\n\n.ui-sortable-placeholder, \n.ui-sortable .module.ui-sortable-placeholder {\n    border: 1px solid #bdbdbd;\n    border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px;\n    background: transparent url('../img/backgrounds/ui-sortable-placeholder.png') 0 0 repeat scroll !important;\n}\n.group.stacked div.ui-sortable-placeholder {\n    display: block;\n    margin-top: 2px !important;\n}\n.group.tabular div.ui-sortable-placeholder {\n    border: 0 !important;\n    overflow: hidden;\n}\n.group.tabular .ui-sortable .module.ui-sortable-placeholder .td {\n    background: transparent;\n}\n.group.tabular .ui-sortable .module.ui-sortable-placeholder .th, \n.group.tabular .ui-sortable .module.ui-sortable-placeholder .td {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n}\n.group.tabular .module.ui-sortable-helper {\n    border-top: 0 !important;\n}\n.group.tabular .ui-sortable-helper .th, .group.tabular .ui-sortable-helper .td {\n    background: #ffffcc !important;\n}\n.group.stacked .ui-sortable-helper, .group.stacked .ui-sortable-helper .module, .group.stacked .ui-sortable-helper h2, .group.stacked .ui-sortable-helper h3, .group.stacked .ui-sortable-helper h4, \n.group.stacked .collapse.predelete.ui-sortable-helper > h3.collapse-handler, \n.group.stacked .collapse.open.predelete.ui-sortable-helper > h3.collapse-handler, \n.group.stacked .collapse.predelete.ui-sortable-helper h4.collapse-handler, \n.group.stacked .collapse.open.predelete.ui-sortable-helper h4.collapse-handler {\n    background: #ffffcc !important;\n}\n\n\n\n/*  Accordion\n------------------------------------------------------------------------------------------------------ */\n\n\n/* Overlays */\n.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }\n.ui-accordion .ui-accordion-li-fix { display: inline; }\n.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }\n.ui-accordion .ui-accordion-header a {\n    display: block;\n    font-size: 1em;\n    padding: 0 0 0 12px;\n}\n.ui-accordion .ui-accordion-header .ui-icon { display: none; }\n.ui-accordion .ui-accordion-content {\n    top: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding: 0;\n/*    border-top: 1px solid #fff;*/\n}\n.ui-accordion .ui-accordion-content-active { display: block; }\n\n\n\n/*  Datepicker\n----------------------------------*/\n.datetime br {\n    display: none;\n}\n.datetimeshortcuts {\n    width: 40px;\n    position: relative;\n    margin-left: 10px;\n}\n.datetimeshortcuts a {\n    margin-left: 0 !important;\n}\n\n.ui-accordion-header {\n    margin-top: 2px !important;\n    cursor: pointer;\n    outline: none;\n}\n.ui-accordion .ui-accordion-header a {\n    padding: 0 0 0 12px;\n    color: #444;\n    outline: none;\n}\n.ui-accordion .ui-accordion-header {\n    display: block;\n    margin: 0;\n    padding: 6px 0;\n    outline: none;\n    font-size: 12px;\n    border: 1px solid #bdbdbd !important;\n    background: #cee9f2;\n    background: -moz-linear-gradient(top, #e1f0f5, #cee9f2);\n    background: -webkit-gradient(linear, left top, left bottom, from(#e1f0f5), to(#cee9f2));\n    background: -o-linear-gradient(top, #e1f0f5, #cee9f2);\n}\n\n.ui-accordion-header.ui-state-default {\n    border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;\n}\n.ui-accordion-header.ui-state-hover {\n    background: #cee9f2;\n    background: -moz-linear-gradient(top, #cee9f2, #e1f0f5);\n    background: -webkit-gradient(linear, left top, left bottom, from(#cee9f2), to(#e1f0f5));\n    background: -o-linear-gradient(top, #cee9f2, #e1f0f5);\n}\n.ui-accordion-header.ui-state-active {\n    border-bottom: 1px solid #c7c7c7 !important;\n    border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0;\n    background: #cee9f2;\n    background: -moz-linear-gradient(top, #cee9f2, #e1f0f5);\n    background: -webkit-gradient(linear, left top, left bottom, from(#cee9f2), to(#e1f0f5));\n    background: -o-linear-gradient(top, #cee9f2, #e1f0f5);\n}\n\n.ui-accordion-content {\n    border-top: 0 !important;\n    border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;\n    border-top-right-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0;\n}\n.ui-accordion-content h3 {\n    display: none;\n}\n.ui-accordion-content .module:first-child {\n    margin-top: 0 !important;\n    border-top-color: #f4f4f4 !important;\n}\n.module.accordion>.module {\n    margin-bottom: 2px;\n    border-top: 0 !important;\n}\n.module.accordion>.module:last-of-type {\n    margin-bottom: 0;\n}\n\n\n/*  Accordion Module ......................................... */\n\n.ui-accordion-header.ui-state-default, \n.module .ui-accordion-header.ui-state-default {\n    border: 1px solid #bdbdbd;\n    background-color: #a1d4e5;\n}\n.ui-accordion-header.ui-state-default:hover, \n.module .ui-accordion-header.ui-state-default:hover {\n    background-color: #d6d6d6;\n}\n.ui-accordion-header.ui-state-active, \n.module .ui-accordion-header.ui-state-active {\n    border: 1px solid #bdbdbd;\n    background-color: #d6d6d6;\n}\n\n\n\n/*  Accordion Module in Group......................................... */\n\n/*.group .module .ui-accordion-header.ui-state-default {\n    border: 1px solid #c7c7c7;\n    background-color: #cee9f2;\n}\n.group .module .ui-accordion-header.ui-state-default:hover {\n    background-color: #e0e0e0;\n}\n.group .module .ui-accordion-header.ui-state-active {\n    border: 1px solid #c7c7c7;\n    background-color: #e0e0e0;\n}\n.group .module .ui-accordion-header {\n    border-top: 1px solid #4ef;\n}\n*/\n\n\n/*  Datepicker\n------------------------------------------------------------------------------------------------------ */\n\n.ui-datepicker {\n    position: absolute;\n    display: none;\n    padding: 3px 3px 0;\n    width: auto !important;\n    border-color: #bdbdbd;\n    box-shadow: 0 10px 50px #333; -moz-box-shadow: 0 10px 50px #333; -webkit-box-shadow: 0 10px 50px #333;\n}\n.ui-datepicker .ui-datepicker-header {\n    padding: 2px 0;\n    height: 25px;\n}\n.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next, \n.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover {\n    position: absolute;\n    top: 4px;\n    width: 20px;\n    height: 30px;\n    background-color: transparent;\n    background-position: 50% 50%;\n    background-repeat: no-repeat;\n    cursor: pointer;\n}\n.ui-datepicker .ui-datepicker-prev {\n    left: 3px;\n    background-image: url('../img/icons/ui-datepicker-prev.png');\n}\n.ui-datepicker .ui-datepicker-prev-hover {\n    left: 3px;\n    border: none;\n    background-image: url('../img/icons/ui-datepicker-prev-hover.png');\n}\n.ui-datepicker .ui-datepicker-next {\n    right: 3px;\n    background-image: url('../img/icons/ui-datepicker-next.png');\n}\n.ui-datepicker .ui-datepicker-next-hover {\n    right: 3px;\n    border: none;\n    background-image: url('../img/icons/ui-datepicker-next-hover.png');\n}\n.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span {\n    display: none !important;\n}\n\n\n.ui-datepicker .ui-datepicker-title {\n    margin: 3px 25px 2px;\n    line-height: 1.8em;\n    text-align: center;\n}\n.ui-datepicker .ui-datepicker-title select {\n    float:left;\n    font-size:1em;\n    margin: -3px 0 -1px !important;\n    min-width: 30px;\n}\n.ui-datepicker select.ui-datepicker-month-year {width: 100%;}\n.ui-datepicker select.ui-datepicker-month, \n.ui-datepicker select.ui-datepicker-year { width: 49%;}\n.ui-datepicker .ui-datepicker-title select.ui-datepicker-year {\n    float: right;\n}\n.ui-datepicker table {\n    width: 100%;\n    font-size: 12px;\n    margin: 0 0 2px;\n}\n.ui-datepicker th {\n    padding: 5px 0;\n    text-align: center;\n    font-weight: bold;\n    border: 0;\n    background: transparent;\n}\n.ui-datepicker td {\n    min-width: 25px;\n    border: 0; padding: 1px;\n}\n.ui-datepicker td span, .ui-datepicker td a {\n    padding: 4px 0 3px;\n    margin:0!important;\n    text-align: center;\n    display:block;\n    border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;\n}\n.ui-datepicker td a.ui-state-hover {\n    color: #fff !important;\n    border-color: transparent !important;\n    background: #444 !important;\n}\n.ui-datepicker td a.ui-state-active {\n    background: #fff;\n}\n.ui-datepicker td a.ui-state-highlight {\n    border-color: #bababa;\n    background: #d6d6d6;\n}\n.ui-datepicker .ui-datepicker-buttonpane {\n    background-image: none;\n    margin: 5px 0 0;\n    padding: 0;\n    border: 0;\n}\n.ui-datepicker .ui-datepicker-buttonpane button {\n    float: right;\n    margin: 3px 0;\n    padding: 4px 5px 5px;\n    height: 25px;\n    color: #aaa; font-size: 11px;\n    border: 1px solid #c7c7c7;\n    background: transparent;\n    cursor: pointer;\n}\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n    .ui-datepicker .ui-datepicker-buttonpane button {\n        padding: 5px 8px 4px;\n    }\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n    opacity: 1 !important;\n    color: #444; font-weight: bold;\n    background: #cee9f2;\n}\n.ui-datepicker .ui-datepicker-buttonpane button.ui-state-hover {\n    color: #fff !important;\n    border-color: #444 !important;\n    background: #444 !important;\n}\n\n.ui-datepicker-multi .ui-datepicker-group-first .ui-datepicker-title, \n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-title {\n    margin-right: 5px !important;\n}\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-title, \n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-title {\n    margin-left: 5px !important;\n}\n\n.ui-datepicker-multi .ui-datepicker-group table {\n    width: 95%;\n}\n.ui-datepicker-multi .ui-datepicker-group-first table, \n.ui-datepicker-multi .ui-datepicker-group-middle table {\n    margin-right: 5px !important;\n}\n.ui-datepicker-multi .ui-datepicker-group-middle table, \n.ui-datepicker-multi .ui-datepicker-group-last table {\n    margin-left: 5px !important;\n}\n.ui-datepicker-multi .ui-datepicker-group-middle table {\n    margin-left: 3px !important;\n}\n.ui-datepicker-multi .ui-datepicker-buttonpane {\n    border: none;\n}\n\n.ui-datepicker-append {\n    margin-left: 6px; color: #999; font-size: 10px;\n}\n\n.ui-datepicker td.ui-state-disabled {\n    padding:1px;\n    text-align: center;\n}\n.ui-datepicker td.ui-state-disabled span {\n    background: #ccc;\n    color: #555 !important;\n    font-weight: bold;\n    font-size: 11px;\n    border-radius: 3px; -moz-border-radius: 3px; -webkit-borderradius: 3px;\n}\nbutton.ui-datepicker-close {\n    float: left !important;\n    margin-right: 4px !important;\n}\n\n\n\n/*  Timepicker\n------------------------------------------------------------------------------------------------------ */\n\n#ui-timepicker {\n    position: absolute;\n    display: none;\n    padding: 5px 3px 3px 5px;\n    width: 216px;\n    border: 1px solid #bdbdbd;\n    box-shadow: 0 10px 50px #333; -moz-box-shadow: 0 10px 50px #333; -webkit-box-shadow: 0 10px 50px #333;\n}\n#ui-timepicker ul {\n    position: relative;\n    float: left;\n    clear: both;\n    width: auto;\n}\n#ui-timepicker ul li.row {\n    position: relative;\n    float: left;\n    display: block;\n    margin: 0 2px 2px 0;\n    padding: 2px 10px 1px;\n    width: 30px;\n    font-size: 11px;\n    text-align: center;\n    border: 0;\n    border-radius: 3px; -moz-border-radius: 3px; -webkit-borderradius: 3px;\n    cursor: pointer;\n}\n#ui-timepicker .row.ui-state-default {\n    border: 1px solid #c7c7c7 !important;\n    background: #e1f0f5;\n}\n#ui-timepicker .row.ui-state-active {\n    border: 1px solid #bababa !important;\n    background: #d6d6d6;\n}\n#ui-timepicker .row.ui-state-default:hover {\n    color: #fff;\n    border: 1px solid #666 !important;\n    background: #444;\n}\n\n\n\n/*  Tabs\n------------------------------------------------------------------------------------------------------ */\n\n.ui-tabs {\n    zoom: 1;\n    border: 0 !important;\n    background: transparent;\n}\n.ui-tabs .ui-tabs-nav {\n    margin-top: 2px;\n    padding: 0;\n    color: #444;\n    font-size: 12px;\n    border: none;\n    border-bottom: 1px solid #bdbdbd;\n    border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0;\n    background: none;\n}\n.ui-tabs:first-child .ui-tabs-nav {\n    margin-top: 0;\n}\n.ui-tabs .ui-tabs-nav li {\n    position: relative; float: left;\n    border-bottom-width: 1px !important;\n    margin: 0 2px -1px 0;\n    padding: 0;\n}\n.ui-tabs .ui-tabs-nav li a {\n    float: left;\n    text-decoration: none;\n    padding: 6px 10px 6px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected {\n    padding-bottom: 0px; border-bottom-width: 1px;\n}\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }\n.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { \n    cursor: pointer; \n} /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */\n.tab-handler.ui-state-default {\n    background: #e1f0f5;\n    background: -moz-linear-gradient(top, #cee9f2, #e1f0f5);\n    background: -webkit-gradient(linear, left top, left bottom, from(#cee9f2), to(#e1f0f5));\n    background: -o-linear-gradient(top, #cee9f2, #e1f0f5);\n}\n.tab-handler.ui-state-default:hover {\n    color: #444 !important;\n    border: 1px solid #c7c7c7;\n    background: #cee9f2;\n    background: -moz-linear-gradient(top, #e1f0f5, #cee9f2);\n    background: -webkit-gradient(linear, left top, left bottom, from(#e1f0f5), to(#cee9f2));\n    background: -o-linear-gradient(top, #e1f0f5, #cee9f2);\n}\n.tab-handler.ui-state-default.ui-tabs-selected {\n    border: 1px solid #c7c7c7;\n    border-bottom-color: #d4d4d4;\n    background: #e9e9e9;\n    background: -moz-linear-gradient(top, #e0e0e0, #e9e9e9);\n    background: -webkit-gradient(linear, left top, left bottom, from(#e0e0e0), to(#e9e9e9));\n    background: -o-linear-gradient(top, #e0e0e0, #e9e9e9);\n}\n\n\n.ui-tabs-nav li a:hover {\n    color: #444 !important;\n}\n.ui-tabs-nav li.ui-tabs-selected a {\n    color: #444 !important;\n}\n.ui-tabs .ui-tabs-panel {\n    margin-top: 0 !important;\n    padding: 0;\n    display: block;\n    border: 1px solid #ccc;\n    border-top-left-radius: 0; -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0;\n    border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;\n    border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px;\n    border-bottom-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px;\n    background: #eee;\n}\n.ui-tabs-panel h3 { display: none; }\n.ui-tabs-panel > h3 + .module {\n    border-top-right-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px;\n}\n.ui-tabs-panel > h3 + .module > h4:first-child {\n    margin-top: -1px;\n/*    border-top: 0 !important;*/\n    border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;\n}\n.ui-tabs .ui-tabs-hide { display: none !important; }\n\n/*.group-accordion-container h3 { display: none; }*/\n\n\n\n\n\n/* Menu\n----------------------------------*/\n.ui-menu {\n    list-style:none;\n    padding: 2px;\n    margin: 0;\n    display:block;\n}\n.ui-menu .ui-menu {\n    margin-top: -3px;\n}\n.ui-menu .ui-menu-item {\n    margin: 0;\n    padding: 0;\n    width: 100%;\n}\n.ui-menu .ui-menu-item a {\n    text-decoration: none;\n    display: block;\n    padding: 5px 5px 4px;\n}\n.ui-menu .ui-menu-item a.ui-state-hover,\n.ui-menu .ui-menu-item a.ui-state-active {\n/*    margin: -1px;*/\n    border: 0 !important;\n}\n\n\n/*  Autocomplete\n------------------------------------------------------------------------------------------------------ */\n\n.ui-autocomplete {\n    position: absolute;\n    cursor: default;\n    padding: 3px;\n    border: 1px solid #ccc;\n    border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;\n    background: #eee;\n    box-shadow: 0 10px 50px #333; -moz-box-shadow: 0 10px 50px #333; -webkit-box-shadow: 0 10px 50px #333;\n}\n* html .ui-autocomplete {\n    width: 1px;\n}\n.ui-autocomplete-category {\n    font-weight: bold;\n    line-height: 1.5;\n    font-style: italic;\n    margin: 0;\n    padding: 5px;\n}\n.ui-autocomplete li:first-child span {\n    display: block;\n    padding: 1px 4px;\n    color: #999;\n    font-weight: bold;\n}\n.ui-autocomplete .ui-menu-item + .ui-menu-item  {\n    margin-top: 2px;\n    border-top: 0 !important;\n}\n.ui-autocomplete li:first-child + li {\n    margin-top: 4px;\n}\n.ui-autocomplete .ui-menu-item a {\n    margin: 0;\n    padding: 3px 4px;\n    color: #444;\n    font-weight: bold;\n    border: 1px solid #c7c7c7;\n    border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px;\n    background: #cee9f2;\n}\n.ui-autocomplete .ui-menu-item a.ui-state-hover, \n.ui-autocomplete .ui-menu-item a:hover, .ui-autocomplete .ui-menu-item a:active {\n    margin: 0 !important;\n    padding: 3px 4px !important;\n    color: #fff !important;\n    border: 1px solid transparent !important;\n    border-radius: 2px; -moz-border-radius: 2px; -webkit-border-radius: 2px;\n    background: #444 !important;\n}\n"
  },
  {
    "path": "selfblog/static/admin/css/login.css",
    "content": "/* LOGIN FORM */\n\nbody.login {\n    background: #eee;\n}\n\n.login #container {\n    background: white;\n    border: 1px solid #ccc;\n    width: 28em;\n    min-width: 300px;\n    margin-left: auto;\n    margin-right: auto;\n    margin-top: 100px;\n}\n\n.login #content-main {\n    width: 100%;\n}\n\n.login form {\n    margin-top: 1em;\n}\n\n.login .form-row {\n    padding: 4px 0;\n    float: left;\n    width: 100%;\n}\n\n.login .form-row label {\n    float: left;\n    width: 9em;\n    padding-right: 0.5em;\n    line-height: 2em;\n    text-align: right;\n    font-size: 1em;\n    color: #333;\n}\n\n.login .form-row #id_username, .login .form-row #id_password {\n    width: 14em;\n}\n\n.login span.help {\n    font-size: 10px;\n    display: block;\n}\n\n.login .submit-row {\n    clear: both;\n    padding: 1em 0 0 9.4em;\n}\n\n"
  },
  {
    "path": "selfblog/static/admin/css/rtl.css",
    "content": "body {\n    direction: rtl;\n}\n\n/* LOGIN */\n\n.login .form-row {\n    float: right;\n}\n\n.login .form-row label {\n    float: right;\n    padding-left: 0.5em;\n    padding-right: 0;\n    text-align: left;\n}\n\n.login .submit-row {\n    clear: both;\n    padding: 1em 9.4em 0 0;\n}\n\n/* GLOBAL */\n\nth {\n    text-align: right;\n}\n\n.module h2, .module caption {\n    text-align: right;\n}\n\n.addlink, .changelink {\n    padding-left: 0px;\n    padding-right: 12px;\n    background-position: 100% 0.2em;\n}\n\n.deletelink {\n    padding-left: 0px;\n    padding-right: 12px;\n    background-position: 100% 0.25em;\n}\n\n.object-tools {\n    float: left;\n}\n\nthead th:first-child,\ntfoot td:first-child {\n    border-left: 1px solid #ddd !important;\n}\n\n/* LAYOUT */\n\n#user-tools {\n    right: auto;\n    left: 0;\n    text-align: left;\n}\n\ndiv.breadcrumbs {\n    text-align: right;\n}\n\n#content-main {\n    float: right;\n}\n\n#content-related {\n    float: left;\n    margin-left: -19em;\n    margin-right: auto;\n}\n\n.colMS {\n    margin-left: 20em !important;\n    margin-right: 10px !important;\n}\n\n/* SORTABLE TABLES */\n\n\ntable thead th.sorted a {\n    padding-left: 13px;\n    padding-right: 0px;\n}\n\ntable thead th.ascending a,\ntable thead th.descending a {\n    background-position: left;\n}\n\n/* dashboard styles */\n\n.dashboard .module table td a {\n    padding-left: .6em;\n    padding-right: 12px;\n}\n\n/* changelists styles */\n\n.change-list ul.toplinks li {\n    float: right;\n}\n\n.change-list .filtered {\n    background: white url(../img/admin/changelist-bg_rtl.gif) top left repeat-y !important;\n}\n\n.change-list .filtered table {\n    border-left: 1px solid #ddd;\n    border-right: 0px none;\n}\n\n#changelist-filter {\n    right: auto;\n    left: 0;\n    border-left: 0px none;\n    border-right: 1px solid #ddd;\n}\n\n.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull {\n    margin-right: 0px !important;\n    margin-left: 160px !important;\n}\n\n#changelist-filter li.selected {\n    border-left: 0px none;\n    padding-left: 0px;\n    margin-left: 0;\n    border-right: 5px solid #ccc;\n    padding-right: 5px;\n    margin-right: -10px;\n}\n\n.filtered .actions {\n    border-left:1px solid #DDDDDD;\n    margin-left:160px !important;\n    border-right: 0 none;\n    margin-right:0 !important;\n}\n\n#changelist table tbody td:first-child, #changelist table tbody th:first-child {\n    border-right: 0;\n    border-left: 1px solid #ddd;\n}\n\n/* FORMS */\n\n.aligned label {\n    padding: 0 0 3px 1em;\n    float: right;\n}\n\n.submit-row {\n    text-align: left\n}\n\n.submit-row p.deletelink-box {\n    float: right;\n}\n\n.submit-row .deletelink {\n    background: url(../img/admin/icon_deletelink.gif) 0 50% no-repeat;\n    padding-right: 14px;\n}\n\n.vDateField, .vTimeField {\n    margin-left: 2px;\n}\n\nform ul.inline li {\n    float: right;\n    padding-right: 0;\n    padding-left: 7px;\n}\n\ninput[type=submit].default, .submit-row input.default {\n    float: left;\n}\n\nfieldset .field-box {\n    float: right;\n    margin-left: 20px;\n}\n\n.errorlist li {\n    background-position: 100% .3em;\n    padding: 4px 25px 4px 5px;\n}\n\n.errornote {\n    background-position: 100% .3em;\n    padding: 4px 25px 4px 5px;\n}\n\n/* WIDGETS */\n\n.calendarnav-previous {\n    top: 0;\n    left: auto;\n    right: 0;\n}\n\n.calendarnav-next {\n    top: 0;\n    right: auto;\n    left: 0;\n}\n\n.calendar caption, .calendarbox h2 {\n    text-align: center;\n}\n\n.selector {\n    float: right;\n}\n\n.selector .selector-filter {\n    text-align: right;\n}\n\n.inline-deletelink {\n    float: left;\n}\n\n/* MISC */\n\n.inline-related h2, .inline-group h2 {\n    text-align: right\n}\n\n.inline-related h3 span.delete {\n    padding-right: 20px;\n    padding-left: inherit;\n    left: 10px;\n    right: inherit;\n}\n\n.inline-related h3 span.delete label {\n    margin-left: inherit;\n    margin-right: 2px;\n}\n"
  },
  {
    "path": "selfblog/static/admin/css/widgets.css",
    "content": "/* SELECTOR (FILTER INTERFACE) */\n\n.selector {\n    width: 580px;\n    float: left;\n}\n\n.selector select {\n    width: 270px;\n    height: 17.2em;\n}\n\n.selector-available, .selector-chosen {\n    float: left;\n    width: 270px;\n    text-align: center;\n    margin-bottom: 5px;\n}\n\n.selector-available h2, .selector-chosen h2 {\n    border: 1px solid #ccc;\n}\n\n.selector .selector-available h2 {\n    background: white url(../img/admin/nav-bg.gif) bottom left repeat-x;\n    color: #666;\n}\n\n.selector .selector-filter {\n    background: white;\n    border: 1px solid #ccc;\n    border-width: 0 1px;\n    padding: 3px;\n    color: #999;\n    font-size: 10px;\n    margin: 0;\n    text-align: left;\n}\n\n.selector .selector-chosen .selector-filter {\n    padding: 4px 5px;\n}\n\n.selector .selector-available input {\n    width: 230px;\n}\n\n.selector ul.selector-chooser {\n    float: left;\n    width: 22px;\n    height: 50px;\n    background: url(../img/admin/chooser-bg.gif) top center no-repeat;\n    margin: 8em 3px 0 3px;\n    padding: 0;\n}\n\n.selector-chooser li {\n    margin: 0;\n    padding: 3px;\n    list-style-type: none;\n}\n\n.selector select {\n    margin-bottom: 5px;\n    margin-top: 0;\n}\n\n.selector-add, .selector-remove {\n    width: 16px;\n    height: 16px;\n    display: block;\n    text-indent: -3000px;\n    overflow: hidden;\n}\n\n.selector-add {\n    background: url(../img/admin/selector-add.gif) top center no-repeat;\n    margin-bottom: 2px;\n}\n\n.selector-remove {\n    background: url(../img/admin/selector-remove.gif) top center no-repeat;\n}\n\na.selector-chooseall, a.selector-clearall {\n    display: block;\n    width: 6em;\n    text-align: left;\n    margin-left: auto;\n    margin-right: auto;\n    font-weight: bold;\n    color: #666;\n    padding: 3px 0 3px 18px;\n}\n\na.selector-chooseall:hover, a.selector-clearall:hover {\n    color: #036;\n}\n\na.selector-chooseall {\n    width: 7em;\n    background: url(../img/admin/selector-addall.gif) left center no-repeat;\n}\n\na.selector-clearall {\n    background: url(../img/admin/selector-removeall.gif) left center no-repeat;\n}\n\n\n/* STACKED SELECTORS */\n\n.stacked {\n    float: left;\n    width: 500px;\n}\n\n.stacked select {\n    width: 480px;\n    height: 10.1em;\n}\n\n.stacked .selector-available, .stacked .selector-chosen {\n    width: 480px;\n}\n\n.stacked .selector-available {\n    margin-bottom: 0;\n}\n\n.stacked .selector-available input {\n    width: 442px;\n}\n\n.stacked ul.selector-chooser {\n    height: 22px;\n    width: 50px;\n    margin: 0 0 3px 40%;\n    background: url(../img/admin/chooser_stacked-bg.gif) top center no-repeat;\n}\n\n.stacked .selector-chooser li {\n    float: left;\n    padding: 3px 3px 3px 5px;\n}\n\n.stacked .selector-chooseall, .stacked .selector-clearall {\n    display: none;\n}\n\n.stacked .selector-add {\n    background-image: url(../img/admin/selector_stacked-add.gif);\n}\n\n.stacked .selector-remove {\n    background-image: url(../img/admin/selector_stacked-remove.gif);\n}\n\n\n/* DATE AND TIME */\n\np.datetime {\n    line-height: 20px;\n    margin: 0;\n    padding: 0;\n    color: #666;\n    font-size: 11px;\n    font-weight: bold;\n}\n\n.datetime span {\n    font-size: 11px;\n    color: #ccc;\n    font-weight: normal;\n    white-space: nowrap;\n}\n\ntable p.datetime {\n    font-size: 10px;\n    margin-left: 0;\n    padding-left: 0;\n}\n\n/* FILE UPLOADS */\n\np.file-upload {\n    line-height: 20px;\n    margin: 0;\n    padding: 0;\n    color: #666;\n    font-size: 11px;\n    font-weight: bold;\n}\n\n.file-upload a {\n    font-weight: normal;\n}\n\n.file-upload .deletelink {\n    margin-left: 5px;\n}\n\nspan.clearable-file-input label {\n    color: #333;\n    font-size: 11px;\n    display: inline;\n    float: none;\n}\n\n/* CALENDARS & CLOCKS */\n\n.calendarbox, .clockbox {\n    margin: 5px auto;\n    font-size: 11px;\n    width: 16em;\n    text-align: center;\n    background: white;\n    position: relative;\n}\n\n.clockbox {\n    width: auto;\n}\n\n.calendar {\n    margin: 0;\n    padding: 0;\n}\n\n.calendar table {\n    margin: 0;\n    padding: 0;\n    border-collapse: collapse;\n    background: white;\n    width: 99%;\n}\n\n.calendar caption, .calendarbox h2 {\n    margin: 0;\n    font-size: 11px;\n    text-align: center;\n    border-top: none;\n}\n\n.calendar th {\n    font-size: 10px;\n    color: #666;\n    padding: 2px 3px;\n    text-align: center;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x;\n    border-bottom: 1px solid #ddd;\n}\n\n.calendar td {\n    font-size: 11px;\n    text-align: center;\n    padding: 0;\n    border-top: 1px solid #eee;\n    border-bottom: none;\n}\n\n.calendar td.selected a {\n    background: #C9DBED;\n}\n\n.calendar td.nonday {\n    background: #efefef;\n}\n\n.calendar td.today a {\n    background: #ffc;\n}\n\n.calendar td a, .timelist a {\n    display: block;\n    font-weight: bold;\n    padding: 4px;\n    text-decoration: none;\n    color: #444;\n}\n\n.calendar td a:hover, .timelist a:hover {\n    background: #5b80b2;\n    color: white;\n}\n\n.calendar td a:active, .timelist a:active {\n    background: #036;\n    color: white;\n}\n\n.calendarnav {\n    font-size: 10px;\n    text-align: center;\n    color: #ccc;\n    margin: 0;\n    padding: 1px 3px;\n}\n\n.calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover {\n    color: #999;\n}\n\n.calendar-shortcuts {\n    background: white;\n    font-size: 10px;\n    line-height: 11px;\n    border-top: 1px solid #eee;\n    padding: 3px 0 4px;\n    color: #ccc;\n}\n\n.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next {\n    display: block;\n    position: absolute;\n    font-weight: bold;\n    font-size: 12px;\n    background: #C9DBED url(../img/admin/default-bg.gif) bottom left repeat-x;\n    padding: 1px 4px 2px 4px;\n    color: white;\n}\n\n.calendarnav-previous:hover, .calendarnav-next:hover {\n    background: #036;\n}\n\n.calendarnav-previous {\n    top: 0;\n    left: 0;\n}\n\n.calendarnav-next {\n    top: 0;\n    right: 0;\n}\n\n.calendar-cancel {\n    margin: 0 !important;\n    padding: 0;\n    font-size: 10px;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x;\n    border-top: 1px solid #ddd;\n}\n\n.calendar-cancel a {\n    padding: 2px;\n    color: #999;\n}\n\nul.timelist, .timelist li {\n    list-style-type: none;\n    margin: 0;\n    padding: 0;\n}\n\n.timelist a {\n    padding: 2px;\n}\n\n/* INLINE ORDERER */\n\nul.orderer {\n    position: relative;\n    padding: 0 !important;\n    margin: 0 !important;\n    list-style-type: none;\n}\n\nul.orderer li {\n    list-style-type: none;\n    display: block;\n    padding: 0;\n    margin: 0;\n    border: 1px solid #bbb;\n    border-width: 0 1px 1px 0;\n    white-space: nowrap;\n    overflow: hidden;\n    background: #e2e2e2 url(../img/admin/nav-bg-grabber.gif) repeat-y;\n}\n\nul.orderer li:hover {\n    cursor: move;\n    background-color: #ddd;\n}\n\nul.orderer li a.selector {\n    margin-left: 12px;\n    overflow: hidden;\n    width: 83%;\n    font-size: 10px !important;\n    padding: 0.6em 0;\n}\n\nul.orderer li a:link, ul.orderer li a:visited {\n    color: #333;\n}\n\nul.orderer li .inline-deletelink {\n    position: absolute;\n    right: 4px;\n    margin-top: 0.6em;\n}\n\nul.orderer li.selected {\n    background-color: #f8f8f8;\n    border-right-color: #f8f8f8;\n}\n\nul.orderer li.deleted {\n    background: #bbb url(../img/admin/deleted-overlay.gif);\n}\n\nul.orderer li.deleted a:link, ul.orderer li.deleted a:visited {\n    color: #888;\n}\n\nul.orderer li.deleted .inline-deletelink {\n    background-image: url(../img/admin/inline-restore.png);\n}\n\nul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover {\n    cursor: default;\n}\n\n/* EDIT INLINE */\n\n.inline-deletelink {\n    float: right;\n    text-indent: -9999px;\n    background: transparent url(../img/admin/inline-delete.png) no-repeat;\n    width: 15px;\n    height: 15px;\n    border: 0px none;\n    outline: 0; /* Remove dotted border around link */\n}\n\n.inline-deletelink:hover {\n    background-position: -15px 0;\n    cursor: pointer;\n}\n\n.editinline button.addlink {\n    border: 0px none;\n    color: #5b80b2;\n    font-size: 100%;\n    cursor: pointer;\n}\n\n.editinline button.addlink:hover {\n    color: #036;\n    cursor: pointer;\n}\n\n.editinline table .help {\n    text-align: right;\n    float: right;\n    padding-left: 2em;\n}\n\n.editinline tfoot .addlink {\n    white-space: nowrap;\n}\n\n.editinline table thead th:last-child {\n    border-left: none;\n}\n\n.editinline tr.deleted {\n    background: #ddd url(../img/admin/deleted-overlay.gif);\n}\n\n.editinline tr.deleted .inline-deletelink {\n    background-image: url(../img/admin/inline-restore.png);\n}\n\n.editinline tr.deleted td:hover {\n    cursor: default;\n}\n\n.editinline tr.deleted td:first-child {\n    background-image: none !important;\n}\n\n/* EDIT INLINE - STACKED */\n\n.editinline-stacked {\n    min-width: 758px;\n}\n\n.editinline-stacked .inline-object {\n    margin-left: 210px;\n    background: white;\n}\n\n.editinline-stacked .inline-source {\n    float: left;\n    width: 200px;\n    background: #f8f8f8;\n}\n\n.editinline-stacked .inline-splitter {\n    float: left;\n    width: 9px;\n    background: #f8f8f8 url(../img/admin/inline-splitter-bg.gif) 50% 50% no-repeat;\n    border-right: 1px solid #ccc;\n}\n\n.editinline-stacked .controls {\n    clear: both;\n    background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x;\n    padding: 3px 4px;\n    font-size: 11px;\n    border-top: 1px solid #ddd;\n}\n\n"
  },
  {
    "path": "selfblog/static/admin/jquery/i18n/ui.datepicker-de.js",
    "content": "﻿/* German initialisation for the jQuery UI date picker plugin. */\n/* Written by Milian Wolff (mail@milianw.de). */\n(function($){\n\t$.datepicker.regional['de'] = {\n\t\tcloseText: 'schließen',\n\t\tprevText: '&#x3c;zurück',\n\t\tnextText: 'Vor&#x3e;',\n\t\tcurrentText: 'heute',\n\t\tmonthNames: ['Januar','Februar','März','April','Mai','Juni',\n\t\t'Juli','August','September','Oktober','November','Dezember'],\n\t\tmonthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',\n\t\t'Jul','Aug','Sep','Okt','Nov','Dez'],\n\t\tdayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],\n\t\tdayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n\t\tdayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],\n\t\tdateFormat: 'yy-mm-dd', firstDay: 1,\n\t\tisRTL: false};\n\t$.datepicker.setDefaults($.datepicker.regional['de']);\n})(django.jQuery);\n\n"
  },
  {
    "path": "selfblog/static/admin/jquery/i18n/ui.datepicker-fr.js",
    "content": "﻿/* French initialisation for the jQuery UI date picker plugin. */\n/* Written by Keith Wood (kbwood@virginbroadband.com.au) and Stéphane Nahmani (sholby@sholby.net). */\n(function($){\n\t$.datepicker.regional['fr'] = {\n\t\tcloseText: 'Fermer',\n\t\tprevText: '&#x3c;Préc',\n\t\tnextText: 'Suiv&#x3e;',\n\t\tcurrentText: 'Courant',\n\t\tmonthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',\n\t\t'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],\n\t\tmonthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',\n\t\t'Jul','Aoû','Sep','Oct','Nov','Déc'],\n\t\tdayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],\n\t\tdayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],\n\t\tdayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],\n\t\tdateFormat: 'yy-mm-dd', firstDay: 1,\n\t\tisRTL: false};\n\t$.datepicker.setDefaults($.datepicker.regional['fr']);\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/jquery/jquery.form.js",
    "content": "/*!\n * jQuery Form Plugin\n * version: 2.81 (04-JUN-2011)\n * @requires jQuery v1.3.2 or later\n *\n * Examples and documentation at: http://malsup.com/jquery/form/\n * Dual licensed under the MIT and GPL licenses:\n *   http://www.opensource.org/licenses/mit-license.php\n *   http://www.gnu.org/licenses/gpl.html\n */\n;(function($) {\n\n/*\n\tUsage Note:\n\t-----------\n\tDo not use both ajaxSubmit and ajaxForm on the same form.  These\n\tfunctions are intended to be exclusive.  Use ajaxSubmit if you want\n\tto bind your own submit handler to the form.  For example,\n\n\t$(document).ready(function() {\n\t\t$('#myForm').bind('submit', function(e) {\n\t\t\te.preventDefault(); // <-- important\n\t\t\t$(this).ajaxSubmit({\n\t\t\t\ttarget: '#output'\n\t\t\t});\n\t\t});\n\t});\n\n\tUse ajaxForm when you want the plugin to manage all the event binding\n\tfor you.  For example,\n\n\t$(document).ready(function() {\n\t\t$('#myForm').ajaxForm({\n\t\t\ttarget: '#output'\n\t\t});\n\t});\n\n\tWhen using ajaxForm, the ajaxSubmit function will be invoked for you\n\tat the appropriate time.\n*/\n\n/**\n * ajaxSubmit() provides a mechanism for immediately submitting\n * an HTML form using AJAX.\n */\n$.fn.ajaxSubmit = function(options) {\n\t// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\n\tif (!this.length) {\n\t\tlog('ajaxSubmit: skipping submit process - no element selected');\n\t\treturn this;\n\t}\n\n\tif (typeof options == 'function') {\n\t\toptions = { success: options };\n\t}\n\n\tvar action = this.attr('action');\n\tvar url = (typeof action === 'string') ? $.trim(action) : '';\n\turl = url || window.location.href || '';\n\tif (url) {\n\t\t// clean url (don't include hash vaue)\n\t\turl = (url.match(/^([^#]+)/)||[])[1];\n\t}\n\n\toptions = $.extend(true, {\n\t\turl:  url,\n\t\tsuccess: $.ajaxSettings.success,\n\t\ttype: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57)\n\t\tiframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'\n\t}, options);\n\n\t// hook for manipulating the form data before it is extracted;\n\t// convenient for use with rich editors like tinyMCE or FCKEditor\n\tvar veto = {};\n\tthis.trigger('form-pre-serialize', [this, options, veto]);\n\tif (veto.veto) {\n\t\tlog('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\n\t\treturn this;\n\t}\n\n\t// provide opportunity to alter form data before it is serialized\n\tif (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\n\t\tlog('ajaxSubmit: submit aborted via beforeSerialize callback');\n\t\treturn this;\n\t}\n\n\tvar n,v,a = this.formToArray(options.semantic);\n\tif (options.data) {\n\t\toptions.extraData = options.data;\n\t\tfor (n in options.data) {\n\t\t\tif(options.data[n] instanceof Array) {\n\t\t\t\tfor (var k in options.data[n]) {\n\t\t\t\t\ta.push( { name: n, value: options.data[n][k] } );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tv = options.data[n];\n\t\t\t\tv = $.isFunction(v) ? v() : v; // if value is fn, invoke it\n\t\t\t\ta.push( { name: n, value: v } );\n\t\t\t}\n\t\t}\n\t}\n\n\t// give pre-submit callback an opportunity to abort the submit\n\tif (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\n\t\tlog('ajaxSubmit: submit aborted via beforeSubmit callback');\n\t\treturn this;\n\t}\n\n\t// fire vetoable 'validate' event\n\tthis.trigger('form-submit-validate', [a, this, options, veto]);\n\tif (veto.veto) {\n\t\tlog('ajaxSubmit: submit vetoed via form-submit-validate trigger');\n\t\treturn this;\n\t}\n\n\tvar q = $.param(a);\n\n\tif (options.type.toUpperCase() == 'GET') {\n\t\toptions.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\n\t\toptions.data = null;  // data is null for 'get'\n\t}\n\telse {\n\t\toptions.data = q; // data is the query string for 'post'\n\t}\n\n\tvar $form = this, callbacks = [];\n\tif (options.resetForm) {\n\t\tcallbacks.push(function() { $form.resetForm(); });\n\t}\n\tif (options.clearForm) {\n\t\tcallbacks.push(function() { $form.clearForm(); });\n\t}\n\n\t// perform a load on the target only if dataType is not provided\n\tif (!options.dataType && options.target) {\n\t\tvar oldSuccess = options.success || function(){};\n\t\tcallbacks.push(function(data) {\n\t\t\tvar fn = options.replaceTarget ? 'replaceWith' : 'html';\n\t\t\t$(options.target)[fn](data).each(oldSuccess, arguments);\n\t\t});\n\t}\n\telse if (options.success) {\n\t\tcallbacks.push(options.success);\n\t}\n\n\toptions.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg\n\t\tvar context = options.context || options;   // jQuery 1.4+ supports scope context \n\t\tfor (var i=0, max=callbacks.length; i < max; i++) {\n\t\t\tcallbacks[i].apply(context, [data, status, xhr || $form, $form]);\n\t\t}\n\t};\n\n\t// are there files to upload?\n\tvar fileInputs = $('input:file', this).length > 0;\n\tvar mp = 'multipart/form-data';\n\tvar multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);\n\n\t// options.iframe allows user to force iframe mode\n\t// 06-NOV-09: now defaulting to iframe mode if file input is detected\n   if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {\n\t   // hack to fix Safari hang (thanks to Tim Molendijk for this)\n\t   // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\n\t   if (options.closeKeepAlive) {\n\t\t   $.get(options.closeKeepAlive, function() { fileUpload(a); });\n\t\t}\n\t   else {\n\t\t   fileUpload(a);\n\t\t}\n   }\n   else {\n\t\t$.ajax(options);\n   }\n\n\t// fire 'notify' event\n\tthis.trigger('form-submit-notify', [this, options]);\n\treturn this;\n\n\n\t// private function for handling file uploads (hat tip to YAHOO!)\n\tfunction fileUpload(a) {\n\t\tvar form = $form[0], i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;\n\n        if (a) {\n        \t// ensure that every serialized input is still enabled\n          \tfor (i=0; i < a.length; i++) {\n            \t$(form[a[i].name]).attr('disabled', false);\n          \t}\n        }\n\n\t\tif ($(':input[name=submit],:input[id=submit]', form).length) {\n\t\t\t// if there is an input with a name or id of 'submit' then we won't be\n\t\t\t// able to invoke the submit fn on the form (at least not x-browser)\n\t\t\talert('Error: Form elements must not have name or id of \"submit\".');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\ts = $.extend(true, {}, $.ajaxSettings, options);\n\t\ts.context = s.context || s;\n\t\tid = 'jqFormIO' + (new Date().getTime());\n\t\tif (s.iframeTarget) {\n\t\t\t$io = $(s.iframeTarget);\n\t\t\tn = $io.attr('name');\n\t\t\tif (n == null)\n\t\t\t \t$io.attr('name', id);\n\t\t\telse\n\t\t\t\tid = n;\n\t\t}\n\t\telse {\n\t\t\t$io = $('<iframe name=\"' + id + '\" src=\"'+ s.iframeSrc +'\" />');\n\t\t\t$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });\n\t\t}\n\t\tio = $io[0];\n\n\n\t\txhr = { // mock object\n\t\t\taborted: 0,\n\t\t\tresponseText: null,\n\t\t\tresponseXML: null,\n\t\t\tstatus: 0,\n\t\t\tstatusText: 'n/a',\n\t\t\tgetAllResponseHeaders: function() {},\n\t\t\tgetResponseHeader: function() {},\n\t\t\tsetRequestHeader: function() {},\n\t\t\tabort: function(status) {\n\t\t\t\tvar e = (status === 'timeout' ? 'timeout' : 'aborted');\n\t\t\t\tlog('aborting upload... ' + e);\n\t\t\t\tthis.aborted = 1;\n\t\t\t\t$io.attr('src', s.iframeSrc); // abort op in progress\n\t\t\t\txhr.error = e;\n\t\t\t\ts.error && s.error.call(s.context, xhr, e, status);\n\t\t\t\tg && $.event.trigger(\"ajaxError\", [xhr, s, e]);\n\t\t\t\ts.complete && s.complete.call(s.context, xhr, e);\n\t\t\t}\n\t\t};\n\n\t\tg = s.global;\n\t\t// trigger ajax global events so that activity/block indicators work like normal\n\t\tif (g && ! $.active++) {\n\t\t\t$.event.trigger(\"ajaxStart\");\n\t\t}\n\t\tif (g) {\n\t\t\t$.event.trigger(\"ajaxSend\", [xhr, s]);\n\t\t}\n\n\t\tif (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {\n\t\t\tif (s.global) {\n\t\t\t\t$.active--;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (xhr.aborted) {\n\t\t\treturn;\n\t\t}\n\n\t\t// add submitting element to data if we know it\n\t\tsub = form.clk;\n\t\tif (sub) {\n\t\t\tn = sub.name;\n\t\t\tif (n && !sub.disabled) {\n\t\t\t\ts.extraData = s.extraData || {};\n\t\t\t\ts.extraData[n] = sub.value;\n\t\t\t\tif (sub.type == \"image\") {\n\t\t\t\t\ts.extraData[n+'.x'] = form.clk_x;\n\t\t\t\t\ts.extraData[n+'.y'] = form.clk_y;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar CLIENT_TIMEOUT_ABORT = 1;\n\t\tvar SERVER_ABORT = 2;\n\n\t\tfunction getDoc(frame) {\n\t\t\tvar doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;\n\t\t\treturn doc;\n\t\t}\n\t\t\n\t\t// take a breath so that pending repaints get some cpu time before the upload starts\n\t\tfunction doSubmit() {\n\t\t\t// make sure form attrs are set\n\t\t\tvar t = $form.attr('target'), a = $form.attr('action');\n\n\t\t\t// update form attrs in IE friendly way\n\t\t\tform.setAttribute('target',id);\n\t\t\tif (form.getAttribute('method') != 'POST') {\n\t\t\t\tform.setAttribute('method', 'POST');\n\t\t\t}\n\t\t\tif (form.getAttribute('action') != s.url) {\n\t\t\t\tform.setAttribute('action', s.url);\n\t\t\t}\n\n\t\t\t// ie borks in some cases when setting encoding\n\t\t\tif (! s.skipEncodingOverride) {\n\t\t\t\t$form.attr({\n\t\t\t\t\tencoding: 'multipart/form-data',\n\t\t\t\t\tenctype:  'multipart/form-data'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// support timout\n\t\t\tif (s.timeout) {\n\t\t\t\ttimeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);\n\t\t\t}\n\t\t\t\n\t\t\t// look for server aborts\n\t\t\tfunction checkState() {\n\t\t\t\ttry {\n\t\t\t\t\tvar state = getDoc(io).readyState;\n\t\t\t\t\tlog('state = ' + state);\n\t\t\t\t\tif (state.toLowerCase() == 'uninitialized')\n\t\t\t\t\t\tsetTimeout(checkState,50);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tlog('Server abort: ' , e, ' (', e.name, ')');\n\t\t\t\t\tcb(SERVER_ABORT);\n\t\t\t\t\ttimeoutHandle && clearTimeout(timeoutHandle);\n\t\t\t\t\ttimeoutHandle = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add \"extra\" data to form if provided in options\n\t\t\tvar extraInputs = [];\n\t\t\ttry {\n\t\t\t\tif (s.extraData) {\n\t\t\t\t\tfor (var n in s.extraData) {\n\t\t\t\t\t\textraInputs.push(\n\t\t\t\t\t\t\t$('<input type=\"hidden\" name=\"'+n+'\" />').attr('value',s.extraData[n])\n\t\t\t\t\t\t\t\t.appendTo(form)[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!s.iframeTarget) {\n\t\t\t\t\t// add iframe to doc and submit the form\n\t\t\t\t\t$io.appendTo('body');\n\t                io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);\n\t\t\t\t}\n\t\t\t\tsetTimeout(checkState,15);\n\t\t\t\tform.submit();\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\t// reset attrs and remove \"extra\" input elements\n\t\t\t\tform.setAttribute('action',a);\n\t\t\t\tif(t) {\n\t\t\t\t\tform.setAttribute('target', t);\n\t\t\t\t} else {\n\t\t\t\t\t$form.removeAttr('target');\n\t\t\t\t}\n\t\t\t\t$(extraInputs).remove();\n\t\t\t}\n\t\t}\n\n\t\tif (s.forceSync) {\n\t\t\tdoSubmit();\n\t\t}\n\t\telse {\n\t\t\tsetTimeout(doSubmit, 10); // this lets dom updates render\n\t\t}\n\n\t\tvar data, doc, domCheckCount = 50, callbackProcessed;\n\n\t\tfunction cb(e) {\n\t\t\tif (xhr.aborted || callbackProcessed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tdoc = getDoc(io);\n\t\t\t}\n\t\t\tcatch(ex) {\n\t\t\t\tlog('cannot access response document: ', ex);\n\t\t\t\te = SERVER_ABORT;\n\t\t\t}\n\t\t\tif (e === CLIENT_TIMEOUT_ABORT && xhr) {\n\t\t\t\txhr.abort('timeout');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (e == SERVER_ABORT && xhr) {\n\t\t\t\txhr.abort('server abort');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!doc || doc.location.href == s.iframeSrc) {\n\t\t\t\t// response not received yet\n\t\t\t\tif (!timedOut)\n\t\t\t\t\treturn;\n\t\t\t}\n            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);\n\n\t\t\tvar status = 'success', errMsg;\n\t\t\ttry {\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tthrow 'timeout';\n\t\t\t\t}\n\n\t\t\t\tvar isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);\n\t\t\t\tlog('isXml='+isXml);\n\t\t\t\tif (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {\n\t\t\t\t\tif (--domCheckCount) {\n\t\t\t\t\t\t// in some browsers (Opera) the iframe DOM is not always traversable when\n\t\t\t\t\t\t// the onload callback fires, so we loop a bit to accommodate\n\t\t\t\t\t\tlog('requeing onLoad callback, DOM not available');\n\t\t\t\t\t\tsetTimeout(cb, 250);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// let this fall through because server response could be an empty document\n\t\t\t\t\t//log('Could not access iframe DOM after mutiple tries.');\n\t\t\t\t\t//throw 'DOMException: not available';\n\t\t\t\t}\n\n\t\t\t\t//log('response detected');\n                var docRoot = doc.body ? doc.body : doc.documentElement;\n                xhr.responseText = docRoot ? docRoot.innerHTML : null;\n\t\t\t\txhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;\n\t\t\t\tif (isXml)\n\t\t\t\t\ts.dataType = 'xml';\n\t\t\t\txhr.getResponseHeader = function(header){\n\t\t\t\t\tvar headers = {'content-type': s.dataType};\n\t\t\t\t\treturn headers[header];\n\t\t\t\t};\n                // support for XHR 'status' & 'statusText' emulation :\n                if (docRoot) {\n                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;\n                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;\n                }\n\n\t\t\t\tvar dt = s.dataType || '';\n\t\t\t\tvar scr = /(json|script|text)/.test(dt.toLowerCase());\n\t\t\t\tif (scr || s.textarea) {\n\t\t\t\t\t// see if user embedded response in textarea\n\t\t\t\t\tvar ta = doc.getElementsByTagName('textarea')[0];\n\t\t\t\t\tif (ta) {\n\t\t\t\t\t\txhr.responseText = ta.value;\n                        // support for XHR 'status' & 'statusText' emulation :\n                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;\n                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;\n\t\t\t\t\t}\n\t\t\t\t\telse if (scr) {\n\t\t\t\t\t\t// account for browsers injecting pre around json response\n\t\t\t\t\t\tvar pre = doc.getElementsByTagName('pre')[0];\n\t\t\t\t\t\tvar b = doc.getElementsByTagName('body')[0];\n\t\t\t\t\t\tif (pre) {\n\t\t\t\t\t\t\txhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (b) {\n\t\t\t\t\t\t\txhr.responseText = b.innerHTML;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {\n\t\t\t\t\txhr.responseXML = toXml(xhr.responseText);\n\t\t\t\t}\n\n                try {\n                    data = httpData(xhr, s.dataType, s);\n                }\n                catch (e) {\n                    status = 'parsererror';\n                    xhr.error = errMsg = (e || status);\n                }\n\t\t\t}\n\t\t\tcatch (e) {\n\t\t\t\tlog('error caught: ',e);\n\t\t\t\tstatus = 'error';\n                xhr.error = errMsg = (e || status);\n\t\t\t}\n\n\t\t\tif (xhr.aborted) {\n\t\t\t\tlog('upload aborted');\n\t\t\t\tstatus = null;\n\t\t\t}\n\n            if (xhr.status) { // we've set xhr.status\n                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';\n            }\n\n\t\t\t// ordering of these callbacks/triggers is odd, but that's how $.ajax does it\n\t\t\tif (status === 'success') {\n\t\t\t\ts.success && s.success.call(s.context, data, 'success', xhr);\n\t\t\t\tg && $.event.trigger(\"ajaxSuccess\", [xhr, s]);\n\t\t\t}\n            else if (status) {\n\t\t\t\tif (errMsg == undefined)\n\t\t\t\t\terrMsg = xhr.statusText;\n\t\t\t\ts.error && s.error.call(s.context, xhr, status, errMsg);\n\t\t\t\tg && $.event.trigger(\"ajaxError\", [xhr, s, errMsg]);\n            }\n\n\t\t\tg && $.event.trigger(\"ajaxComplete\", [xhr, s]);\n\n\t\t\tif (g && ! --$.active) {\n\t\t\t\t$.event.trigger(\"ajaxStop\");\n\t\t\t}\n\n\t\t\ts.complete && s.complete.call(s.context, xhr, status);\n\n\t\t\tcallbackProcessed = true;\n\t\t\tif (s.timeout)\n\t\t\t\tclearTimeout(timeoutHandle);\n\n\t\t\t// clean up\n\t\t\tsetTimeout(function() {\n\t\t\t\tif (!s.iframeTarget)\n\t\t\t\t\t$io.remove();\n\t\t\t\txhr.responseXML = null;\n\t\t\t}, 100);\n\t\t}\n\n\t\tvar toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)\n\t\t\tif (window.ActiveXObject) {\n\t\t\t\tdoc = new ActiveXObject('Microsoft.XMLDOM');\n\t\t\t\tdoc.async = 'false';\n\t\t\t\tdoc.loadXML(s);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdoc = (new DOMParser()).parseFromString(s, 'text/xml');\n\t\t\t}\n\t\t\treturn (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;\n\t\t};\n\t\tvar parseJSON = $.parseJSON || function(s) {\n\t\t\treturn window['eval']('(' + s + ')');\n\t\t};\n\n\t\tvar httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4\n\n\t\t\tvar ct = xhr.getResponseHeader('content-type') || '',\n\t\t\t\txml = type === 'xml' || !type && ct.indexOf('xml') >= 0,\n\t\t\t\tdata = xml ? xhr.responseXML : xhr.responseText;\n\n\t\t\tif (xml && data.documentElement.nodeName === 'parsererror') {\n\t\t\t\t$.error && $.error('parsererror');\n\t\t\t}\n\t\t\tif (s && s.dataFilter) {\n\t\t\t\tdata = s.dataFilter(data, type);\n\t\t\t}\n\t\t\tif (typeof data === 'string') {\n\t\t\t\tif (type === 'json' || !type && ct.indexOf('json') >= 0) {\n\t\t\t\t\tdata = parseJSON(data);\n\t\t\t\t} else if (type === \"script\" || !type && ct.indexOf(\"javascript\") >= 0) {\n\t\t\t\t\t$.globalEval(data);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn data;\n\t\t};\n\t}\n};\n\n/**\n * ajaxForm() provides a mechanism for fully automating form submission.\n *\n * The advantages of using this method instead of ajaxSubmit() are:\n *\n * 1: This method will include coordinates for <input type=\"image\" /> elements (if the element\n *\tis used to submit the form).\n * 2. This method will include the submit element's name/value data (for the element that was\n *\tused to submit the form).\n * 3. This method binds the submit() method to the form for you.\n *\n * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely\n * passes the options argument along after properly binding events for submit elements and\n * the form itself.\n */\n$.fn.ajaxForm = function(options) {\n\t// in jQuery 1.3+ we can fix mistakes with the ready state\n\tif (this.length === 0) {\n\t\tvar o = { s: this.selector, c: this.context };\n\t\tif (!$.isReady && o.s) {\n\t\t\tlog('DOM not ready, queuing ajaxForm');\n\t\t\t$(function() {\n\t\t\t\t$(o.s,o.c).ajaxForm(options);\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\t\t// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()\n\t\tlog('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));\n\t\treturn this;\n\t}\n\n\treturn this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {\n\t\tif (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed\n\t\t\te.preventDefault();\n\t\t\t$(this).ajaxSubmit(options);\n\t\t}\n\t}).bind('click.form-plugin', function(e) {\n\t\tvar target = e.target;\n\t\tvar $el = $(target);\n\t\tif (!($el.is(\":submit,input:image\"))) {\n\t\t\t// is this a child element of the submit el?  (ex: a span within a button)\n\t\t\tvar t = $el.closest(':submit');\n\t\t\tif (t.length == 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttarget = t[0];\n\t\t}\n\t\tvar form = this;\n\t\tform.clk = target;\n\t\tif (target.type == 'image') {\n\t\t\tif (e.offsetX != undefined) {\n\t\t\t\tform.clk_x = e.offsetX;\n\t\t\t\tform.clk_y = e.offsetY;\n\t\t\t} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin\n\t\t\t\tvar offset = $el.offset();\n\t\t\t\tform.clk_x = e.pageX - offset.left;\n\t\t\t\tform.clk_y = e.pageY - offset.top;\n\t\t\t} else {\n\t\t\t\tform.clk_x = e.pageX - target.offsetLeft;\n\t\t\t\tform.clk_y = e.pageY - target.offsetTop;\n\t\t\t}\n\t\t}\n\t\t// clear form vars\n\t\tsetTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);\n\t});\n};\n\n// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm\n$.fn.ajaxFormUnbind = function() {\n\treturn this.unbind('submit.form-plugin click.form-plugin');\n};\n\n/**\n * formToArray() gathers form element data into an array of objects that can\n * be passed to any of the following ajax functions: $.get, $.post, or load.\n * Each object in the array has both a 'name' and 'value' property.  An example of\n * an array for a simple login form might be:\n *\n * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\n *\n * It is this array that is passed to pre-submit callback functions provided to the\n * ajaxSubmit() and ajaxForm() methods.\n */\n$.fn.formToArray = function(semantic) {\n\tvar a = [];\n\tif (this.length === 0) {\n\t\treturn a;\n\t}\n\n\tvar form = this[0];\n\tvar els = semantic ? form.getElementsByTagName('*') : form.elements;\n\tif (!els) {\n\t\treturn a;\n\t}\n\n\tvar i,j,n,v,el,max,jmax;\n\tfor(i=0, max=els.length; i < max; i++) {\n\t\tel = els[i];\n\t\tn = el.name;\n\t\tif (!n) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (semantic && form.clk && el.type == \"image\") {\n\t\t\t// handle image inputs on the fly when semantic == true\n\t\t\tif(!el.disabled && form.clk == el) {\n\t\t\t\ta.push({name: n, value: $(el).val()});\n\t\t\t\ta.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tv = $.fieldValue(el, true);\n\t\tif (v && v.constructor == Array) {\n\t\t\tfor(j=0, jmax=v.length; j < jmax; j++) {\n\t\t\t\ta.push({name: n, value: v[j]});\n\t\t\t}\n\t\t}\n\t\telse if (v !== null && typeof v != 'undefined') {\n\t\t\ta.push({name: n, value: v});\n\t\t}\n\t}\n\n\tif (!semantic && form.clk) {\n\t\t// input type=='image' are not found in elements array! handle it here\n\t\tvar $input = $(form.clk), input = $input[0];\n\t\tn = input.name;\n\t\tif (n && !input.disabled && input.type == 'image') {\n\t\t\ta.push({name: n, value: $input.val()});\n\t\t\ta.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\n\t\t}\n\t}\n\treturn a;\n};\n\n/**\n * Serializes form data into a 'submittable' string. This method will return a string\n * in the format: name1=value1&amp;name2=value2\n */\n$.fn.formSerialize = function(semantic) {\n\t//hand off to jQuery.param for proper encoding\n\treturn $.param(this.formToArray(semantic));\n};\n\n/**\n * Serializes all field elements in the jQuery object into a query string.\n * This method will return a string in the format: name1=value1&amp;name2=value2\n */\n$.fn.fieldSerialize = function(successful) {\n\tvar a = [];\n\tthis.each(function() {\n\t\tvar n = this.name;\n\t\tif (!n) {\n\t\t\treturn;\n\t\t}\n\t\tvar v = $.fieldValue(this, successful);\n\t\tif (v && v.constructor == Array) {\n\t\t\tfor (var i=0,max=v.length; i < max; i++) {\n\t\t\t\ta.push({name: n, value: v[i]});\n\t\t\t}\n\t\t}\n\t\telse if (v !== null && typeof v != 'undefined') {\n\t\t\ta.push({name: this.name, value: v});\n\t\t}\n\t});\n\t//hand off to jQuery.param for proper encoding\n\treturn $.param(a);\n};\n\n/**\n * Returns the value(s) of the element in the matched set.  For example, consider the following form:\n *\n *  <form><fieldset>\n *\t  <input name=\"A\" type=\"text\" />\n *\t  <input name=\"A\" type=\"text\" />\n *\t  <input name=\"B\" type=\"checkbox\" value=\"B1\" />\n *\t  <input name=\"B\" type=\"checkbox\" value=\"B2\"/>\n *\t  <input name=\"C\" type=\"radio\" value=\"C1\" />\n *\t  <input name=\"C\" type=\"radio\" value=\"C2\" />\n *  </fieldset></form>\n *\n *  var v = $(':text').fieldValue();\n *  // if no values are entered into the text inputs\n *  v == ['','']\n *  // if values entered into the text inputs are 'foo' and 'bar'\n *  v == ['foo','bar']\n *\n *  var v = $(':checkbox').fieldValue();\n *  // if neither checkbox is checked\n *  v === undefined\n *  // if both checkboxes are checked\n *  v == ['B1', 'B2']\n *\n *  var v = $(':radio').fieldValue();\n *  // if neither radio is checked\n *  v === undefined\n *  // if first radio is checked\n *  v == ['C1']\n *\n * The successful argument controls whether or not the field element must be 'successful'\n * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).\n * The default value of the successful argument is true.  If this value is false the value(s)\n * for each element is returned.\n *\n * Note: This method *always* returns an array.  If no valid value can be determined the\n *\t   array will be empty, otherwise it will contain one or more values.\n */\n$.fn.fieldValue = function(successful) {\n\tfor (var val=[], i=0, max=this.length; i < max; i++) {\n\t\tvar el = this[i];\n\t\tvar v = $.fieldValue(el, successful);\n\t\tif (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {\n\t\t\tcontinue;\n\t\t}\n\t\tv.constructor == Array ? $.merge(val, v) : val.push(v);\n\t}\n\treturn val;\n};\n\n/**\n * Returns the value of the field element.\n */\n$.fieldValue = function(el, successful) {\n\tvar n = el.name, t = el.type, tag = el.tagName.toLowerCase();\n\tif (successful === undefined) {\n\t\tsuccessful = true;\n\t}\n\n\tif (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||\n\t\t(t == 'checkbox' || t == 'radio') && !el.checked ||\n\t\t(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||\n\t\ttag == 'select' && el.selectedIndex == -1)) {\n\t\t\treturn null;\n\t}\n\n\tif (tag == 'select') {\n\t\tvar index = el.selectedIndex;\n\t\tif (index < 0) {\n\t\t\treturn null;\n\t\t}\n\t\tvar a = [], ops = el.options;\n\t\tvar one = (t == 'select-one');\n\t\tvar max = (one ? index+1 : ops.length);\n\t\tfor(var i=(one ? index : 0); i < max; i++) {\n\t\t\tvar op = ops[i];\n\t\t\tif (op.selected) {\n\t\t\t\tvar v = op.value;\n\t\t\t\tif (!v) { // extra pain for IE...\n\t\t\t\t\tv = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;\n\t\t\t\t}\n\t\t\t\tif (one) {\n\t\t\t\t\treturn v;\n\t\t\t\t}\n\t\t\t\ta.push(v);\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t}\n\treturn $(el).val();\n};\n\n/**\n * Clears the form data.  Takes the following actions on the form's input fields:\n *  - input text fields will have their 'value' property set to the empty string\n *  - select elements will have their 'selectedIndex' property set to -1\n *  - checkbox and radio inputs will have their 'checked' property set to false\n *  - inputs of type submit, button, reset, and hidden will *not* be effected\n *  - button elements will *not* be effected\n */\n$.fn.clearForm = function() {\n\treturn this.each(function() {\n\t\t$('input,select,textarea', this).clearFields();\n\t});\n};\n\n/**\n * Clears the selected form elements.\n */\n$.fn.clearFields = $.fn.clearInputs = function() {\n\treturn this.each(function() {\n\t\tvar t = this.type, tag = this.tagName.toLowerCase();\n\t\tif (t == 'text' || t == 'password' || tag == 'textarea') {\n\t\t\tthis.value = '';\n\t\t}\n\t\telse if (t == 'checkbox' || t == 'radio') {\n\t\t\tthis.checked = false;\n\t\t}\n\t\telse if (tag == 'select') {\n\t\t\tthis.selectedIndex = -1;\n\t\t}\n\t});\n};\n\n/**\n * Resets the form data.  Causes all form elements to be reset to their original value.\n */\n$.fn.resetForm = function() {\n\treturn this.each(function() {\n\t\t// guard against an input with the name of 'reset'\n\t\t// note that IE reports the reset function as an 'object'\n\t\tif (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {\n\t\t\tthis.reset();\n\t\t}\n\t});\n};\n\n/**\n * Enables or disables any matching elements.\n */\n$.fn.enable = function(b) {\n\tif (b === undefined) {\n\t\tb = true;\n\t}\n\treturn this.each(function() {\n\t\tthis.disabled = !b;\n\t});\n};\n\n/**\n * Checks/unchecks any matching checkboxes or radio buttons and\n * selects/deselects and matching option elements.\n */\n$.fn.selected = function(select) {\n\tif (select === undefined) {\n\t\tselect = true;\n\t}\n\treturn this.each(function() {\n\t\tvar t = this.type;\n\t\tif (t == 'checkbox' || t == 'radio') {\n\t\t\tthis.checked = select;\n\t\t}\n\t\telse if (this.tagName.toLowerCase() == 'option') {\n\t\t\tvar $sel = $(this).parent('select');\n\t\t\tif (select && $sel[0] && $sel[0].type == 'select-one') {\n\t\t\t\t// deselect all other options\n\t\t\t\t$sel.find('option').selected(false);\n\t\t\t}\n\t\t\tthis.selected = select;\n\t\t}\n\t});\n};\n\n// helper fn for console logging\nfunction log() {\n\tvar msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');\n\tif (window.console && window.console.log) {\n\t\twindow.console.log(msg);\n\t}\n\telse if (window.opera && window.opera.postError) {\n\t\twindow.opera.postError(msg);\n\t}\n};\n\n})(jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/jquery/ui/css/custom-theme/jquery-ui-1.8.15.custom.css",
    "content": "/*\n * jQuery UI CSS Framework 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Theming/API\n */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden { display: none; }\n.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }\n.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }\n.ui-helper-clearfix:after { content: \".\"; display: block; height: 0; clear: both; visibility: hidden; }\n.ui-helper-clearfix { display: inline-block; }\n/* required comment for clearfix to work in Opera \\*/\n* html .ui-helper-clearfix { height:1%; }\n.ui-helper-clearfix { display:block; }\n/* end clearfix */\n.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled { cursor: default !important; }\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }\n\n\n/*\n * jQuery UI CSS Framework 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Theming/API\n *\n * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px\n */\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }\n.ui-widget .ui-widget { font-size: 1em; }\n.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }\n.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee; color: #333333; }\n.ui-widget-content a { color: #333333; }\n.ui-widget-header { border: 1px solid #e78f08; background: #f6a828; color: #ffffff; font-weight: bold; }\n.ui-widget-header a { color: #ffffff; }\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6; font-weight: bold; color: #1c94c4; }\n.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }\n.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce; font-weight: bold; color: #c77405; }\n.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }\n.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff; font-weight: bold; color: #eb8f00; }\n.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }\n.ui-widget :active { outline: none; }\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c; color: #363636; }\n.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }\n.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900; color: #ffffff; }\n.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }\n.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }\n.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }\n.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }\n.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { width: 16px; height: 16px; }\n\n/* positioning */\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-off { background-position: -96px -144px; }\n.ui-icon-radio-on { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }\n.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }\n.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }\n.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n\n/* Overlays */\n.ui-widget-overlay { background: #666666; opacity: .50;filter:Alpha(Opacity=50); }\n.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*\n * jQuery UI Accordion 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Accordion#theming\n */\n/* IE/Win - Fix animation bug - #4615 */\n.ui-accordion { width: 100%; }\n.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }\n.ui-accordion .ui-accordion-li-fix { display: inline; }\n.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }\n.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }\n.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }\n.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }\n.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }\n.ui-accordion .ui-accordion-content-active { display: block; }\n/*\n * jQuery UI Autocomplete 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Autocomplete#theming\n */\n.ui-autocomplete { position: absolute; cursor: default; }\t\n\n/* workarounds */\n* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */\n\n/*\n * jQuery UI Menu 1.8.15\n *\n * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Menu#theming\n */\n.ui-menu {\n\tlist-style:none;\n\tpadding: 2px;\n\tmargin: 0;\n\tdisplay:block;\n\tfloat: left;\n}\n.ui-menu .ui-menu {\n\tmargin-top: -3px;\n}\n.ui-menu .ui-menu-item {\n\tmargin:0;\n\tpadding: 0;\n\tzoom: 1;\n\tfloat: left;\n\tclear: left;\n\twidth: 100%;\n}\n.ui-menu .ui-menu-item a {\n\ttext-decoration:none;\n\tdisplay:block;\n\tpadding:.2em .4em;\n\tline-height:1.5;\n\tzoom:1;\n}\n.ui-menu .ui-menu-item a.ui-state-hover,\n.ui-menu .ui-menu-item a.ui-state-active {\n\tfont-weight: normal;\n\tmargin: -1px;\n}\n/*\n * jQuery UI Dialog 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Dialog#theming\n */\n.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }\n.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }\n.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } \n.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }\n.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }\n.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }\n.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }\n.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }\n.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }\n.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }\n.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }\n.ui-draggable .ui-dialog-titlebar { cursor: move; }\n/*\n * jQuery UI Tabs 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Tabs#theming\n */\n.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as \"fixed\") */\n.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }\n.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }\n.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }\n.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }\n.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */\n.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }\n.ui-tabs .ui-tabs-hide { display: none !important; }\n/*\n * jQuery UI Datepicker 1.8.15\n *\n * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * http://docs.jquery.com/UI/Datepicker#theming\n */\n.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }\n.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }\n.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }\n.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }\n.ui-datepicker .ui-datepicker-prev { left:2px; }\n.ui-datepicker .ui-datepicker-next { right:2px; }\n.ui-datepicker .ui-datepicker-prev-hover { left:1px; }\n.ui-datepicker .ui-datepicker-next-hover { right:1px; }\n.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }\n.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }\n.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }\n.ui-datepicker select.ui-datepicker-month-year {width: 100%;}\n.ui-datepicker select.ui-datepicker-month, \n.ui-datepicker select.ui-datepicker-year { width: 49%;}\n.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }\n.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }\n.ui-datepicker td { border: 0; padding: 1px; }\n.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }\n.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }\n.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi { width:auto; }\n.ui-datepicker-multi .ui-datepicker-group { float:left; }\n.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }\n.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }\n.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }\n.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }\n.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }\n\n/* RTL support */\n.ui-datepicker-rtl { direction: rtl; }\n.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n\n/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */\n.ui-datepicker-cover {\n    display: none; /*sorry for IE5*/\n    display/**/: block; /*sorry for IE5*/\n    position: absolute; /*must have*/\n    z-index: -1; /*must have*/\n    filter: mask(); /*must have*/\n    top: -4px; /*must have*/\n    left: -4px; /*must have*/\n    width: 200px; /*must have*/\n    height: 200px; /*must have*/\n}"
  },
  {
    "path": "selfblog/static/admin/jquery/ui/css/custom-theme/jquery-ui-1.8.custom.css",
    "content": "/*\n* jQuery UI CSS Framework\n* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)\n* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.\n*/\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden { display: none; }\n.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }\n.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; /*line-height: 1.3;*/ text-decoration: none; /*font-size: 100%;*/ list-style: none; }\n.ui-helper-clearfix:after { content: \".\"; display: block; height: 0; clear: both; visibility: hidden; }\n.ui-helper-clearfix { display: inline-block; }\n/* required comment for clearfix to work in Opera \\*/\n* html .ui-helper-clearfix { height:1%; }\n.ui-helper-clearfix { display:block; }\n/* end clearfix */\n.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled { cursor: default !important; }\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }\n\n\n/*\n* jQuery UI CSS Framework\n* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)\n* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial,sans-serif&fwDefault=bold&fsDefault=11px&cornerRadius=5px&bgColorHeader=d6d6d6&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=25&borderColorHeader=bdbdbd&fcHeader=444444&iconColorHeader=444444&bgColorContent=eeeeee&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=bdbdbd&fcContent=444444&iconColorContent=444444&bgColorDefault=cee9f2&bgTextureDefault=02_glass.png&bgImgOpacityDefault=25&borderColorDefault=c7c7c7&fcDefault=444444&iconColorDefault=444444&bgColorHover=e0e0e0&bgTextureHover=02_glass.png&bgImgOpacityHover=25&borderColorHover=c7c7c7&fcHover=212121&iconColorHover=454545&bgColorActive=e0e0e0&bgTextureActive=02_glass.png&bgImgOpacityActive=25&borderColorActive=c7c7c7&fcActive=444444&iconColorActive=444444&bgColorHighlight=fffccc&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=60&borderColorHighlight=FFB11A&fcHighlight=333333&iconColorHighlight=444444&bgColorError=fef1ec&bgTextureError=05_inset_soft.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=d6d6d6&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=60&bgColorShadow=bdbdbd&bgTextureShadow=01_flat.png&bgImgOpacityShadow=60&opacityShadow=80&thicknessShadow=10px&offsetTopShadow=-10px&offsetLeftShadow=-10px&cornerRadiusShadow=10px\n*/\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget { font-family: Arial,sans-serif; font-size: 11px; }\n.ui-widget .ui-widget { font-size: 1em; }\n.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,sans-serif; font-size: 1em; }\n.ui-widget-content { border: 1px solid #bdbdbd; background: #eeeeee url(images/ui-bg_flat_75_eeeeee_40x100.png) 50% 50% repeat-x; color: #444444; }\n/*.ui-widget-content a { color: #444444; }*/\n.ui-widget-header { border: 1px solid #bdbdbd; background: #d6d6d6 url(images/ui-bg_highlight-soft_25_d6d6d6_1x100.png) 50% 50% repeat-x; color: #444444; font-weight: bold; }\n/*.ui-widget-header a { color: #444444; }*/\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #c7c7c7; background: #cee9f2 url(images/ui-bg_glass_25_cee9f2_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #444444; }\n.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #444444; text-decoration: none; }\n.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #c7c7c7; background: #e0e0e0 url(images/ui-bg_glass_25_e0e0e0_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #212121; }\n.ui-state-hover a, .ui-state-hover a:hover { /*color: #212121;*/ text-decoration: none; }\n.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #c7c7c7; background: #e0e0e0 url(images/ui-bg_glass_25_e0e0e0_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #444444; }\n.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #444444; text-decoration: none; }\n.ui-widget :active { outline: none; }\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #ffb11a; background: #fffccc url(images/ui-bg_glass_60_fffccc_1x400.png) 50% 50% repeat-x; color: #333333; }\n.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #333333; }\n.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_inset-soft_95_fef1ec_1x100.png) 50% bottom repeat-x; color: #cd0a0a; }\n.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; }\n.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; }\n.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }\n.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }\n.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-widget-content .ui-icon {background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-widget-header .ui-icon {background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-state-default .ui-icon { background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }\n.ui-state-active .ui-icon {background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_444444_256x240.png); }\n.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }\n\n/* positioning */\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-off { background-position: -96px -144px; }\n.ui-icon-radio-on { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; }\n.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }\n.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }\n.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }\n.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }\n.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }\n.ui-corner-right {  -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }\n.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }\n.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }\n\n/* Overlays */\n.ui-widget-overlay { background: #d6d6d6 url(images/ui-bg_flat_0_d6d6d6_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); }\n.ui-widget-shadow { margin: -10px 0 0 -10px; padding: 10px; background: #bdbdbd url(images/ui-bg_flat_60_bdbdbd_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; }"
  },
  {
    "path": "selfblog/static/admin/jquery/ui/css/ui-lightness/jquery-ui-1.8.custom.css",
    "content": "/*\n* jQuery UI CSS Framework\n* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)\n* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.\n*/\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden { display: none; }\n.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }\n.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }\n.ui-helper-clearfix:after { content: \".\"; display: block; height: 0; clear: both; visibility: hidden; }\n.ui-helper-clearfix { display: inline-block; }\n/* required comment for clearfix to work in Opera \\*/\n* html .ui-helper-clearfix { height:1%; }\n.ui-helper-clearfix { display:block; }\n/* end clearfix */\n.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled { cursor: default !important; }\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }\n\n\n/*\n* jQuery UI CSS Framework\n* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)\n* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.\n* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px\n*/\n\n\n/* Component containers\n----------------------------------*/\n.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }\n.ui-widget .ui-widget { font-size: 1em; }\n.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }\n.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }\n.ui-widget-content a { color: #333333; }\n.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }\n.ui-widget-header a { color: #ffffff; }\n\n/* Interaction states\n----------------------------------*/\n.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }\n.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }\n.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }\n.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }\n.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }\n.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }\n.ui-widget :active { outline: none; }\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }\n.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; }\n.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }\n.ui-state-error a, .ui-widget-content .ui-state-error a { color: #ffffff; }\n.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #ffffff; }\n.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }\n.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }\n.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }\n.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }\n.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }\n.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }\n.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }\n.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }\n\n/* positioning */\n.ui-icon-carat-1-n { background-position: 0 0; }\n.ui-icon-carat-1-ne { background-position: -16px 0; }\n.ui-icon-carat-1-e { background-position: -32px 0; }\n.ui-icon-carat-1-se { background-position: -48px 0; }\n.ui-icon-carat-1-s { background-position: -64px 0; }\n.ui-icon-carat-1-sw { background-position: -80px 0; }\n.ui-icon-carat-1-w { background-position: -96px 0; }\n.ui-icon-carat-1-nw { background-position: -112px 0; }\n.ui-icon-carat-2-n-s { background-position: -128px 0; }\n.ui-icon-carat-2-e-w { background-position: -144px 0; }\n.ui-icon-triangle-1-n { background-position: 0 -16px; }\n.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n.ui-icon-triangle-1-e { background-position: -32px -16px; }\n.ui-icon-triangle-1-se { background-position: -48px -16px; }\n.ui-icon-triangle-1-s { background-position: -64px -16px; }\n.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n.ui-icon-triangle-1-w { background-position: -96px -16px; }\n.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n.ui-icon-arrow-1-n { background-position: 0 -32px; }\n.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n.ui-icon-arrow-1-e { background-position: -32px -32px; }\n.ui-icon-arrow-1-se { background-position: -48px -32px; }\n.ui-icon-arrow-1-s { background-position: -64px -32px; }\n.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n.ui-icon-arrow-1-w { background-position: -96px -32px; }\n.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n.ui-icon-arrow-4 { background-position: 0 -80px; }\n.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n.ui-icon-extlink { background-position: -32px -80px; }\n.ui-icon-newwin { background-position: -48px -80px; }\n.ui-icon-refresh { background-position: -64px -80px; }\n.ui-icon-shuffle { background-position: -80px -80px; }\n.ui-icon-transfer-e-w { background-position: -96px -80px; }\n.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n.ui-icon-folder-collapsed { background-position: 0 -96px; }\n.ui-icon-folder-open { background-position: -16px -96px; }\n.ui-icon-document { background-position: -32px -96px; }\n.ui-icon-document-b { background-position: -48px -96px; }\n.ui-icon-note { background-position: -64px -96px; }\n.ui-icon-mail-closed { background-position: -80px -96px; }\n.ui-icon-mail-open { background-position: -96px -96px; }\n.ui-icon-suitcase { background-position: -112px -96px; }\n.ui-icon-comment { background-position: -128px -96px; }\n.ui-icon-person { background-position: -144px -96px; }\n.ui-icon-print { background-position: -160px -96px; }\n.ui-icon-trash { background-position: -176px -96px; }\n.ui-icon-locked { background-position: -192px -96px; }\n.ui-icon-unlocked { background-position: -208px -96px; }\n.ui-icon-bookmark { background-position: -224px -96px; }\n.ui-icon-tag { background-position: -240px -96px; }\n.ui-icon-home { background-position: 0 -112px; }\n.ui-icon-flag { background-position: -16px -112px; }\n.ui-icon-calendar { background-position: -32px -112px; }\n.ui-icon-cart { background-position: -48px -112px; }\n.ui-icon-pencil { background-position: -64px -112px; }\n.ui-icon-clock { background-position: -80px -112px; }\n.ui-icon-disk { background-position: -96px -112px; }\n.ui-icon-calculator { background-position: -112px -112px; }\n.ui-icon-zoomin { background-position: -128px -112px; }\n.ui-icon-zoomout { background-position: -144px -112px; }\n.ui-icon-search { background-position: -160px -112px; }\n.ui-icon-wrench { background-position: -176px -112px; }\n.ui-icon-gear { background-position: -192px -112px; }\n.ui-icon-heart { background-position: -208px -112px; }\n.ui-icon-star { background-position: -224px -112px; }\n.ui-icon-link { background-position: -240px -112px; }\n.ui-icon-cancel { background-position: 0 -128px; }\n.ui-icon-plus { background-position: -16px -128px; }\n.ui-icon-plusthick { background-position: -32px -128px; }\n.ui-icon-minus { background-position: -48px -128px; }\n.ui-icon-minusthick { background-position: -64px -128px; }\n.ui-icon-close { background-position: -80px -128px; }\n.ui-icon-closethick { background-position: -96px -128px; }\n.ui-icon-key { background-position: -112px -128px; }\n.ui-icon-lightbulb { background-position: -128px -128px; }\n.ui-icon-scissors { background-position: -144px -128px; }\n.ui-icon-clipboard { background-position: -160px -128px; }\n.ui-icon-copy { background-position: -176px -128px; }\n.ui-icon-contact { background-position: -192px -128px; }\n.ui-icon-image { background-position: -208px -128px; }\n.ui-icon-video { background-position: -224px -128px; }\n.ui-icon-script { background-position: -240px -128px; }\n.ui-icon-alert { background-position: 0 -144px; }\n.ui-icon-info { background-position: -16px -144px; }\n.ui-icon-notice { background-position: -32px -144px; }\n.ui-icon-help { background-position: -48px -144px; }\n.ui-icon-check { background-position: -64px -144px; }\n.ui-icon-bullet { background-position: -80px -144px; }\n.ui-icon-radio-off { background-position: -96px -144px; }\n.ui-icon-radio-on { background-position: -112px -144px; }\n.ui-icon-pin-w { background-position: -128px -144px; }\n.ui-icon-pin-s { background-position: -144px -144px; }\n.ui-icon-play { background-position: 0 -160px; }\n.ui-icon-pause { background-position: -16px -160px; }\n.ui-icon-seek-next { background-position: -32px -160px; }\n.ui-icon-seek-prev { background-position: -48px -160px; }\n.ui-icon-seek-end { background-position: -64px -160px; }\n.ui-icon-seek-start { background-position: -80px -160px; }\n/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n.ui-icon-seek-first { background-position: -80px -160px; }\n.ui-icon-stop { background-position: -96px -160px; }\n.ui-icon-eject { background-position: -112px -160px; }\n.ui-icon-volume-off { background-position: -128px -160px; }\n.ui-icon-volume-on { background-position: -144px -160px; }\n.ui-icon-power { background-position: 0 -176px; }\n.ui-icon-signal-diag { background-position: -16px -176px; }\n.ui-icon-signal { background-position: -32px -176px; }\n.ui-icon-battery-0 { background-position: -48px -176px; }\n.ui-icon-battery-1 { background-position: -64px -176px; }\n.ui-icon-battery-2 { background-position: -80px -176px; }\n.ui-icon-battery-3 { background-position: -96px -176px; }\n.ui-icon-circle-plus { background-position: 0 -192px; }\n.ui-icon-circle-minus { background-position: -16px -192px; }\n.ui-icon-circle-close { background-position: -32px -192px; }\n.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n.ui-icon-circle-zoomin { background-position: -176px -192px; }\n.ui-icon-circle-zoomout { background-position: -192px -192px; }\n.ui-icon-circle-check { background-position: -208px -192px; }\n.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n.ui-icon-circlesmall-close { background-position: -32px -208px; }\n.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n.ui-icon-squaresmall-close { background-position: -80px -208px; }\n.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Corner radius */\n.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }\n.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }\n.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }\n.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }\n.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }\n.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }\n\n/* Overlays */\n.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }\n.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* Resizable\n----------------------------------*/\n.ui-resizable { position: relative;}\n.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}\n.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }\n.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }\n.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }\n.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }\n.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }\n.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }\n.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }\n.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }\n.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Accordion\n----------------------------------*/\n.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }\n.ui-accordion .ui-accordion-li-fix { display: inline; }\n.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }\n.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }\n.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }\n.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }\n.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }\n.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete\n----------------------------------*/\n.ui-autocomplete { position: absolute; cursor: default; }\t\n.ui-autocomplete-loading { background: white; }\n\n/* workarounds */\n* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */\n\n/* Menu\n----------------------------------*/\n.ui-menu {\n\tlist-style:none;\n\tpadding: 2px;\n\tmargin: 0;\n\tdisplay:block;\n}\n.ui-menu .ui-menu {\n\tmargin-top: -3px;\n}\n.ui-menu .ui-menu-item {\n\tmargin:0;\n\tpadding: 0;\n\twidth: 100%;\n}\n.ui-menu .ui-menu-item a {\n\ttext-decoration:none;\n\tdisplay:block;\n\tpadding:.2em .4em;\n\tline-height:1.5;\n\tzoom:1;\n}\n.ui-menu .ui-menu-item a.ui-state-hover,\n.ui-menu .ui-menu-item a.ui-state-active {\n\tmargin: -1px;\n}\n/* Button\n----------------------------------*/\n\n.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */\n.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */\nbutton.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */\n.ui-button-icons-only { width: 3.4em; } \nbutton.ui-button-icons-only { width: 3.7em; } \n\n/*button text element */\n.ui-button .ui-button-text { display: block; line-height: 1.4;  }\n.ui-button-text-only .ui-button-text { padding: .4em 1em; }\n.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }\n.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }\n.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }\n/* no icon support for input elements, provide padding by default */\ninput.ui-button { padding: .4em 1em; }\n\n/*button icon element(s) */\n.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }\n.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }\n.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }\n.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }\n\n/*button sets*/\n.ui-buttonset { margin-right: 7px; }\n.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }\n\n/* workarounds */\nbutton.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */\n\n\n\n\n\n/* Dialog\n----------------------------------*/\n.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }\n.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }\n.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } \n.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }\n.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }\n.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }\n.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }\n.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }\n.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }\n.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }\n.ui-draggable .ui-dialog-titlebar { cursor: move; }\n/* Slider\n----------------------------------*/\n.ui-slider { position: relative; text-align: left; }\n.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }\n.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }\n\n.ui-slider-horizontal { height: .8em; }\n.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }\n.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }\n.ui-slider-horizontal .ui-slider-range-min { left: 0; }\n.ui-slider-horizontal .ui-slider-range-max { right: 0; }\n\n.ui-slider-vertical { width: .8em; height: 100px; }\n.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }\n.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }\n.ui-slider-vertical .ui-slider-range-min { bottom: 0; }\n.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Datepicker\n----------------------------------*/\n.ui-datepicker { width: 17em; padding: .2em .2em 0; }\n.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }\n.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }\n.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }\n.ui-datepicker .ui-datepicker-prev { left:2px; }\n.ui-datepicker .ui-datepicker-next { right:2px; }\n.ui-datepicker .ui-datepicker-prev-hover { left:1px; }\n.ui-datepicker .ui-datepicker-next-hover { right:1px; }\n.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }\n.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }\n.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }\n.ui-datepicker select.ui-datepicker-month-year {width: 100%;}\n.ui-datepicker select.ui-datepicker-month, \n.ui-datepicker select.ui-datepicker-year { width: 49%;}\n.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }\n.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }\n.ui-datepicker td { border: 0; padding: 1px; }\n.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }\n.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }\n.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }\n.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }\n\n/* with multiple calendars */\n.ui-datepicker.ui-datepicker-multi { width:auto; }\n.ui-datepicker-multi .ui-datepicker-group { float:left; }\n.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }\n.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }\n.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }\n.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }\n.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }\n.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }\n.ui-datepicker-row-break { clear:both; width:100%; }\n\n/* RTL support */\n.ui-datepicker-rtl { direction: rtl; }\n.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }\n.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }\n.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group { float:right; }\n.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }\n\n/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */\n.ui-datepicker-cover {\n    display: none; /*sorry for IE5*/\n    display/**/: block; /*sorry for IE5*/\n    position: absolute; /*must have*/\n    z-index: -1; /*must have*/\n    filter: mask(); /*must have*/\n    top: -4px; /*must have*/\n    left: -4px; /*must have*/\n    width: 200px; /*must have*/\n    height: 200px; /*must have*/\n}"
  },
  {
    "path": "selfblog/static/admin/js/LICENSE-JQUERY.txt",
    "content": "Copyright (c) 2010 John Resig, http://jquery.com/\n \nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n \nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n \nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "selfblog/static/admin/js/SelectBox.js",
    "content": "var SelectBox = {\n    cache: new Object(),\n    init: function(id) {\n        var box = document.getElementById(id);\n        var node;\n        SelectBox.cache[id] = new Array();\n        var cache = SelectBox.cache[id];\n        for (var i = 0; (node = box.options[i]); i++) {\n            cache.push({value: node.value, text: node.text, displayed: 1});\n        }\n    },\n    redisplay: function(id) {\n        // Repopulate HTML select box from cache\n        var box = document.getElementById(id);\n        box.options.length = 0; // clear all options\n        for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {\n            var node = SelectBox.cache[id][i];\n            if (node.displayed) {\n                box.options[box.options.length] = new Option(node.text, node.value, false, false);\n            }\n        }\n    },\n    filter: function(id, text) {\n        // Redisplay the HTML select box, displaying only the choices containing ALL\n        // the words in text. (It's an AND search.)\n        var tokens = text.toLowerCase().split(/\\s+/);\n        var node, token;\n        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {\n            node.displayed = 1;\n            for (var j = 0; (token = tokens[j]); j++) {\n                if (node.text.toLowerCase().indexOf(token) == -1) {\n                    node.displayed = 0;\n                }\n            }\n        }\n        SelectBox.redisplay(id);\n    },\n    delete_from_cache: function(id, value) {\n        var node, delete_index = null;\n        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {\n            if (node.value == value) {\n                delete_index = i;\n                break;\n            }\n        }\n        var j = SelectBox.cache[id].length - 1;\n        for (var i = delete_index; i < j; i++) {\n            SelectBox.cache[id][i] = SelectBox.cache[id][i+1];\n        }\n        SelectBox.cache[id].length--;\n    },\n    add_to_cache: function(id, option) {\n        SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});\n    },\n    cache_contains: function(id, value) {\n        // Check if an item is contained in the cache\n        var node;\n        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {\n            if (node.value == value) {\n                return true;\n            }\n        }\n        return false;\n    },\n    move: function(from, to) {\n        var from_box = document.getElementById(from);\n        var to_box = document.getElementById(to);\n        var option;\n        for (var i = 0; (option = from_box.options[i]); i++) {\n            if (option.selected && SelectBox.cache_contains(from, option.value)) {\n                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});\n                SelectBox.delete_from_cache(from, option.value);\n            }\n        }\n        SelectBox.redisplay(from);\n        SelectBox.redisplay(to);\n    },\n    move_all: function(from, to) {\n        var from_box = document.getElementById(from);\n        var to_box = document.getElementById(to);\n        var option;\n        for (var i = 0; (option = from_box.options[i]); i++) {\n            if (SelectBox.cache_contains(from, option.value)) {\n                SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1});\n                SelectBox.delete_from_cache(from, option.value);\n            }\n        }\n        SelectBox.redisplay(from);\n        SelectBox.redisplay(to);\n    },\n    sort: function(id) {\n        SelectBox.cache[id].sort( function(a, b) {\n            a = a.text.toLowerCase();\n            b = b.text.toLowerCase();\n            try {\n                if (a > b) return 1;\n                if (a < b) return -1;\n            }\n            catch (e) {\n                // silently fail on IE 'unknown' exception\n            }\n            return 0;\n        } );\n    },\n    select_all: function(id) {\n        var box = document.getElementById(id);\n        for (var i = 0; i < box.options.length; i++) {\n            box.options[i].selected = 'selected';\n        }\n    }\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/SelectFilter2.js",
    "content": "/*\nSelectFilter2 - Turns a multiple-select box into a filter interface.\n\nDifferent than SelectFilter because this is coupled to the admin framework.\n\nRequires core.js, SelectBox.js and addevent.js.\n*/\n\nfunction findForm(node) {\n    // returns the node of the form containing the given node\n    if (node.tagName.toLowerCase() != 'form') {\n        return findForm(node.parentNode);\n    }\n    return node;\n}\n\nvar SelectFilter = {\n    init: function(field_id, field_name, is_stacked, admin_media_prefix) {\n        if (field_id.match(/__prefix__/)){\n            // Don't intialize on empty forms.\n            return;\n        }\n        var from_box = document.getElementById(field_id);\n        from_box.id += '_from'; // change its ID\n        from_box.className = 'filtered';\n\n        var ps = from_box.parentNode.getElementsByTagName('p');\n        for (var i=0; i<ps.length; i++) {\n            if (ps[i].className.indexOf(\"info\") != -1) {\n                // Remove <p class=\"info\">, because it just gets in the way.\n                from_box.parentNode.removeChild(ps[i]);\n            } else if (ps[i].className.indexOf(\"help\") != -1) {\n                // Move help text up to the top so it isn't below the select\n                // boxes or wrapped off on the side to the right of the add\n                // button:\n                from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);\n            }\n        }\n\n        // <div class=\"selector\"> or <div class=\"selector stacked\">\n        var selector_div = quickElement('div', from_box.parentNode);\n        selector_div.className = is_stacked ? 'selector stacked' : 'selector';\n\n        // <div class=\"selector-available\">\n        var selector_available = quickElement('div', selector_div, '');\n        selector_available.className = 'selector-available';\n        quickElement('h2', selector_available, interpolate(gettext('Available %s'), [field_name]));\n        var filter_p = quickElement('p', selector_available, '');\n        filter_p.className = 'selector-filter';\n\n        var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + \"_input\", 'style', 'width:16px;padding:2px');\n\n        var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif');\n        search_selector_img.alt = gettext(\"Filter\");\n\n        filter_p.appendChild(document.createTextNode(' '));\n\n        var filter_input = quickElement('input', filter_p, '', 'type', 'text');\n        filter_input.id = field_id + '_input';\n        selector_available.appendChild(from_box);\n        var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'href', 'javascript: (function(){ SelectBox.move_all(\"' + field_id + '_from\", \"' + field_id + '_to\"); })()');\n        choose_all.className = 'selector-chooseall';\n\n        // <ul class=\"selector-chooser\">\n        var selector_chooser = quickElement('ul', selector_div, '');\n        selector_chooser.className = 'selector-chooser';\n        var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Add'), 'href', 'javascript: (function(){ SelectBox.move(\"' + field_id + '_from\",\"' + field_id + '_to\");})()');\n        add_link.className = 'selector-add';\n        var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move(\"' + field_id + '_to\",\"' + field_id + '_from\");})()');\n        remove_link.className = 'selector-remove';\n\n        // <div class=\"selector-chosen\">\n        var selector_chosen = quickElement('div', selector_div, '');\n        selector_chosen.className = 'selector-chosen';\n        quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name]));\n        var selector_filter = quickElement('p', selector_chosen, gettext('Select your choice(s) and click '));\n        selector_filter.className = 'selector-filter';\n        quickElement('img', selector_filter, '', 'src', admin_media_prefix + (is_stacked ? 'img/admin/selector_stacked-add.gif':'img/admin/selector-add.gif'), 'alt', 'Add');\n        var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));\n        to_box.className = 'filtered';\n        var clear_all = quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { SelectBox.move_all(\"' + field_id + '_to\", \"' + field_id + '_from\");})()');\n        clear_all.className = 'selector-clearall';\n\n        from_box.setAttribute('name', from_box.getAttribute('name') + '_old');\n\n        // Set up the JavaScript event handlers for the select box filter interface\n        addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });\n        addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });\n        addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });\n        addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });\n        addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });\n        SelectBox.init(field_id + '_from');\n        SelectBox.init(field_id + '_to');\n        // Move selected from_box options to to_box\n        SelectBox.move(field_id + '_from', field_id + '_to');\n    },\n    filter_key_up: function(event, field_id) {\n        from = document.getElementById(field_id + '_from');\n        // don't submit form if user pressed Enter\n        if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {\n            from.selectedIndex = 0;\n            SelectBox.move(field_id + '_from', field_id + '_to');\n            from.selectedIndex = 0;\n            return false;\n        }\n        var temp = from.selectedIndex;\n        SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);\n        from.selectedIndex = temp;\n        return true;\n    },\n    filter_key_down: function(event, field_id) {\n        from = document.getElementById(field_id + '_from');\n        // right arrow -- move across\n        if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {\n            var old_index = from.selectedIndex;\n            SelectBox.move(field_id + '_from', field_id + '_to');\n            from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;\n            return false;\n        }\n        // down arrow -- wrap around\n        if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {\n            from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;\n        }\n        // up arrow -- wrap around\n        if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {\n            from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/actions.js",
    "content": "(function($) {\n\t$.fn.actions = function(opts) {\n\t\tvar options = $.extend({}, $.fn.actions.defaults, opts);\n\t\tvar actionCheckboxes = $(this);\n\t\tvar list_editable_changed = false;\n\t\tchecker = function(checked) {\n\t\t\tif (checked) {\n\t\t\t\tshowQuestion();\n\t\t\t} else {\n\t\t\t\treset();\n\t\t\t}\n\t\t\t$(actionCheckboxes).attr(\"checked\", checked)\n\t\t\t\t.parent().parent().toggleClass(options.selectedClass, checked);\n\t\t}\n\t\tupdateCounter = function() {\n\t\t\tvar sel = $(actionCheckboxes).filter(\":checked\").length;\n\t\t\t$(options.counterContainer).html(interpolate(\n\t\t\tngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {\n\t\t\t\tsel: sel,\n\t\t\t\tcnt: _actions_icnt\n\t\t\t}, true));\n\t\t\t$(options.allToggle).attr(\"checked\", function() {\n\t\t\t\tif (sel == actionCheckboxes.length) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t\tshowQuestion();\n\t\t\t\t} else {\n\t\t\t\t\tvalue = false;\n\t\t\t\t\tclearAcross();\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t});\n\t\t}\n\t\tshowQuestion = function() {\n\t\t\t$(options.acrossClears).hide();\n\t\t\t$(options.acrossQuestions).show();\n\t\t\t$(options.allContainer).hide();\n\t\t}\n\t\tshowClear = function() {\n\t\t\t$(options.acrossClears).show();\n\t\t\t$(options.acrossQuestions).hide();\n\t\t\t$(options.actionContainer).toggleClass(options.selectedClass);\n\t\t\t$(options.allContainer).show();\n\t\t\t$(options.counterContainer).hide();\n\t\t}\n\t\treset = function() {\n\t\t\t$(options.acrossClears).hide();\n\t\t\t$(options.acrossQuestions).hide();\n\t\t\t$(options.allContainer).hide();\n\t\t\t$(options.counterContainer).show();\n\t\t}\n\t\tclearAcross = function() {\n\t\t\treset();\n\t\t\t$(options.acrossInput).val(0);\n\t\t\t$(options.actionContainer).removeClass(options.selectedClass);\n\t\t}\n\t\t// Show counter by default\n\t\t$(options.counterContainer).show();\n\t\t// Check state of checkboxes and reinit state if needed\n\t\t$(this).filter(\":checked\").each(function(i) {\n\t\t\t$(this).parent().parent().toggleClass(options.selectedClass);\n\t\t\tupdateCounter();\n\t\t\tif ($(options.acrossInput).val() == 1) {\n\t\t\t\tshowClear();\n\t\t\t}\n\t\t});\n\t\t$(options.allToggle).show().click(function() {\n\t\t\tchecker($(this).attr(\"checked\"));\n\t\t\tupdateCounter();\n\t\t});\n\t\t$(\"div.actions span.question a\").click(function(event) {\n\t\t\tevent.preventDefault();\n\t\t\t$(options.acrossInput).val(1);\n\t\t\tshowClear();\n\t\t});\n\t\t$(\"div.actions span.clear a\").click(function(event) {\n\t\t\tevent.preventDefault();\n\t\t\t$(options.allToggle).attr(\"checked\", false);\n\t\t\tclearAcross();\n\t\t\tchecker(0);\n\t\t\tupdateCounter();\n\t\t});\n\t\tlastChecked = null;\n\t\t$(actionCheckboxes).click(function(event) {\n\t\t\tif (!event) { var event = window.event; }\n\t\t\tvar target = event.target ? event.target : event.srcElement;\n\t\t\tif (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey == true) {\n\t\t\t\tvar inrange = false;\n\t\t\t\t$(lastChecked).attr(\"checked\", target.checked)\n\t\t\t\t\t.parent().parent().toggleClass(options.selectedClass, target.checked);\n\t\t\t\t$(actionCheckboxes).each(function() {\n\t\t\t\t\tif ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) {\n\t\t\t\t\t\tinrange = (inrange) ? false : true;\n\t\t\t\t\t}\n\t\t\t\t\tif (inrange) {\n\t\t\t\t\t\t$(this).attr(\"checked\", target.checked)\n\t\t\t\t\t\t\t.parent().parent().toggleClass(options.selectedClass, target.checked);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t$(target).parent().parent().toggleClass(options.selectedClass, target.checked);\n\t\t\tlastChecked = target;\n\t\t\tupdateCounter();\n\t\t});\n\t\t$('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() {\n\t\t\tlist_editable_changed = true;\n\t\t});\n\t\t$('form#changelist-form button[name=\"index\"]').click(function(event) {\n\t\t\tif (list_editable_changed) {\n\t\t\t\treturn confirm(gettext(\"You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.\"));\n\t\t\t}\n\t\t});\n\t\t$('form#changelist-form input[name=\"_save\"]').click(function(event) {\n\t\t\tvar action_changed = false;\n\t\t\t$('div.actions select option:selected').each(function() {\n\t\t\t\tif ($(this).val()) {\n\t\t\t\t\taction_changed = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (action_changed) {\n\t\t\t\tif (list_editable_changed) {\n\t\t\t\t\treturn confirm(gettext(\"You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.\"));\n\t\t\t\t} else {\n\t\t\t\t\treturn confirm(gettext(\"You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.\"));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t/* Setup plugin defaults */\n\t$.fn.actions.defaults = {\n\t\tactionContainer: \"div.actions\",\n\t\tcounterContainer: \"span.action-counter\",\n\t\tallContainer: \"div.actions span.all\",\n\t\tacrossInput: \"div.actions input.select-across\",\n\t\tacrossQuestions: \"div.actions span.question\",\n\t\tacrossClears: \"div.actions span.clear\",\n\t\tallToggle: \"#action-toggle\",\n\t\tselectedClass: \"selected\"\n\t}\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/admin/DateTimeShortcuts.js",
    "content": "// Inserts shortcut buttons after all of the following:\n//     <input type=\"text\" class=\"vDateField\">\n//     <input type=\"text\" class=\"vTimeField\">\n\nvar DateTimeShortcuts = {\n    calendars: [],\n    calendarInputs: [],\n    clockInputs: [],\n    calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled\n    calendarDivName2: 'calendarin',  // name of <div> that contains calendar\n    calendarLinkName: 'calendarlink',// name of the link that is used to toggle\n    clockDivName: 'clockbox',        // name of clock <div> that gets toggled\n    clockLinkName: 'clocklink',      // name of the link that is used to toggle\n    shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts\n    admin_media_prefix: '',\n    init: function() {\n        // Get admin_media_prefix by grabbing it off the window object. It's\n        // set in the admin/base.html template, so if it's not there, someone's\n        // overridden the template. In that case, we'll set a clearly-invalid\n        // value in the hopes that someone will examine HTTP requests and see it.\n        if (window.__admin_media_prefix__ != undefined) {\n            DateTimeShortcuts.admin_media_prefix = window.__admin_media_prefix__;\n        } else {\n            DateTimeShortcuts.admin_media_prefix = '/missing-admin-media-prefix/';\n        }\n\n        var inputs = document.getElementsByTagName('input');\n        for (i=0; i<inputs.length; i++) {\n            var inp = inputs[i];\n            if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {\n                DateTimeShortcuts.addClock(inp);\n            }\n            else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {\n                DateTimeShortcuts.addCalendar(inp);\n            }\n        }\n    },\n    // Add clock widget to a given field\n    addClock: function(inp) {\n        var num = DateTimeShortcuts.clockInputs.length;\n        DateTimeShortcuts.clockInputs[num] = inp;\n\n        // Shortcut links (clock icon and \"Now\" link)\n        var shortcuts_span = document.createElement('span');\n        shortcuts_span.className = DateTimeShortcuts.shortCutsClass;\n        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);\n        var now_link = document.createElement('a');\n        now_link.setAttribute('href', \"javascript:DateTimeShortcuts.handleClockQuicklink(\" + num + \", new Date().strftime('\" + get_format('TIME_INPUT_FORMATS')[0] + \"'));\");\n        now_link.appendChild(document.createTextNode(gettext('Now')));\n        var clock_link = document.createElement('a');\n        clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');\n        clock_link.id = DateTimeShortcuts.clockLinkName + num;\n        quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));\n        shortcuts_span.appendChild(document.createTextNode('\\240'));\n        shortcuts_span.appendChild(now_link);\n        shortcuts_span.appendChild(document.createTextNode('\\240|\\240'));\n        shortcuts_span.appendChild(clock_link);\n\n        // Create clock link div\n        //\n        // Markup looks like:\n        // <div id=\"clockbox1\" class=\"clockbox module\">\n        //     <h2>Choose a time</h2>\n        //     <ul class=\"timelist\">\n        //         <li><a href=\"#\">Now</a></li>\n        //         <li><a href=\"#\">Midnight</a></li>\n        //         <li><a href=\"#\">6 a.m.</a></li>\n        //         <li><a href=\"#\">Noon</a></li>\n        //     </ul>\n        //     <p class=\"calendar-cancel\"><a href=\"#\">Cancel</a></p>\n        // </div>\n\n        var clock_box = document.createElement('div');\n        clock_box.style.display = 'none';\n        clock_box.style.position = 'absolute';\n        clock_box.className = 'clockbox module';\n        clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);\n        document.body.appendChild(clock_box);\n        addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation);\n\n        quickElement('h2', clock_box, gettext('Choose a time'));\n        time_list = quickElement('ul', clock_box, '');\n        time_list.className = 'timelist';\n        time_format = get_format('TIME_INPUT_FORMATS')[0];\n        quickElement(\"a\", quickElement(\"li\", time_list, \"\"), gettext(\"Now\"), \"href\", \"javascript:DateTimeShortcuts.handleClockQuicklink(\" + num + \", new Date().strftime('\" + time_format + \"'));\");\n        quickElement(\"a\", quickElement(\"li\", time_list, \"\"), gettext(\"Midnight\"), \"href\", \"javascript:DateTimeShortcuts.handleClockQuicklink(\" + num + \", new Date(1970,1,1,0,0,0,0).strftime('\" + time_format + \"'));\");\n        quickElement(\"a\", quickElement(\"li\", time_list, \"\"), gettext(\"6 a.m.\"), \"href\", \"javascript:DateTimeShortcuts.handleClockQuicklink(\" + num + \", new Date(1970,1,1,6,0,0,0).strftime('\" + time_format + \"'));\");\n        quickElement(\"a\", quickElement(\"li\", time_list, \"\"), gettext(\"Noon\"), \"href\", \"javascript:DateTimeShortcuts.handleClockQuicklink(\" + num + \", new Date(1970,1,1,12,0,0,0).strftime('\" + time_format + \"'));\");\n\n        cancel_p = quickElement('p', clock_box, '');\n        cancel_p.className = 'calendar-cancel';\n        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');\n    },\n    openClock: function(num) {\n        var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num)\n        var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num)\n\n        // Recalculate the clockbox position\n        // is it left-to-right or right-to-left layout ?\n        if (getStyle(document.body,'direction')!='rtl') {\n            clock_box.style.left = findPosX(clock_link) + 17 + 'px';\n        }\n        else {\n            // since style's width is in em, it'd be tough to calculate\n            // px value of it. let's use an estimated px for now\n            // TODO: IE returns wrong value for findPosX when in rtl mode\n            //       (it returns as it was left aligned), needs to be fixed.\n            clock_box.style.left = findPosX(clock_link) - 110 + 'px';\n        }\n        clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';\n\n        // Show the clock box\n        clock_box.style.display = 'block';\n        addEvent(window.document, 'click', function() { DateTimeShortcuts.dismissClock(num); return true; });\n    },\n    dismissClock: function(num) {\n       document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';\n       window.document.onclick = null;\n    },\n    handleClockQuicklink: function(num, val) {\n       DateTimeShortcuts.clockInputs[num].value = val;\n       DateTimeShortcuts.clockInputs[num].focus();\n       DateTimeShortcuts.dismissClock(num);\n    },\n    // Add calendar widget to a given field.\n    addCalendar: function(inp) {\n        var num = DateTimeShortcuts.calendars.length;\n\n        DateTimeShortcuts.calendarInputs[num] = inp;\n\n        // Shortcut links (calendar icon and \"Today\" link)\n        var shortcuts_span = document.createElement('span');\n        shortcuts_span.className = DateTimeShortcuts.shortCutsClass;\n        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);\n        var today_link = document.createElement('a');\n        today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');\n        today_link.appendChild(document.createTextNode(gettext('Today')));\n        var cal_link = document.createElement('a');\n        cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');\n        cal_link.id = DateTimeShortcuts.calendarLinkName + num;\n        quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar'));\n        shortcuts_span.appendChild(document.createTextNode('\\240'));\n        shortcuts_span.appendChild(today_link);\n        shortcuts_span.appendChild(document.createTextNode('\\240|\\240'));\n        shortcuts_span.appendChild(cal_link);\n\n        // Create calendarbox div.\n        //\n        // Markup looks like:\n        //\n        // <div id=\"calendarbox3\" class=\"calendarbox module\">\n        //     <h2>\n        //           <a href=\"#\" class=\"link-previous\">&lsaquo;</a>\n        //           <a href=\"#\" class=\"link-next\">&rsaquo;</a> February 2003\n        //     </h2>\n        //     <div class=\"calendar\" id=\"calendarin3\">\n        //         <!-- (cal) -->\n        //     </div>\n        //     <div class=\"calendar-shortcuts\">\n        //          <a href=\"#\">Yesterday</a> | <a href=\"#\">Today</a> | <a href=\"#\">Tomorrow</a>\n        //     </div>\n        //     <p class=\"calendar-cancel\"><a href=\"#\">Cancel</a></p>\n        // </div>\n        var cal_box = document.createElement('div');\n        cal_box.style.display = 'none';\n        cal_box.style.position = 'absolute';\n        cal_box.className = 'calendarbox module';\n        cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);\n        document.body.appendChild(cal_box);\n        addEvent(cal_box, 'click', DateTimeShortcuts.cancelEventPropagation);\n\n        // next-prev links\n        var cal_nav = quickElement('div', cal_box, '');\n        var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');\n        cal_nav_prev.className = 'calendarnav-previous';\n        var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');\n        cal_nav_next.className = 'calendarnav-next';\n\n        // main box\n        var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);\n        cal_main.className = 'calendar';\n        DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));\n        DateTimeShortcuts.calendars[num].drawCurrent();\n\n        // calendar shortcuts\n        var shortcuts = quickElement('div', cal_box, '');\n        shortcuts.className = 'calendar-shortcuts';\n        quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');\n        shortcuts.appendChild(document.createTextNode('\\240|\\240'));\n        quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');\n        shortcuts.appendChild(document.createTextNode('\\240|\\240'));\n        quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');\n\n        // cancel bar\n        var cancel_p = quickElement('p', cal_box, '');\n        cancel_p.className = 'calendar-cancel';\n        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');\n    },\n    openCalendar: function(num) {\n        var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)\n        var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)\n        var inp = DateTimeShortcuts.calendarInputs[num];\n\n        // Determine if the current value in the input has a valid date.\n        // If so, draw the calendar with that date's year and month.\n        if (inp.value) {\n            var date_parts = inp.value.split('-');\n            var year = date_parts[0];\n            var month = parseFloat(date_parts[1]);\n            if (year.match(/\\d\\d\\d\\d/) && month >= 1 && month <= 12) {\n                DateTimeShortcuts.calendars[num].drawDate(month, year);\n            }\n        }\n\n        // Recalculate the clockbox position\n        // is it left-to-right or right-to-left layout ?\n        if (getStyle(document.body,'direction')!='rtl') {\n            cal_box.style.left = findPosX(cal_link) + 17 + 'px';\n        }\n        else {\n            // since style's width is in em, it'd be tough to calculate\n            // px value of it. let's use an estimated px for now\n            // TODO: IE returns wrong value for findPosX when in rtl mode\n            //       (it returns as it was left aligned), needs to be fixed.\n            cal_box.style.left = findPosX(cal_link) - 180 + 'px';\n        }\n        cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';\n\n        cal_box.style.display = 'block';\n        addEvent(window.document, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; });\n    },\n    dismissCalendar: function(num) {\n        document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';\n        window.document.onclick = null;\n    },\n    drawPrev: function(num) {\n        DateTimeShortcuts.calendars[num].drawPreviousMonth();\n    },\n    drawNext: function(num) {\n        DateTimeShortcuts.calendars[num].drawNextMonth();\n    },\n    handleCalendarCallback: function(num) {\n        format = get_format('DATE_INPUT_FORMATS')[0];\n        // the format needs to be escaped a little\n        format = format.replace('\\\\', '\\\\\\\\');\n        format = format.replace('\\r', '\\\\r');\n        format = format.replace('\\n', '\\\\n');\n        format = format.replace('\\t', '\\\\t');\n        format = format.replace(\"'\", \"\\\\'\");\n        return [\"function(y, m, d) { DateTimeShortcuts.calendarInputs[\",\n               num,\n               \"].value = new Date(y, m-1, d).strftime('\",\n               format,\n               \"');DateTimeShortcuts.calendarInputs[\",\n               num,\n               \"].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+\",\n               num,\n               \").style.display='none';}\"].join('');\n    },\n    handleCalendarQuickLink: function(num, offset) {\n       var d = new Date();\n       d.setDate(d.getDate() + offset)\n       DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);\n       DateTimeShortcuts.calendarInputs[num].focus();\n       DateTimeShortcuts.dismissCalendar(num);\n    },\n    cancelEventPropagation: function(e) {\n        if (!e) e = window.event;\n        e.cancelBubble = true;\n        if (e.stopPropagation) e.stopPropagation();\n    }\n}\n\naddEvent(window, 'load', DateTimeShortcuts.init);\n"
  },
  {
    "path": "selfblog/static/admin/js/admin/RelatedObjectLookups.js",
    "content": "// Handles related-objects functionality: lookup link for raw_id_fields\n// and Add Another links.\n\nfunction html_unescape(text) {\n    // Unescape a string that was escaped using django.utils.html.escape.\n    text = text.replace(/&lt;/g, '<');\n    text = text.replace(/&gt;/g, '>');\n    text = text.replace(/&quot;/g, '\"');\n    text = text.replace(/&#39;/g, \"'\");\n    text = text.replace(/&amp;/g, '&');\n    return text;\n}\n\n// IE doesn't accept periods or dashes in the window name, but the element IDs\n// we use to generate popup window names may contain them, therefore we map them\n// to allowed characters in a reversible way so that we can locate the correct \n// element when the popup window is dismissed.\nfunction id_to_windowname(text) {\n    text = text.replace(/\\./g, '__dot__');\n    text = text.replace(/\\-/g, '__dash__');\n    return text;\n}\n\nfunction windowname_to_id(text) {\n    text = text.replace(/__dot__/g, '.');\n    text = text.replace(/__dash__/g, '-');\n    return text;\n}\n\nfunction showRelatedObjectLookupPopup(triggeringLink) {\n    var name = triggeringLink.id.replace(/^lookup_/, '');\n    name = id_to_windowname(name);\n    var href;\n    if (triggeringLink.href.search(/\\?/) >= 0) {\n        href = triggeringLink.href + '&pop=1';\n    } else {\n        href = triggeringLink.href + '?pop=1';\n    }\n    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');\n    win.focus();\n    return false;\n}\n\nfunction dismissRelatedLookupPopup(win, chosenId) {\n    var name = windowname_to_id(win.name);\n    var elem = document.getElementById(name);\n    if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {\n        elem.value += ',' + chosenId;\n    } else {\n        document.getElementById(name).value = chosenId;\n    }\n    win.close();\n}\n\nfunction showAddAnotherPopup(triggeringLink) {\n    var name = triggeringLink.id.replace(/^add_/, '');\n    name = id_to_windowname(name);\n    href = triggeringLink.href\n    if (href.indexOf('?') == -1) {\n        href += '?_popup=1';\n    } else {\n        href  += '&_popup=1';\n    }\n    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');\n    win.focus();\n    return false;\n}\n\nfunction dismissAddAnotherPopup(win, newId, newRepr) {\n    // newId and newRepr are expected to have previously been escaped by\n    // django.utils.html.escape.\n    newId = html_unescape(newId);\n    newRepr = html_unescape(newRepr);\n    var name = windowname_to_id(win.name);\n    var elem = document.getElementById(name);\n    if (elem) {\n        if (elem.nodeName == 'SELECT') {\n            var o = new Option(newRepr, newId);\n            elem.options[elem.options.length] = o;\n            o.selected = true;\n        } else if (elem.nodeName == 'INPUT') {\n            if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {\n                elem.value += ',' + newId;\n            } else {\n                elem.value = newId;\n            }\n        }\n    } else {\n        var toId = name + \"_to\";\n        elem = document.getElementById(toId);\n        var o = new Option(newRepr, newId);\n        SelectBox.add_to_cache(toId, o);\n        SelectBox.redisplay(toId);\n    }\n    win.close();\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/admin/ordering.js",
    "content": "addEvent(window, 'load', reorder_init);\n\nvar lis;\nvar top = 0;\nvar left = 0;\nvar height = 30;\n\nfunction reorder_init() {\n    lis = document.getElementsBySelector('ul#orderthese li');\n    var input = document.getElementsBySelector('input[name=order_]')[0];\n    setOrder(input.value.split(','));\n    input.disabled = true;\n    draw();\n    // Now initialise the dragging behaviour\n    var limit = (lis.length - 1) * height;\n    for (var i = 0; i < lis.length; i++) {\n        var li = lis[i];\n        var img = document.getElementById('handle'+li.id);\n        li.style.zIndex = 1;\n        Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit);\n        li.onDragStart = startDrag;\n        li.onDragEnd = endDrag;\n        img.style.cursor = 'move';\n    }\n}\n\nfunction submitOrderForm() {\n    var inputOrder = document.getElementsBySelector('input[name=order_]')[0];\n    inputOrder.value = getOrder();\n    inputOrder.disabled=false;\n}\n\nfunction startDrag() {\n    this.style.zIndex = '10';\n    this.className = 'dragging';\n}\n\nfunction endDrag(x, y) {\n    this.style.zIndex = '1';\n    this.className = '';\n    // Work out how far along it has been dropped, using x co-ordinate\n    var oldIndex = this.index;\n    var newIndex = Math.round((y - 10 - top) / height);\n    // 'Snap' to the correct position\n    this.style.top = (10 + top + newIndex * height) + 'px';\n    this.index = newIndex;\n    moveItem(oldIndex, newIndex);\n}\n\nfunction moveItem(oldIndex, newIndex) {\n    // Swaps two items, adjusts the index and left co-ord for all others\n    if (oldIndex == newIndex) {\n        return; // Nothing to swap;\n    }\n    var direction, lo, hi;\n    if (newIndex > oldIndex) {\n        lo = oldIndex;\n        hi = newIndex;\n        direction = -1;\n    } else {\n        direction = 1;\n        hi = oldIndex;\n        lo = newIndex;\n    }\n    var lis2 = new Array(); // We will build the new order in this array\n    for (var i = 0; i < lis.length; i++) {\n        if (i < lo || i > hi) {\n            // Position of items not between the indexes is unaffected\n            lis2[i] = lis[i];\n            continue;\n        } else if (i == newIndex) {\n            lis2[i] = lis[oldIndex];\n            continue;\n        } else {\n            // Item is between the two indexes - move it along 1\n            lis2[i] = lis[i - direction];\n        }\n    }\n    // Re-index everything\n    reIndex(lis2);\n    lis = lis2;\n    draw();\n//    document.getElementById('hiddenOrder').value = getOrder();\n    document.getElementsBySelector('input[name=order_]')[0].value = getOrder();\n}\n\nfunction reIndex(lis) {\n    for (var i = 0; i < lis.length; i++) {\n        lis[i].index = i;\n    }\n}\n\nfunction draw() {\n    for (var i = 0; i < lis.length; i++) {\n        var li = lis[i];\n        li.index = i;\n        li.style.position = 'absolute';\n        li.style.left = (10 + left) + 'px';\n        li.style.top = (10 + top + (i * height)) + 'px';\n    }\n}\n\nfunction getOrder() {\n    var order = new Array(lis.length);\n    for (var i = 0; i < lis.length; i++) {\n        order[i] = lis[i].id.substring(1, 100);\n    }\n    return order.join(',');\n}\n\nfunction setOrder(id_list) {\n    /* Set the current order to match the lsit of IDs */\n    var temp_lis = new Array();\n    for (var i = 0; i < id_list.length; i++) {\n        var id = 'p' + id_list[i];\n        temp_lis[temp_lis.length] = document.getElementById(id);\n    }\n    reIndex(temp_lis);\n    lis = temp_lis;\n    draw();\n}\n\nfunction addEvent(elm, evType, fn, useCapture)\n// addEvent and removeEvent\n// cross-browser event handling for IE5+,  NS6 and Mozilla\n// By Scott Andrew\n{\n  if (elm.addEventListener){\n    elm.addEventListener(evType, fn, useCapture);\n    return true;\n  } else if (elm.attachEvent){\n    var r = elm.attachEvent(\"on\"+evType, fn);\n    return r;\n  } else {\n    elm['on'+evType] = fn;\n  }\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/calendar.js",
    "content": "/*\ncalendar.js - Calendar functions by Adrian Holovaty\n*/\n\nfunction removeChildren(a) { // \"a\" is reference to an object\n    while (a.hasChildNodes()) a.removeChild(a.lastChild);\n}\n\n// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);\nfunction quickElement() {\n    var obj = document.createElement(arguments[0]);\n    if (arguments[2] != '' && arguments[2] != null) {\n        var textNode = document.createTextNode(arguments[2]);\n        obj.appendChild(textNode);\n    }\n    var len = arguments.length;\n    for (var i = 3; i < len; i += 2) {\n        obj.setAttribute(arguments[i], arguments[i+1]);\n    }\n    arguments[1].appendChild(obj);\n    return obj;\n}\n\n// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions\nvar CalendarNamespace = {\n    monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),\n    daysOfWeek: gettext('S M T W T F S').split(' '),\n    firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),\n    isLeapYear: function(year) {\n        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));\n    },\n    getDaysInMonth: function(month,year) {\n        var days;\n        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {\n            days = 31;\n        }\n        else if (month==4 || month==6 || month==9 || month==11) {\n            days = 30;\n        }\n        else if (month==2 && CalendarNamespace.isLeapYear(year)) {\n            days = 29;\n        }\n        else {\n            days = 28;\n        }\n        return days;\n    },\n    draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999\n        var today = new Date();\n        var todayDay = today.getDate();\n        var todayMonth = today.getMonth()+1;\n        var todayYear = today.getFullYear();\n        var todayClass = '';\n\n        month = parseInt(month);\n        year = parseInt(year);\n        var calDiv = document.getElementById(div_id);\n        removeChildren(calDiv);\n        var calTable = document.createElement('table');\n        quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);\n        var tableBody = quickElement('tbody', calTable);\n\n        // Draw days-of-week header\n        var tableRow = quickElement('tr', tableBody);\n        for (var i = 0; i < 7; i++) {\n            quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);\n        }\n\n        var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).getDay();\n        var days = CalendarNamespace.getDaysInMonth(month, year);\n\n        // Draw blanks before first of month\n        tableRow = quickElement('tr', tableBody);\n        for (var i = 0; i < startingPos; i++) {\n            var _cell = quickElement('td', tableRow, ' ');\n            _cell.style.backgroundColor = '#f3f3f3';\n        }\n\n        // Draw days of month\n        var currentDay = 1;\n        for (var i = startingPos; currentDay <= days; i++) {\n            if (i%7 == 0 && currentDay != 1) {\n                tableRow = quickElement('tr', tableBody);\n            }\n            if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) {\n                todayClass='today';\n            } else {\n                todayClass='';\n            }\n            var cell = quickElement('td', tableRow, '', 'class', todayClass);\n\n            quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');\n            currentDay++;\n        }\n\n        // Draw blanks after end of month (optional, but makes for valid code)\n        while (tableRow.childNodes.length < 7) {\n            var _cell = quickElement('td', tableRow, ' ');\n            _cell.style.backgroundColor = '#f3f3f3';\n        }\n\n        calDiv.appendChild(calTable);\n    }\n}\n\n// Calendar -- A calendar instance\nfunction Calendar(div_id, callback) {\n    // div_id (string) is the ID of the element in which the calendar will\n    //     be displayed\n    // callback (string) is the name of a JavaScript function that will be\n    //     called with the parameters (year, month, day) when a day in the\n    //     calendar is clicked\n    this.div_id = div_id;\n    this.callback = callback;\n    this.today = new Date();\n    this.currentMonth = this.today.getMonth() + 1;\n    this.currentYear = this.today.getFullYear();\n}\nCalendar.prototype = {\n    drawCurrent: function() {\n        CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);\n    },\n    drawDate: function(month, year) {\n        this.currentMonth = month;\n        this.currentYear = year;\n        this.drawCurrent();\n    },\n    drawPreviousMonth: function() {\n        if (this.currentMonth == 1) {\n            this.currentMonth = 12;\n            this.currentYear--;\n        }\n        else {\n            this.currentMonth--;\n        }\n        this.drawCurrent();\n    },\n    drawNextMonth: function() {\n        if (this.currentMonth == 12) {\n            this.currentMonth = 1;\n            this.currentYear++;\n        }\n        else {\n            this.currentMonth++;\n        }\n        this.drawCurrent();\n    },\n    drawPreviousYear: function() {\n        this.currentYear--;\n        this.drawCurrent();\n    },\n    drawNextYear: function() {\n        this.currentYear++;\n        this.drawCurrent();\n    }\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/collapse.js",
    "content": "(function($) {\n\t$(document).ready(function() {\n\t\t// Add anchor tag for Show/Hide link\n\t\t$(\"fieldset.collapse\").each(function(i, elem) {\n\t\t\t// Don't hide if fields in this fieldset have errors\n\t\t\tif ( $(elem).find(\"div.errors\").length == 0 ) {\n\t\t\t\t$(elem).addClass(\"collapsed\");\n\t\t\t\t$(elem).find(\"h2\").first().append(' (<a id=\"fieldsetcollapser' +\n\t\t\t\t\ti +'\" class=\"collapse-toggle\" href=\"#\">' + gettext(\"Show\") +\n\t\t\t\t\t'</a>)');\n\t\t\t}\n\t\t});\n\t\t// Add toggle to anchor tag\n\t\t$(\"fieldset.collapse a.collapse-toggle\").toggle(\n\t\t\tfunction() { // Show\n\t\t\t\t$(this).text(gettext(\"Hide\"));\n\t\t\t\t$(this).closest(\"fieldset\").removeClass(\"collapsed\");\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tfunction() { // Hide\n\t\t\t\t$(this).text(gettext(\"Show\"));\n\t\t\t\t$(this).closest(\"fieldset\").addClass(\"collapsed\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t);\n\t});\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/compress.py",
    "content": "#!/usr/bin/env python\nimport os\nimport optparse\nimport subprocess\nimport sys\n\nhere = os.path.dirname(__file__)\n\ndef main():\n    usage = \"usage: %prog [file1..fileN]\"\n    description = \"\"\"With no file paths given this script will automatically\ncompress all jQuery-based files of the admin app. Requires the Google Closure\nCompiler library and Java version 6 or later.\"\"\"\n    parser = optparse.OptionParser(usage, description=description)\n    parser.add_option(\"-c\", dest=\"compiler\", default=\"~/bin/compiler.jar\",\n                      help=\"path to Closure Compiler jar file\")\n    parser.add_option(\"-v\", \"--verbose\",\n                      action=\"store_true\", dest=\"verbose\")\n    parser.add_option(\"-q\", \"--quiet\",\n                      action=\"store_false\", dest=\"verbose\")\n    (options, args) = parser.parse_args()\n\n    compiler = os.path.expanduser(options.compiler)\n    if not os.path.exists(compiler):\n        sys.exit(\"Google Closure compiler jar file %s not found. Please use the -c option to specify the path.\" % compiler)\n\n    if not args:\n        if options.verbose:\n            sys.stdout.write(\"No filenames given; defaulting to admin scripts\\n\")\n        args = [os.path.join(here, f) for f in [\n            \"actions.js\", \"collapse.js\", \"inlines.js\", \"prepopulate.js\"]]\n\n    for arg in args:\n        if not arg.endswith(\".js\"):\n            arg = arg + \".js\"\n        to_compress = os.path.expanduser(arg)\n        if os.path.exists(to_compress):\n            to_compress_min = \"%s.min.js\" % \"\".join(arg.rsplit(\".js\"))\n            cmd = \"java -jar %s --js %s --js_output_file %s\" % (compiler, to_compress, to_compress_min)\n            if options.verbose:\n                sys.stdout.write(\"Running: %s\\n\" % cmd)\n            subprocess.call(cmd.split())\n        else:\n            sys.stdout.write(\"File %s not found. Sure it exists?\\n\" % to_compress)\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "selfblog/static/admin/js/core.js",
    "content": "// Core javascript helper functions\n\n// basic browser identification & version\nvar isOpera = (navigator.userAgent.indexOf(\"Opera\")>=0) && parseFloat(navigator.appVersion);\nvar isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split(\"MSIE \")[1].split(\";\")[0]);\n\n// Cross-browser event handlers.\nfunction addEvent(obj, evType, fn) {\n    if (obj.addEventListener) {\n        obj.addEventListener(evType, fn, false);\n        return true;\n    } else if (obj.attachEvent) {\n        var r = obj.attachEvent(\"on\" + evType, fn);\n        return r;\n    } else {\n        return false;\n    }\n}\n\nfunction removeEvent(obj, evType, fn) {\n    if (obj.removeEventListener) {\n        obj.removeEventListener(evType, fn, false);\n        return true;\n    } else if (obj.detachEvent) {\n        obj.detachEvent(\"on\" + evType, fn);\n        return true;\n    } else {\n        return false;\n    }\n}\n\n// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);\nfunction quickElement() {\n    var obj = document.createElement(arguments[0]);\n    if (arguments[2] != '' && arguments[2] != null) {\n        var textNode = document.createTextNode(arguments[2]);\n        obj.appendChild(textNode);\n    }\n    var len = arguments.length;\n    for (var i = 3; i < len; i += 2) {\n        obj.setAttribute(arguments[i], arguments[i+1]);\n    }\n    arguments[1].appendChild(obj);\n    return obj;\n}\n\n// ----------------------------------------------------------------------------\n// Cross-browser xmlhttp object\n// from http://jibbering.com/2002/4/httprequest.html\n// ----------------------------------------------------------------------------\nvar xmlhttp;\n/*@cc_on @*/\n/*@if (@_jscript_version >= 5)\n    try {\n        xmlhttp = new ActiveXObject(\"Msxml2.XMLHTTP\");\n    } catch (e) {\n        try {\n            xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        } catch (E) {\n            xmlhttp = false;\n        }\n    }\n@else\n    xmlhttp = false;\n@end @*/\nif (!xmlhttp && typeof XMLHttpRequest != 'undefined') {\n  xmlhttp = new XMLHttpRequest();\n}\n\n// ----------------------------------------------------------------------------\n// Find-position functions by PPK\n// See http://www.quirksmode.org/js/findpos.html\n// ----------------------------------------------------------------------------\nfunction findPosX(obj) {\n    var curleft = 0;\n    if (obj.offsetParent) {\n        while (obj.offsetParent) {\n            curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft);\n            obj = obj.offsetParent;\n        }\n        // IE offsetParent does not include the top-level\n        if (isIE && obj.parentElement){\n            curleft += obj.offsetLeft - obj.scrollLeft;\n        }\n    } else if (obj.x) {\n        curleft += obj.x;\n    }\n    return curleft;\n}\n\nfunction findPosY(obj) {\n    var curtop = 0;\n    if (obj.offsetParent) {\n        while (obj.offsetParent) {\n            curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop);\n            obj = obj.offsetParent;\n        }\n        // IE offsetParent does not include the top-level\n        if (isIE && obj.parentElement){\n            curtop += obj.offsetTop - obj.scrollTop;\n        }\n    } else if (obj.y) {\n        curtop += obj.y;\n    }\n    return curtop;\n}\n\n//-----------------------------------------------------------------------------\n// Date object extensions\n// ----------------------------------------------------------------------------\nDate.prototype.getCorrectYear = function() {\n    // Date.getYear() is unreliable --\n    // see http://www.quirksmode.org/js/introdate.html#year\n    var y = this.getYear() % 100;\n    return (y < 38) ? y + 2000 : y + 1900;\n}\n\nDate.prototype.getTwelveHours = function() {\n    hours = this.getHours();\n    if (hours == 0) {\n        return 12;\n    }\n    else {\n        return hours <= 12 ? hours : hours-12\n    }\n}\n\nDate.prototype.getTwoDigitMonth = function() {\n    return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);\n}\n\nDate.prototype.getTwoDigitDate = function() {\n    return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();\n}\n\nDate.prototype.getTwoDigitTwelveHour = function() {\n    return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();\n}\n\nDate.prototype.getTwoDigitHour = function() {\n    return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();\n}\n\nDate.prototype.getTwoDigitMinute = function() {\n    return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();\n}\n\nDate.prototype.getTwoDigitSecond = function() {\n    return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();\n}\n\nDate.prototype.getISODate = function() {\n    return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();\n}\n\nDate.prototype.getHourMinute = function() {\n    return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();\n}\n\nDate.prototype.getHourMinuteSecond = function() {\n    return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();\n}\n\nDate.prototype.strftime = function(format) {\n    var fields = {\n        c: this.toString(),\n        d: this.getTwoDigitDate(),\n        H: this.getTwoDigitHour(),\n        I: this.getTwoDigitTwelveHour(),\n        m: this.getTwoDigitMonth(),\n        M: this.getTwoDigitMinute(),\n        p: (this.getHours() >= 12) ? 'PM' : 'AM',\n        S: this.getTwoDigitSecond(),\n        w: '0' + this.getDay(),\n        x: this.toLocaleDateString(),\n        X: this.toLocaleTimeString(),\n        y: ('' + this.getFullYear()).substr(2, 4),\n        Y: '' + this.getFullYear(),\n        '%' : '%'\n    };\n    var result = '', i = 0;\n    while (i < format.length) {\n        if (format.charAt(i) === '%') {\n            result = result + fields[format.charAt(i + 1)];\n            ++i;\n        }\n        else {\n            result = result + format.charAt(i);\n        }\n        ++i;\n    }\n    return result;\n}\n\n// ----------------------------------------------------------------------------\n// String object extensions\n// ----------------------------------------------------------------------------\nString.prototype.pad_left = function(pad_length, pad_string) {\n    var new_string = this;\n    for (var i = 0; new_string.length < pad_length; i++) {\n        new_string = pad_string + new_string;\n    }\n    return new_string;\n}\n\n// ----------------------------------------------------------------------------\n// Get the computed style for and element\n// ----------------------------------------------------------------------------\nfunction getStyle(oElm, strCssRule){\n    var strValue = \"\";\n    if(document.defaultView && document.defaultView.getComputedStyle){\n        strValue = document.defaultView.getComputedStyle(oElm, \"\").getPropertyValue(strCssRule);\n    }\n    else if(oElm.currentStyle){\n        strCssRule = strCssRule.replace(/\\-(\\w)/g, function (strMatch, p1){\n            return p1.toUpperCase();\n        });\n        strValue = oElm.currentStyle[strCssRule];\n    }\n    return strValue;\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/dateparse.js",
    "content": "/* 'Magic' date parsing, by Simon Willison (6th October 2003)\n   http://simon.incutio.com/archive/2003/10/06/betterDateInput\n   Adapted for 6newslawrence.com, 28th January 2004\n*/\n\n/* Finds the index of the first occurence of item in the array, or -1 if not found */\nif (typeof Array.prototype.indexOf == 'undefined') {\n    Array.prototype.indexOf = function(item) {\n        var len = this.length;\n        for (var i = 0; i < len; i++) {\n            if (this[i] == item) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\n/* Returns an array of items judged 'true' by the passed in test function */\nif (typeof Array.prototype.filter == 'undefined') {\n    Array.prototype.filter = function(test) {\n        var matches = [];\n        var len = this.length;\n        for (var i = 0; i < len; i++) {\n            if (test(this[i])) {\n                matches[matches.length] = this[i];\n            }\n        }\n        return matches;\n    };\n}\n\nvar monthNames = gettext(\"January February March April May June July August September October November December\").split(\" \");\nvar weekdayNames = gettext(\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\").split(\" \");\n\n/* Takes a string, returns the index of the month matching that string, throws\n   an error if 0 or more than 1 matches\n*/\nfunction parseMonth(month) {\n    var matches = monthNames.filter(function(item) { \n        return new RegExp(\"^\" + month, \"i\").test(item);\n    });\n    if (matches.length == 0) {\n        throw new Error(\"Invalid month string\");\n    }\n    if (matches.length > 1) {\n        throw new Error(\"Ambiguous month\");\n    }\n    return monthNames.indexOf(matches[0]);\n}\n/* Same as parseMonth but for days of the week */\nfunction parseWeekday(weekday) {\n    var matches = weekdayNames.filter(function(item) {\n        return new RegExp(\"^\" + weekday, \"i\").test(item);\n    });\n    if (matches.length == 0) {\n        throw new Error(\"Invalid day string\");\n    }\n    if (matches.length > 1) {\n        throw new Error(\"Ambiguous weekday\");\n    }\n    return weekdayNames.indexOf(matches[0]);\n}\n\n/* Array of objects, each has 're', a regular expression and 'handler', a \n   function for creating a date from something that matches the regular \n   expression. Handlers may throw errors if string is unparseable. \n*/\nvar dateParsePatterns = [\n    // Today\n    {   re: /^tod/i,\n        handler: function() { \n            return new Date();\n        } \n    },\n    // Tomorrow\n    {   re: /^tom/i,\n        handler: function() {\n            var d = new Date(); \n            d.setDate(d.getDate() + 1); \n            return d;\n        }\n    },\n    // Yesterday\n    {   re: /^yes/i,\n        handler: function() {\n            var d = new Date();\n            d.setDate(d.getDate() - 1);\n            return d;\n        }\n    },\n    // 4th\n    {   re: /^(\\d{1,2})(st|nd|rd|th)?$/i, \n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(parseInt(bits[1], 10));\n            return d;\n        }\n    },\n    // 4th Jan\n    {   re: /^(\\d{1,2})(?:st|nd|rd|th)? (\\w+)$/i, \n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setMonth(parseMonth(bits[2]));\n            d.setDate(parseInt(bits[1], 10));\n            return d;\n        }\n    },\n    // 4th Jan 2003\n    {   re: /^(\\d{1,2})(?:st|nd|rd|th)? (\\w+),? (\\d{4})$/i,\n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setYear(bits[3]);\n            d.setMonth(parseMonth(bits[2]));\n            d.setDate(parseInt(bits[1], 10));\n            return d;\n        }\n    },\n    // Jan 4th\n    {   re: /^(\\w+) (\\d{1,2})(?:st|nd|rd|th)?$/i, \n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setMonth(parseMonth(bits[1]));\n            d.setDate(parseInt(bits[2], 10));\n            return d;\n        }\n    },\n    // Jan 4th 2003\n    {   re: /^(\\w+) (\\d{1,2})(?:st|nd|rd|th)?,? (\\d{4})$/i,\n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setYear(bits[3]);\n            d.setMonth(parseMonth(bits[1]));\n            d.setDate(parseInt(bits[2], 10));\n            return d;\n        }\n    },\n    // next Tuesday - this is suspect due to weird meaning of \"next\"\n    {   re: /^next (\\w+)$/i,\n        handler: function(bits) {\n            var d = new Date();\n            var day = d.getDay();\n            var newDay = parseWeekday(bits[1]);\n            var addDays = newDay - day;\n            if (newDay <= day) {\n                addDays += 7;\n            }\n            d.setDate(d.getDate() + addDays);\n            return d;\n        }\n    },\n    // last Tuesday\n    {   re: /^last (\\w+)$/i,\n        handler: function(bits) {\n            throw new Error(\"Not yet implemented\");\n        }\n    },\n    // mm/dd/yyyy (American style)\n    {   re: /(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})/,\n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setYear(bits[3]);\n            d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0\n            d.setDate(parseInt(bits[2], 10));\n            return d;\n        }\n    },\n    // yyyy-mm-dd (ISO style)\n    {   re: /(\\d{4})-(\\d{1,2})-(\\d{1,2})/,\n        handler: function(bits) {\n            var d = new Date();\n            d.setDate(1);\n            d.setYear(parseInt(bits[1]));\n            d.setMonth(parseInt(bits[2], 10) - 1);\n            d.setDate(parseInt(bits[3], 10));\n            return d;\n        }\n    },\n];\n\nfunction parseDateString(s) {\n    for (var i = 0; i < dateParsePatterns.length; i++) {\n        var re = dateParsePatterns[i].re;\n        var handler = dateParsePatterns[i].handler;\n        var bits = re.exec(s);\n        if (bits) {\n            return handler(bits);\n        }\n    }\n    throw new Error(\"Invalid date string\");\n}\n\nfunction fmt00(x) {\n    // fmt00: Tags leading zero onto numbers 0 - 9.\n    // Particularly useful for displaying results from Date methods.\n    //\n    if (Math.abs(parseInt(x)) < 10){\n        x = \"0\"+ Math.abs(x);\n    }\n    return x;\n}\n\nfunction parseDateStringISO(s) {\n    try {\n        var d = parseDateString(s);\n        return d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + fmt00(d.getDate())\n    }\n    catch (e) { return s; }\n}\nfunction magicDate(input) {\n    var messagespan = input.id + 'Msg';\n    try {\n        var d = parseDateString(input.value);\n        input.value = d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + \n            fmt00(d.getDate());\n        input.className = '';\n        // Human readable date\n        if (document.getElementById(messagespan)) {\n            document.getElementById(messagespan).firstChild.nodeValue = d.toDateString();\n            document.getElementById(messagespan).className = 'normal';\n        }\n    }\n    catch (e) {\n        input.className = 'error';\n        var message = e.message;\n        // Fix for IE6 bug\n        if (message.indexOf('is null or not an object') > -1) {\n            message = 'Invalid date string';\n        }\n        if (document.getElementById(messagespan)) {\n            document.getElementById(messagespan).firstChild.nodeValue = message;\n            document.getElementById(messagespan).className = 'error';\n        }\n    }\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/getElementsBySelector.js",
    "content": "/* document.getElementsBySelector(selector)\n   - returns an array of element objects from the current document\n     matching the CSS selector. Selectors can contain element names, \n     class names and ids and can be nested. For example:\n     \n       elements = document.getElementsBySelect('div#main p a.external')\n     \n     Will return an array of all 'a' elements with 'external' in their \n     class attribute that are contained inside 'p' elements that are \n     contained inside the 'div' element which has id=\"main\"\n\n   New in version 0.4: Support for CSS2 and CSS3 attribute selectors:\n   See http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\n   Version 0.4 - Simon Willison, March 25th 2003\n   -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows\n   -- Opera 7 fails \n*/\n\nfunction getAllChildren(e) {\n  // Returns all children of element. Workaround required for IE5/Windows. Ugh.\n  return e.all ? e.all : e.getElementsByTagName('*');\n}\n\ndocument.getElementsBySelector = function(selector) {\n  // Attempt to fail gracefully in lesser browsers\n  if (!document.getElementsByTagName) {\n    return new Array();\n  }\n  // Split selector in to tokens\n  var tokens = selector.split(' ');\n  var currentContext = new Array(document);\n  for (var i = 0; i < tokens.length; i++) {\n    token = tokens[i].replace(/^\\s+/,'').replace(/\\s+$/,'');;\n    if (token.indexOf('#') > -1) {\n      // Token is an ID selector\n      var bits = token.split('#');\n      var tagName = bits[0];\n      var id = bits[1];\n      var element = document.getElementById(id);\n      if (!element || (tagName && element.nodeName.toLowerCase() != tagName)) {\n        // ID not found or tag with that ID not found, return false.\n        return new Array();\n      }\n      // Set currentContext to contain just this element\n      currentContext = new Array(element);\n      continue; // Skip to next token\n    }\n    if (token.indexOf('.') > -1) {\n      // Token contains a class selector\n      var bits = token.split('.');\n      var tagName = bits[0];\n      var className = bits[1];\n      if (!tagName) {\n        tagName = '*';\n      }\n      // Get elements matching tag, filter them for class selector\n      var found = new Array;\n      var foundCount = 0;\n      for (var h = 0; h < currentContext.length; h++) {\n        var elements;\n        if (tagName == '*') {\n            elements = getAllChildren(currentContext[h]);\n        } else {\n            try {\n                elements = currentContext[h].getElementsByTagName(tagName);\n            }\n            catch(e) {\n                elements = [];\n            }\n        }\n        for (var j = 0; j < elements.length; j++) {\n          found[foundCount++] = elements[j];\n        }\n      }\n      currentContext = new Array;\n      var currentContextIndex = 0;\n      for (var k = 0; k < found.length; k++) {\n        if (found[k].className && found[k].className.match(new RegExp('\\\\b'+className+'\\\\b'))) {\n          currentContext[currentContextIndex++] = found[k];\n        }\n      }\n      continue; // Skip to next token\n    }\n    // Code to deal with attribute selectors\n    if (token.match(/^(\\w*)\\[(\\w+)([=~\\|\\^\\$\\*]?)=?\"?([^\\]\"]*)\"?\\]$/)) {\n      var tagName = RegExp.$1;\n      var attrName = RegExp.$2;\n      var attrOperator = RegExp.$3;\n      var attrValue = RegExp.$4;\n      if (!tagName) {\n        tagName = '*';\n      }\n      // Grab all of the tagName elements within current context\n      var found = new Array;\n      var foundCount = 0;\n      for (var h = 0; h < currentContext.length; h++) {\n        var elements;\n        if (tagName == '*') {\n            elements = getAllChildren(currentContext[h]);\n        } else {\n            elements = currentContext[h].getElementsByTagName(tagName);\n        }\n        for (var j = 0; j < elements.length; j++) {\n          found[foundCount++] = elements[j];\n        }\n      }\n      currentContext = new Array;\n      var currentContextIndex = 0;\n      var checkFunction; // This function will be used to filter the elements\n      switch (attrOperator) {\n        case '=': // Equality\n          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };\n          break;\n        case '~': // Match one of space seperated words \n          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\\\b'+attrValue+'\\\\b'))); };\n          break;\n        case '|': // Match start with value followed by optional hyphen\n          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };\n          break;\n        case '^': // Match starts with value\n          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };\n          break;\n        case '$': // Match ends with value - fails with \"Warning\" in Opera 7\n          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };\n          break;\n        case '*': // Match ends with value\n          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };\n          break;\n        default :\n          // Just test for existence of attribute\n          checkFunction = function(e) { return e.getAttribute(attrName); };\n      }\n      currentContext = new Array;\n      var currentContextIndex = 0;\n      for (var k = 0; k < found.length; k++) {\n        if (checkFunction(found[k])) {\n          currentContext[currentContextIndex++] = found[k];\n        }\n      }\n      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);\n      continue; // Skip to next token\n    }\n    // If we get here, token is JUST an element (not a class or ID selector)\n    tagName = token;\n    var found = new Array;\n    var foundCount = 0;\n    for (var h = 0; h < currentContext.length; h++) {\n      var elements = currentContext[h].getElementsByTagName(tagName);\n      for (var j = 0; j < elements.length; j++) {\n        found[foundCount++] = elements[j];\n      }\n    }\n    currentContext = found;\n  }\n  return currentContext;\n}\n\n/* That revolting regular expression explained \n/^(\\w+)\\[(\\w+)([=~\\|\\^\\$\\*]?)=?\"?([^\\]\"]*)\"?\\]$/\n  \\---/  \\---/\\-------------/    \\-------/\n    |      |         |               |\n    |      |         |           The value\n    |      |    ~,|,^,$,* or =\n    |   Attribute \n   Tag\n*/\n"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/grappelli.js",
    "content": "/**\n * GRAPPELLI UTILS\n * functions needed for Grappelli\n */\n \nvar django = {\n    \"jQuery\": jQuery.noConflict(true)\n};\n\n(function($) {\n    \n    // dateformat\n    grappelli.getFormat = function(type) {\n        if (type == \"date\") {\n            var format = DATE_FORMAT.toLowerCase().replace(/%\\w/g, function(str) {\n                str = str.replace(/%/, '');\n                return str + str;\n            });\n            return format;\n        }\n    };\n    \n    // datepicker, timepicker init\n    grappelli.initDateAndTimePicker = function() {\n        \n        // HACK: get rid of text after DateField (hardcoded in django.admin)\n        $('p.datetime').each(function() {\n            var text = $(this).html();\n            text = text.replace(/^\\w*: /, \"\");\n            text = text.replace(/<br>.*: /, \"<br>\");\n            $(this).html(text);\n        });\n        \n        var options = {\n            //appendText: '(mm/dd/yyyy)',\n            showOn: 'button',\n            buttonImageOnly: false,\n            buttonText: '',\n            dateFormat: grappelli.getFormat('date'),\n            showButtonPanel: true,\n            showAnim: '',\n            // HACK: sets the current instance to a global var.\n            // needed to actually select today if the today-button is clicked.\n            // see onClick handler for \".ui-datepicker-current\"\n            beforeShow: function(year, month, inst) {\n                grappelli.datepicker_instance = this;\n            }\n        };\n        var dateFields = $(\"input[class*='vDateField']:not([id*='__prefix__'])\");\n        dateFields.datepicker(options);\n        \n        if (typeof IS_POPUP != \"undefined\" && IS_POPUP) {\n            dateFields.datepicker('disable');\n        }\n        \n        // HACK: adds an event listener to the today button of datepicker\n        // if clicked today gets selected and datepicker hides.\n        // use live() because couldn't find hook after datepicker generates it's complete dom.\n        $(\".ui-datepicker-current\").live('click', function() {\n            $.datepicker._selectDate(grappelli.datepicker_instance);\n            grappelli.datepicker_instance = null;\n        });\n        \n        // init timepicker\n        $(\"input[class*='vTimeField']:not([id*='__prefix__'])\").grp_timepicker();\n    };\n    \n    // changelist: filter\n    grappelli.initFilter = function() {\n        $(\"a.toggle-filters\").click(function() {\n            $(\".filter-pulldown\").toggle();\n            $(\"#filters\").toggleClass(\"open\");\n        });\n        $(\".filter_choice\").change(function(){\n            location.href = $(this).val();\n        });\n    };\n    \n    // changelist: searchbar\n    grappelli.initSearchbar = function() {\n        var searchbar = $(\"input#searchbar\");\n        searchbar.focus();\n    };\n    \n    grappelli.updateSelectFilter = function(form) {\n        if (typeof SelectFilter != \"undefined\"){\n            form.find(\".selectfilter\").each(function(index, value){\n                var namearr = value.name.split('-');\n                SelectFilter.init(value.id, namearr[namearr.length-1], false, \"{% admin_media_prefix %}\");\n            });\n            form.find(\".selectfilterstacked\").each(function(index, value){\n                var namearr = value.name.split('-');\n                SelectFilter.init(value.id, namearr[namearr.length-1], true, \"{% admin_media_prefix %}\");\n            });\n        }\n    };\n    \n    grappelli.reinitDateTimeFields = function(form) {\n        form.find(\".vDateField\").datepicker({\n            showOn: 'button',\n            buttonImageOnly: false,\n            buttonText: '',\n            dateFormat: grappelli.getFormat('date')\n        });\n        form.find(\".vTimeField\").grp_timepicker();\n    };\n    \n    // autocomplete helpers\n    grappelli.get_app_label = function(elem) {\n        var link = elem.next(\"a\");\n        if (link.length > 0) {\n            var url = link.attr('href').split('/');\n            return url[url.length-3];\n        }\n        return false;\n    };\n    grappelli.get_model_name = function(elem) {\n        var link = elem.next(\"a\");\n        if (link.length > 0) {\n            var url = link.attr('href').split('/');\n            return url[url.length-2];\n        }\n        return false;\n    };\n    grappelli.get_query_string = function(elem) {\n        var link = elem.next(\"a\");\n        if (link.length > 0) {\n            var url = link.attr('href').split('/');\n            return url[url.length-1].replace('?', '');\n        }\n        return false;\n    };\n    \n})(django.jQuery);\n\n"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_autocomplete_fk.js",
    "content": "/**\n * GRAPPELLI AUTOCOMPLETE FK\n * foreign-key lookup with autocomplete\n */\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_autocomplete_fk.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // remove djangos object representation (if given)\n                if ($this.next().next() && $this.next().next().attr(\"class\") != \"errorlist\") $this.next().next().remove();\n                // build autocomplete wrapper\n                $this.next().after(loader).after(remove_link($this.attr('id')));\n                $this.parent().wrapInner(\"<div class='autocomplete-wrapper-fk'></div>\");\n                $this.parent().prepend(\"<input id='\" + $this.attr(\"id\") + \"-autocomplete' type='text' class='vTextField' value='' />\");\n                // extend options\n                options = $.extend({\n                    wrapper_autocomplete: $this.parent(),\n                    input_field: $this.prev(),\n                    remove_link: $this.next().next().hide(),\n                    loader: $this.next().next().next().hide()\n                }, $.fn.grp_autocomplete_fk.defaults, options);\n                // lookup\n                lookup_id($this, options); // lookup when loading page\n                lookup_autocomplete($this, options); // autocomplete-handler\n                $this.bind(\"change focus keyup blur\", function() { // id-handler\n                    lookup_id($this, options);\n                });\n                // labels\n                $(\"label[for='\"+$this.attr('id')+\"']\").each(function() {\n                    $(this).attr(\"for\", $this.attr(\"id\")+\"-autocomplete\");\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_autocomplete_fk = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_autocomplete_fk');\n        };\n        return false;\n    };\n    \n    var loader = function() {\n        var loader = $('<div class=\"loader\">loader</div>');\n        return loader;\n    };\n    \n    var remove_link = function(id) {\n        var removelink = $('<a class=\"related-remove\"></a>');\n        removelink.attr('id', 'remove_'+id);\n        removelink.attr('href', 'javascript://');\n        removelink.attr('onClick', 'return removeRelatedObject(this);');\n        removelink.hover(function() {\n            $(this).parent().toggleClass(\"autocomplete-preremove\");\n        });\n        return removelink;\n    };\n    \n    var lookup_autocomplete = function(elem, options) {\n        options.wrapper_autocomplete.find(\"input:first\")\n            .autocomplete({\n                minLength: 1,\n                delay: 1000,\n                source: function(request, response) {\n                    $.ajax({\n                        url: options.autocomplete_lookup_url,\n                        dataType: 'json',\n                        data: \"term=\" + request.term + \"&app_label=\" + grappelli.get_app_label(elem) + \"&model_name=\" + grappelli.get_model_name(elem) + \"&query_string=\" + grappelli.get_query_string(elem),\n                        beforeSend: function (XMLHttpRequest) {\n                            options.loader.show();\n                        },\n                        success: function(data){\n                            response($.map(data, function(item) {\n                                return {label: item.label, value: item.value};\n                            }));\n                        },\n                        complete: function (XMLHttpRequest, textStatus) {\n                            options.loader.hide();\n                        }\n                    });\n                },\n                focus: function() { // prevent value inserted on focus\n                    return false;\n                },\n                select: function(event, ui) {\n                    options.input_field.val(ui.item.label);\n                    elem.val(ui.item.value);\n                    elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n                    return false;\n                }\n            })\n            .data(\"autocomplete\")._renderItem = function(ul,item) {\n                return $(\"<li></li>\")\n                    .data( \"item.autocomplete\", item )\n                    .append( \"<a>\" + item.label + \" (\" + item.value + \")\")\n                    .appendTo(ul);\n            };\n    };\n    \n    var lookup_id = function(elem, options) {\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            $.each(data, function(index) {\n                options.input_field.val(data[index].label);\n                elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n            });\n        });\n    };\n    \n    $.fn.grp_autocomplete_fk.defaults = {\n        autocomplete_lookup_url: '',\n        lookup_url: ''\n    };\n    \n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_autocomplete_generic.js",
    "content": "/**\n * GRAPPELLI AUTOCOMPLETE GENERIC\n * generic lookup with autocomplete\n */\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_autocomplete_generic.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // build autocomplete wrapper\n                if ($(options.content_type).val()) {\n                    $this.after(loader).after(remove_link($this.attr('id'))).after(lookup_link($this.attr(\"id\"),$(options.content_type).val()));\n                }\n                $this.parent().wrapInner(\"<div class='autocomplete-wrapper-fk'></div>\");\n                $this.parent().prepend(\"<input id='\" + $this.attr(\"id\") + \"-autocomplete' type='text' class='vTextField' value='' />\");\n                // defaults\n                options = $.extend({\n                    wrapper_autocomplete: $(this).parent(),\n                    input_field: $(this).prev(),\n                    remove_link: $this.next().next().hide(),\n                    loader: $this.next().next().next().hide()\n                }, $.fn.grp_autocomplete_generic.defaults, options);\n                // lookup\n                lookup_id($this, options);  // lookup when loading page\n                lookup_autocomplete($this, options);  // autocomplete-handler\n                $this.bind(\"change focus keyup blur\", function() {  // id-handler\n                    lookup_id($this, options);\n                });\n                $(options.content_type).bind(\"change\", function() {  // content-type-handler\n                    update_lookup($(this), options);\n                });\n                // labels\n                $(\"label[for='\"+$this.attr('id')+\"']\").each(function() {\n                    $(this).attr(\"for\", $this.attr(\"id\")+\"-autocomplete\");\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_autocomplete_generic = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_autocomplete_generic');\n        };\n        return false;\n    };\n    \n    var loader = function() {\n        var loader = $('<div class=\"loader\">loader</div>');\n        return loader;\n    };\n    \n    var remove_link = function(id) {\n        var removelink = $('<a class=\"related-remove\"></a>');\n        removelink.attr('id', 'remove_'+id);\n        removelink.attr('href', 'javascript://');\n        removelink.attr('onClick', 'return removeRelatedObject(this);');\n        removelink.hover(function() {\n            $(this).parent().toggleClass(\"autocomplete-preremove\");\n        });\n        return removelink;\n    };\n    \n    var lookup_link = function(id, val) {\n        var lookuplink = $('<a class=\"related-lookup\"></a>');\n        lookuplink.attr('id', 'lookup_'+id);\n        lookuplink.attr('href', \"../../../\" + MODEL_URL_ARRAY[val].app + \"/\" + MODEL_URL_ARRAY[val].model + '/?t=id');\n        lookuplink.attr('onClick', 'return showRelatedObjectLookupPopup(this);');\n        return lookuplink;\n    };\n    \n    var update_lookup = function(elem, options) {\n        var obj = $(options.object_id);\n        obj.val('');\n        obj.prev().val('');\n        obj.next().remove();\n        obj.next().remove();\n        obj.next().remove();\n        if ($(elem).val()) {\n            obj.after(loader).after(remove_link(obj.attr('id'))).after(lookup_link(obj.attr('id'),$(elem).val()));\n            options.remove_link = obj.next().next().hide();\n            options.loader = obj.next().next().next().hide();\n        }\n    };\n    \n    var lookup_autocomplete = function(elem, options) {\n        options.wrapper_autocomplete.find(\"input:first\")\n            .autocomplete({\n                minLength: 1,\n                delay: 1000,\n                source: function(request, response) {\n                    $.ajax({\n                        url: options.autocomplete_lookup_url,\n                        dataType: 'json',\n                        data: \"term=\" + request.term + \"&app_label=\" + grappelli.get_app_label(elem) + \"&model_name=\" + grappelli.get_model_name(elem) + \"&query_string=\" + grappelli.get_query_string(elem),\n                        beforeSend: function (XMLHttpRequest) {\n                            if ($(options.content_type).val()) {\n                                options.loader.show();\n                            } else {\n                                return false;\n                            }\n                        },\n                        success: function(data){\n                            response($.map(data, function(item) {\n                                return {label: item.label, value: item.value};\n                            }));\n                        },\n                        complete: function (XMLHttpRequest, textStatus) {\n                            options.loader.hide();\n                        }\n                    });\n                },\n                focus: function() { // prevent value inserted on focus\n                    return false;\n                },\n                select: function(event, ui) {\n                    options.input_field.val(ui.item.label);\n                    elem.val(ui.item.value);\n                    elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n                    return false;\n                }\n            })\n            .data(\"autocomplete\")._renderItem = function(ul,item) {\n                return $(\"<li></li>\")\n                    .data( \"item.autocomplete\", item )\n                    .append( \"<a>\" + item.label + \" (\" + item.value + \")\")\n                    .appendTo(ul);\n            };\n    };\n    \n    var lookup_id = function(elem, options) {\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            $.each(data, function(index) {\n                options.input_field.val(data[index].label);\n                elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n            });\n        });\n    };\n    \n    $.fn.grp_autocomplete_generic.defaults = {\n        autocomplete_lookup_url: '',\n        lookup_url: '',\n        content_type: '',\n        object_id: ''\n    };\n    \n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_autocomplete_m2m.js",
    "content": "/**\n * GRAPPELLI AUTOCOMPLETE M2M\n * many-to-many lookup with autocomplete\n */\n\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_autocomplete_m2m.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // build autocomplete wrapper\n                $this.next().after(loader).after(remove_link($this.attr('id')));\n                $this.parent().wrapInner(\"<div class='autocomplete-wrapper-m2m'></div>\");\n                //$this.parent().prepend(\"<ul class='search'><li class='search'><input id='\" + $this.attr(\"id\") + \"-autocomplete' type='text' class='vTextField' value='' /></li></ul>\").prepend(\"<ul class='repr'></ul>\");\n                $this.parent().prepend(\"<ul class='repr'><li class='search'><input id='\" + $this.attr(\"id\") + \"-autocomplete' type='text' class='vTextField' value='' /></li></ul>\");\n                // defaults\n                options = $.extend({\n                    wrapper_autocomplete: $this.parent(),\n                    wrapper_repr: $this.parent().find(\"ul.repr\"),\n                    wrapper_search: $this.parent().find(\"li.search\"),\n                    remove_link: $this.next().next().hide(),\n                    loader: $this.next().next().next().hide()\n                }, $.fn.grp_autocomplete_m2m.defaults, options);\n                // move errorlist outside the wrapper\n                if ($this.parent().find(\"ul.errorlist\")) {\n                    $this.parent().find(\"ul.errorlist\").detach().appendTo($this.parent().parent());\n                }\n                // lookup\n                lookup_id($this, options);  // lookup when loading page\n                lookup_autocomplete($this, options);  // autocomplete-handler\n                $this.bind(\"change focus keyup blur\", function() { // id-handler\n                    lookup_id($this, options);\n                });\n                // labels\n                $(\"label[for='\"+$this.attr('id')+\"']\").each(function() {\n                    $(this).attr(\"for\", $this.attr(\"id\")+\"-autocomplete\");\n                });\n                // click on div > focus input\n                options.wrapper_autocomplete.bind(\"click\", function() {\n                    options.wrapper_search.find(\"input:first\").focus();\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_autocomplete_m2m = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_autocomplete_m2m');\n        };\n        return false;\n    };\n    \n    var value_add = function(elem, value, options) {\n        var values = [];\n        if (elem.val()) values = elem.val().split(\",\");\n        values.push(value);\n        elem.val(values.join(\",\"));\n        return values.join(\",\");\n    };\n    \n    var value_remove = function(elem, position, options) {\n        var values = [];\n        if (elem.val()) values = elem.val().split(\",\");\n        values.splice(position,1);\n        elem.val(values.join(\",\"));\n        return values.join(\",\");\n    };\n    \n    var loader = function() {\n        var loader = $('<div class=\"loader\">loader</div>');\n        return loader;\n    };\n    \n    var remove_link = function(id) {\n        var removelink = $('<a class=\"related-remove\"></a>');\n        removelink.attr('id', 'remove_'+id);\n        removelink.attr('href', 'javascript://');\n        removelink.attr('onClick', 'return removeRelatedObject(this);');\n        removelink.hover(function() {\n            $(this).parent().toggleClass(\"autocomplete-preremove\");\n        });\n        return removelink;\n    };\n    \n    var repr_add = function(elem, label, options) {\n        var repr = $('<li class=\"repr\"></li>');\n        var removelink = $('<a class=\"m2m-remove\" href=\"javascript://\">' + label + '</a>');\n        repr.append(removelink);\n        repr.insertBefore(options.wrapper_search);\n        removelink.bind(\"click\", function(e) { // remove-handler\n            var pos = $(this).parent().parent().children(\"li\").index($(this).parent());\n            value_remove(elem, pos, options);\n            $(this).parent().remove();\n            elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n            e.stopPropagation(); // prevent focus on input\n        });\n        removelink.hover(function() {\n            $(this).parent().toggleClass(\"autocomplete-preremove\");\n        });\n    };\n    \n    var lookup_autocomplete = function(elem, options) {;\n        options.wrapper_search.find(\"input:first\")\n            .bind(\"keydown\", function(event) { // don't navigate away from the field on tab when selecting an item\n                if (event.keyCode === $.ui.keyCode.TAB && $(this).data(\"autocomplete\").menu.active) {\n                    event.preventDefault();\n                }\n            })\n            .bind(\"focus\", function() {\n                options.wrapper_autocomplete.addClass(\"state-focus\");\n            })\n            .bind(\"blur\", function() {\n                options.wrapper_autocomplete.removeClass(\"state-focus\");\n            })\n            .autocomplete({\n                minLength: 1,\n                delay: 1000,\n                position: {my: \"left top\", at: \"left bottom\", of: options.wrapper_autocomplete},\n                open: function(event, ui) {\n                    $(\".ui-menu\").width(options.wrapper_autocomplete.outerWidth()-6);\n                },\n                source: function(request, response) {\n                    $.ajax({\n                        url: options.autocomplete_lookup_url,\n                        dataType: 'json',\n                        data: \"term=\" + request.term + \"&app_label=\" + grappelli.get_app_label(elem) + \"&model_name=\" + grappelli.get_model_name(elem) + \"&query_string=\" + grappelli.get_query_string(elem),\n                        beforeSend: function (XMLHttpRequest) {\n                            options.loader.show();\n                        },\n                        success: function(data){\n                            response($.map(data, function(item) {\n                                return {label: item.label, value: item.value};\n                            }));\n                        },\n                        complete: function (XMLHttpRequest, textStatus) {\n                            options.loader.hide();\n                        }\n                    });\n                },\n                focus: function() { // prevent value inserted on focus\n                    return false;\n                },\n                select: function(event, ui) { // add repr, add value\n                    repr_add(elem, ui.item.label, options);\n                    value_add(elem, ui.item.value, options);\n                    elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n                    $(this).val(\"\").focus();\n                    return false;\n                }\n            })\n            .data(\"autocomplete\")._renderItem = function(ul,item) {\n                return $(\"<li></li>\")\n                    .data( \"item.autocomplete\", item )\n                    .append( \"<a>\" + item.label + \" (\" + item.value + \")\")\n                    .appendTo(ul);\n            };\n    };\n    \n    var lookup_id = function(elem, options) {\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            options.wrapper_repr.find(\"li.repr\").remove();\n            options.wrapper_search.find(\"input\").val(\"\");\n            $.each(data, function(index) {\n                repr_add(elem, data[index].label, options);\n            });\n            elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();\n        });\n    };\n\n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_collapsible.js",
    "content": "/**\n * GRAPPELLI COLLAPSIBLES\n * handles collapsibles,\n * excluding open/closing all elements\n * within a group.\n */\n\n(function($) {\n    $.fn.grp_collapsible = function(options){\n        var defaults = {\n            toggle_handler_slctr: \".collapse-handler:first\",\n            closed_css: \"closed\",\n            open_css: \"open\",\n            on_init: function() {},\n            on_toggle: function() {}\n        };\n        var opts = $.extend(defaults, options);\n        return this.each(function() {\n            _initialize($(this), opts);\n        });\n    };\n    var _initialize = function(elem, options) {\n        options.on_init(elem, options);\n        _register_handlers(elem, options);\n    };\n    var _register_handlers = function(elem, options) {\n        _register_toggle_handler(elem, options);\n    };\n    var _register_toggle_handler = function(elem, options) {\n        elem.children(options.toggle_handler_slctr).click(function() {\n            elem.toggleClass(options.closed_css).toggleClass(options.open_css);\n        });\n    };\n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_collapsible_group.js",
    "content": "/**\n * GRAPPELLI GROUP COLLAPSIBLES\n * handles open/closing of all elements\n * with tabular- and stacked-inlines.\n */\n\n(function($) {\n    $.fn.grp_collapsible_group = function(options){\n        var defaults = {\n            open_handler_slctr: \".open-handler\",\n            close_handler_slctr: \".close-handler\",\n            collapsible_container_slctr: \"div.collapse\",\n            closed_css: \"closed\",\n            open_css: \"open\",\n            on_init: function() {},\n            on_open: function() {},\n            on_close: function() {}\n        };\n        options = $.extend(defaults, options);\n        return this.each(function() {\n            _initialize($(this), options);\n        });\n    };\n    var _initialize = function(elem, options) {\n        options.on_init(elem, options);\n        _register_handlers(elem, options);\n    };\n    var _register_handlers = function(elem, options) {\n        _register_open_handler(elem, options);\n        _register_close_handler(elem, options);\n    };\n    var _register_open_handler = function(elem, options) {\n        elem.find(options.open_handler_slctr).each(function() {\n            $(this).click(function() {\n                options.on_open(elem, options);\n                elem.find(options.collapsible_container_slctr)\n                    .removeClass(options.closed_css)\n                    .addClass(options.open_css);\n                elem.removeClass(options.closed_css)\n                    .addClass(options.open_css);\n            });\n        });\n    };\n    var _register_close_handler = function(elem, options) {\n        elem.find(options.close_handler_slctr).each(function() {\n            $(this).click(function() {\n                options.on_close(elem, options);\n                elem.find(options.collapsible_container_slctr)\n                    .removeClass(options.open_css)\n                    .addClass(options.closed_css);\n            });\n        });\n    };\n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_inline.js",
    "content": "/**\n * GRAPPELLI INLINES\n * jquery-plugin for inlines (stacked and tabular)\n */\n\n\n(function($) {\n    $.fn.grp_inline = function(options) {\n        var defaults = {\n            prefix: \"form\",                         // The form prefix for your django formset\n            addText: \"add another\",                 // Text for the add link\n            deleteText: \"remove\",                   // Text for the delete link\n            addCssClass: \"add-handler\",             // CSS class applied to the add link\n            removeCssClass: \"remove-handler\",       // CSS class applied to the remove link\n            deleteCssClass: \"delete-handler\",       // CSS class applied to the delete link\n            emptyCssClass: \"empty-form\",            // CSS class applied to the empty row\n            formCssClass: \"dynamic-form\",           // CSS class applied to each form in a formset\n            predeleteCssClass: \"predelete\",\n            onBeforeInit: function(form) {},        // Function called before a form is initialized\n            onBeforeAdded: function(inline) {},     // Function called before a form is added\n            onBeforeRemoved: function(form) {},     // Function called before a form is removed\n            onBeforeDeleted: function(form) {},     // Function called before a form is deleted\n            onAfterInit: function(form) {},         // Function called after a form has been initialized\n            onAfterAdded: function(form) {},        // Function called after a form has been added\n            onAfterRemoved: function(inline) {},    // Function called after a form has been removed\n            onAfterDeleted: function(form) {}       // Function called after a form has been deleted\n        };\n        options = $.extend(defaults, options);\n        \n        return this.each(function() {\n            var inline = $(this); // the current inline node\n            var totalForms = inline.find(\"#id_\" + options.prefix + \"-TOTAL_FORMS\");\n            // set autocomplete to off in order to prevent the browser from keeping the current value after reload\n            totalForms.attr(\"autocomplete\", \"off\");\n            // init inline and add-buttons\n            initInlineForms(inline, options);\n            initAddButtons(inline, options);\n            // button handlers\n            addButtonHandler(inline.find(\"a.\" + options.addCssClass), options);\n            removeButtonHandler(inline.find(\"a.\" + options.removeCssClass), options);\n            deleteButtonHandler(inline.find(\"a.\" + options.deleteCssClass), options);\n        });\n    };\n    \n    updateFormIndex = function(elem, options, replace_regex, replace_with) {\n        elem.find(':input,span,table,iframe,label,a,ul,p,img').each(function() {\n            var node = $(this),\n                node_id = node.attr('id'),\n                node_name = node.attr('name'),\n                node_for = node.attr('for'),\n                node_href = node.attr(\"href\");\n            if (node_id) { node.attr('id', node_id.replace(replace_regex, replace_with)); }\n            if (node_name) { node.attr('name', node_name.replace(replace_regex, replace_with)); }\n            if (node_for) { node.attr('for', node_for.replace(replace_regex, replace_with)); }\n            if (node_href) { node.attr('href', node_href.replace(replace_regex, replace_with)); }\n        });\n    };\n    \n    initInlineForms = function(elem, options) {\n        elem.find(\"div.module\").each(function() {\n            var form = $(this);\n            // callback\n            options.onBeforeInit(form);\n            // add options.formCssClass to all forms in the inline\n            // except table/theader/add-item\n            if (form.attr('id') !== \"\") {\n                form.not(\".\" + options.emptyCssClass).not(\".table\").not(\".thead\").not(\".add-item\").addClass(options.formCssClass);\n            }\n            // add options.predeleteCssClass to forms with the delete checkbox checked\n            form.find(\"li.delete-handler-container input\").each(function() {\n                if ($(this).attr(\"checked\") && form.hasClass(\"has_original\")) {\n                    form.toggleClass(options.predeleteCssClass);\n                }\n            });\n            // callback\n            options.onAfterInit(form);\n        });\n    };\n    \n    initAddButtons = function(elem, options) {\n        var totalForms = elem.find(\"#id_\" + options.prefix + \"-TOTAL_FORMS\");\n        var maxForms = elem.find(\"#id_\" + options.prefix + \"-MAX_NUM_FORMS\");\n        var addButtons = elem.find(\"a.\" + options.addCssClass);\n        // hide add button in case we've hit the max, except we want to add infinitely\n        if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) {\n            hideAddBottons(elem, options);\n        }\n    };\n    \n    addButtonHandler = function(elem, options) {\n        elem.bind(\"click\", function() {\n            var inline = elem.parents(\"div.group\"),\n                totalForms = inline.find(\"#id_\" + options.prefix + \"-TOTAL_FORMS\"),\n                maxForms = inline.find(\"#id_\" + options.prefix + \"-MAX_NUM_FORMS\"),\n                addButtons = inline.find(\"a.\" + options.addCssClass),\n                empty_template = inline.find(\"#\" + options.prefix + \"-empty\");\n            // callback\n            options.onBeforeAdded(inline);\n            // create new form\n            var index = parseInt(totalForms.val(), 10),\n                form = empty_template.clone(true);\n            form.removeClass(options.emptyCssClass)\n                .attr(\"id\", empty_template.attr('id').replace(\"-empty\", index))\n                .insertBefore(empty_template)\n                .addClass(options.formCssClass);\n            // update form index\n            var re = /__prefix__/g;\n            updateFormIndex(form, options, re, index);\n            // update total forms\n            totalForms.val(index + 1);\n            // hide add button in case we've hit the max, except we want to add infinitely\n            if ((maxForms.val() !== 0) && (maxForms.val() != \"\") && (maxForms.val() - totalForms.val()) <= 0) {\n                hideAddBottons(inline, options);\n            }\n            // callback\n            options.onAfterAdded(form);\n        });\n    };\n    \n    removeButtonHandler = function(elem, options) {\n        elem.bind(\"click\", function() {\n            var inline = elem.parents(\"div.group\"),\n                form = $(this).parents(\".\" + options.formCssClass).first(),\n                totalForms = inline.find(\"#id_\" + options.prefix + \"-TOTAL_FORMS\"),\n                maxForms = inline.find(\"#id_\" + options.prefix + \"-MAX_NUM_FORMS\");\n            // callback\n            options.onBeforeRemoved(form);\n            // remove form\n            form.remove();\n            // update total forms\n            var index = parseInt(totalForms.val(), 10);\n            totalForms.val(index - 1);\n            // show add button in case we've dropped below max\n            if ((maxForms.val() !== 0) && (maxForms.val() - totalForms.val()) > 0) {\n                showAddButtons(inline, options);\n            }\n            // update form index (for all forms)\n            var re = /-\\d+-/g,\n                i = 0;\n            inline.find(\".\" + options.formCssClass).each(function() {\n                updateFormIndex($(this), options, re, \"-\" + i + \"-\");\n                i++;\n            });\n            // callback\n            options.onAfterRemoved(inline);\n        });\n    };\n    \n    deleteButtonHandler = function(elem, options) {\n        elem.bind(\"click\", function() {\n            var deleteInput = $(this).prev(),\n                form = $(this).parents(\".\" + options.formCssClass).first();\n            // callback\n            options.onBeforeDeleted(form);\n            // toggle options.predeleteCssClass and toggle checkbox\n            if (form.hasClass(\"has_original\")) {\n                form.toggleClass(options.predeleteCssClass);\n                if (deleteInput.attr(\"checked\")) {\n                    deleteInput.removeAttr(\"checked\");\n                } else {\n                    deleteInput.attr(\"checked\", 'checked');\n                }\n            }\n            // callback\n            options.onAfterDeleted(form);\n        });\n    };\n    \n    hideAddBottons = function(elem, options) {\n        var addButtons = elem.find(\"a.\" + options.addCssClass);\n        addButtons.hide().parents('div.add-item').hide();\n    };\n    \n    showAddButtons = function(elem, options) {\n        var addButtons = elem.find(\"a.\" + options.addCssClass);\n        addButtons.show().parents('div.add-item').show();\n    };\n    \n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_related_fk.js",
    "content": "/**\n * GRAPPELLI RELATED FK\n * foreign-key lookup\n */\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_related_fk.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // remove djangos object representation\n                if ($this.next().next() && $this.next().next().attr(\"class\") != \"errorlist\") {\n                    $this.next().next().remove();\n                }\n                // add placeholder\n                $this.next().after(options.placeholder);\n                // lookup\n                lookup_id($this, options); // lookup when loading page\n                $this.bind(\"change focus keyup blur\", function() { // id-handler\n                    lookup_id($this, options);\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_related_fk = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_related_fk');\n        };\n        return false;\n    };\n    \n    var lookup_id = function(elem, options) {\n        var text = elem.next().next();\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            text.text(data[0].label);\n        });\n    };\n    \n    $.fn.grp_related_fk.defaults = {\n        placeholder: '&nbsp;<strong></strong>',\n        repr_max_length: 30,\n        lookup_url: ''\n    };\n    \n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_related_generic.js",
    "content": "/**\n * GRAPPELLI RELATED FK\n * generic lookup\n */\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_related_generic.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // add placeholder\n                if ($(options.content_type).val()) {\n                    $this.after(options.placeholder).after(lookup_link($this.attr(\"id\"),$(options.content_type).val()));\n                }\n                // lookup\n                lookup_id($this, options); // lookup when loading page\n                $this.bind(\"change focus keyup blur\", function() { // id-handler\n                    lookup_id($this, options);\n                });\n                $(options.content_type).bind(\"change\", function() { // content-type-handler\n                    update_lookup($(this), options);\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_related_generic = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_related_generic');\n        };\n        return false;\n    };\n    \n    var lookup_link = function(id, val) {\n        var lookuplink = $('<a class=\"related-lookup\"></a>');\n        lookuplink.attr('id', 'lookup_'+id);\n        lookuplink.attr('href', \"../../../\" + MODEL_URL_ARRAY[val].app + \"/\" + MODEL_URL_ARRAY[val].model + '/?t=id');\n        lookuplink.attr('onClick', 'return showRelatedObjectLookupPopup(this);');\n        return lookuplink;\n    };\n    \n    var update_lookup = function(elem, options) {\n        var obj = $(options.object_id);\n        obj.val('');\n        obj.next().remove();\n        obj.next().remove();\n        if ($(elem).val()) {\n            obj.after(options.placeholder).after(lookup_link(obj.attr('id'),$(elem).val()));\n        }\n    };\n    \n    var lookup_id = function(elem, options) {\n        var text = elem.next().next();\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            text.text(data[0].label);\n        });\n    };\n    \n    $.fn.grp_related_generic.defaults = {\n        placeholder: '&nbsp;<strong></strong>',\n        repr_max_length: 30,\n        lookup_url: '',\n        content_type: '',\n        object_id: ''\n    };\n    \n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_related_m2m.js",
    "content": "/**\n * GRAPPELLI RELATED M2M\n * m2m lookup\n */\n\n(function($){\n    \n    var methods = {\n        init: function(options) {\n            options = $.extend({}, $.fn.grp_related_m2m.defaults, options);\n            return this.each(function() {\n                var $this = $(this);\n                // add placeholder\n                $this.next().after(options.placeholder);\n                // change lookup class\n                $this.next().addClass(\"m2m\");\n                // lookup\n                lookup_id($this, options); // lookup when loading page\n                $this.bind(\"change focus keyup blur\", function() { // id-handler\n                    lookup_id($this, options);\n                });\n            });\n        }\n    };\n    \n    $.fn.grp_related_m2m = function(method) {\n        if (methods[method]) {\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n        } else if (typeof method === 'object' || ! method) {\n            return methods.init.apply(this, arguments);\n        } else {\n            $.error('Method ' +  method + ' does not exist on jQuery.grp_related_m2m');\n        };\n        return false;\n    };\n    \n    var lookup_id = function(elem, options) {\n        $.getJSON(options.lookup_url, {\n            object_id: elem.val(),\n            app_label: grappelli.get_app_label(elem),\n            model_name: grappelli.get_model_name(elem)\n        }, function(data) {\n            values = $.map(data, function (a) { return a.label; });\n            elem.next().next().text(values.join(\", \"));\n        });\n    };\n    \n    $.fn.grp_related_m2m.defaults = {\n        placeholder: '&nbsp;<strong></strong>',\n        repr_max_length: 30,\n        lookup_url: ''\n    };\n    \n})(django.jQuery);"
  },
  {
    "path": "selfblog/static/admin/js/grappelli/jquery.grp_timepicker.js",
    "content": "/**\n * GRAPPELLI TIMEPICKER\n * works pretty similar to ui.datepicker:\n * adds a button to the element\n * creates a node (div) at the bottom called ui-timepicker\n * element.onClick fills the ui-timepicker node with the time_list (all times you can select)\n */\n\n(function($) {\n    $.widget(\"ui.grp_timepicker\", {\n        // default options\n        options: {\n            // template for the container of the timepicker\n            template: '<div id=\"ui-timepicker\" class=\"module\" style=\"position: absolute; display: none;\"></div>',\n            // selector to get the ui-timepicker once it's added to the dom\n            timepicker_selector: \"#ui-timepicker\",\n            // needed offset of the container from the element\n            offset: {\n                top: 0\n            },\n            // if time_list wasn't sent when calling the timepicker we use this\n            default_time_list: [\n                'now',\n                '00:00',\n                '01:00',\n                '02:00',\n                '03:00',\n                '04:00',\n                '05:00',\n                '06:00',\n                '07:00',\n                '08:00',\n                '09:00',\n                '10:00',\n                '11:00',\n                '12:00',\n                '13:00',\n                '14:00',\n                '15:00',\n                '16:00',\n                '17:00',\n                '18:00',\n                '19:00',\n                '20:00',\n                '21:00',\n                '22:00',\n                '23:00'\n            ],\n            // leave this empty!!!\n            // NOTE: you can't set a default for time_list because if you call:\n            // $(\"node\").timepicker({time_list: [\"01:00\", \"02:00\"]})\n            // ui.widget will extend/merge the options.time_list with the one you sent.\n            time_list: []\n        },\n        \n        // init timepicker for a specific element\n        _create: function() {\n            // for the events\n            var self = this;\n            \n            // to close timpicker if you click somewhere in the document\n            $(document).mousedown(function(evt) {\n                if (self.timepicker.is(\":visible\")) {\n                    var $target = $(evt.target);\n                    if ($target[0].id != self.timepicker[0].id && $target.parents(self.options.timepicker_selector).length === 0 && !$target.hasClass('hasTimepicker') && !$target.hasClass('ui-timepicker-trigger')) {\n                        self.timepicker.hide();\n                    }\n                }\n            });\n            \n            // get/create timepicker's container\n            if ($(this.options.timepicker_selector).size() === 0) {\n                $(this.options.template).appendTo('body');\n            }\n            this.timepicker = $(this.options.timepicker_selector);\n            this.timepicker.hide();\n            \n            // modify the element and create the button\n            this.element.addClass(\"hasTimepicker\");\n            this.button = $('<button type=\"button\" class=\"ui-timepicker-trigger\"></button>');\n            this.element.after(this.button);\n            \n            // disable button if element is disabled\n            if (this.element.attr(\"disabled\")) {\n                this.button.attr(\"disabled\", true);\n            } else {\n                // register event\n                this.button.click(function() {\n                    self._toggleTimepicker();\n                });\n            }\n        },\n        \n        // called when button is clicked\n        _toggleTimepicker: function() {\n            if (this.timepicker.is(\":visible\")) {\n                this.timepicker.hide();\n            } else {\n                this.element.focus();\n                this._generateTimepickerContents();\n                this._showTimepicker();\n            }\n        },\n        \n        // fills timepicker with time_list of element and shows it.\n        // called by _toggleTimepicker\n        _generateTimepickerContents: function() {\n            var self = this,\n                template_str = \"<ul>\";\n            \n            // there is no time_list for this instance so use the default one\n            if (this.options.time_list.length === 0) {\n                this.options.time_list = this.options.default_time_list;\n            }\n            \n            for (var i = 0; i < this.options.time_list.length; i++) {\n                if (this.options.time_list[i] == \"now\") {\n                    var now = new Date(),\n                        hours = now.getHours(),\n                        minutes = now.getMinutes();\n                    \n                    hours = ((hours < 10) ? \"0\" + hours : hours);\n                    minutes = ((minutes < 10) ? \"0\" + minutes : minutes);\n                    \n                    template_str += '<li class=\"ui-state-active row\">' + hours + \":\" + minutes + '</li>';\n                } else {\n                    template_str += '<li class=\"ui-state-default row\">' + this.options.time_list[i] + '</li>';\n                }\n            }\n            template_str += \"</ul>\";\n            \n            // fill timepicker container\n            this.timepicker.html(template_str);\n            \n            // click handler for items (times) in timepicker\n            this.timepicker.find('li').click(function() {\n                // remove active class from all items\n                $(this).parent().children('li').removeClass(\"ui-state-active\");\n                // mark clicked item as active\n                $(this).addClass(\"ui-state-active\");\n                // set the new value and hide the timepicker\n                self.element.val($(this).html());\n                self.timepicker.hide();\n            });\n        },\n        \n        // sets offset and shows timepicker container\n        _showTimepicker: function() {\n            this.timepicker_offset = this.element.offset();\n            this.timepicker_offset.top += this.element.outerHeight() + this.options.offset.top;\n            this.timepicker.css(this.timepicker_offset);\n            this.timepicker.show();\n        },\n        \n        destroy: function() {\n            $.Widget.prototype.destroy.apply(this, arguments); // default destroy\n            // now do other stuff particular to this widget\n        }\n        \n    });\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/inlines.js",
    "content": "/**\n * Django admin inlines\n *\n * Based on jQuery Formset 1.1\n * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)\n * @requires jQuery 1.2.6 or later\n *\n * Copyright (c) 2009, Stanislaus Madueke\n * All rights reserved.\n *\n * Spiced up with Code from Zain Memon's GSoC project 2009\n * and modified for Django by Jannis Leidel\n *\n * Licensed under the New BSD License\n * See: http://www.opensource.org/licenses/bsd-license.php\n */\n(function($) {\n\t$.fn.formset = function(opts) {\n\t\tvar options = $.extend({}, $.fn.formset.defaults, opts);\n\t\tvar updateElementIndex = function(el, prefix, ndx) {\n\t\t\tvar id_regex = new RegExp(\"(\" + prefix + \"-(\\\\d+|__prefix__))\");\n\t\t\tvar replacement = prefix + \"-\" + ndx;\n\t\t\tif ($(el).attr(\"for\")) {\n\t\t\t\t$(el).attr(\"for\", $(el).attr(\"for\").replace(id_regex, replacement));\n\t\t\t}\n\t\t\tif (el.id) {\n\t\t\t\tel.id = el.id.replace(id_regex, replacement);\n\t\t\t}\n\t\t\tif (el.name) {\n\t\t\t\tel.name = el.name.replace(id_regex, replacement);\n\t\t\t}\n\t\t};\n\t\tvar totalForms = $(\"#id_\" + options.prefix + \"-TOTAL_FORMS\").attr(\"autocomplete\", \"off\");\n\t\tvar nextIndex = parseInt(totalForms.val());\n\t\tvar maxForms = $(\"#id_\" + options.prefix + \"-MAX_NUM_FORMS\").attr(\"autocomplete\", \"off\");\n\t\t// only show the add button if we are allowed to add more items,\n        // note that max_num = None translates to a blank string.\n\t\tvar showAddButton = maxForms.val() == '' || (maxForms.val()-totalForms.val()) > 0;\n\t\t$(this).each(function(i) {\n\t\t\t$(this).not(\".\" + options.emptyCssClass).addClass(options.formCssClass);\n\t\t});\n\t\tif ($(this).length && showAddButton) {\n\t\t\tvar addButton;\n\t\t\tif ($(this).attr(\"tagName\") == \"TR\") {\n\t\t\t\t// If forms are laid out as table rows, insert the\n\t\t\t\t// \"add\" button in a new table row:\n\t\t\t\tvar numCols = this.eq(0).children().length;\n\t\t\t\t$(this).parent().append('<tr class=\"' + options.addCssClass + '\"><td colspan=\"' + numCols + '\"><a href=\"javascript:void(0)\">' + options.addText + \"</a></tr>\");\n\t\t\t\taddButton = $(this).parent().find(\"tr:last a\");\n\t\t\t} else {\n\t\t\t\t// Otherwise, insert it immediately after the last form:\n\t\t\t\t$(this).filter(\":last\").after('<div class=\"' + options.addCssClass + '\"><a href=\"javascript:void(0)\">' + options.addText + \"</a></div>\");\n\t\t\t\taddButton = $(this).filter(\":last\").next().find(\"a\");\n\t\t\t}\n\t\t\taddButton.click(function() {\n\t\t\t\tvar totalForms = $(\"#id_\" + options.prefix + \"-TOTAL_FORMS\");\n\t\t\t\tvar template = $(\"#\" + options.prefix + \"-empty\");\n\t\t\t\tvar row = template.clone(true);\n\t\t\t\trow.removeClass(options.emptyCssClass)\n\t\t\t\t    .addClass(options.formCssClass)\n\t\t\t\t    .attr(\"id\", options.prefix + \"-\" + nextIndex);\n\t\t\t\tif (row.is(\"tr\")) {\n\t\t\t\t\t// If the forms are laid out in table rows, insert\n\t\t\t\t\t// the remove button into the last table cell:\n\t\t\t\t\trow.children(\":last\").append('<div><a class=\"' + options.deleteCssClass +'\" href=\"javascript:void(0)\">' + options.deleteText + \"</a></div>\");\n\t\t\t\t} else if (row.is(\"ul\") || row.is(\"ol\")) {\n\t\t\t\t\t// If they're laid out as an ordered/unordered list,\n\t\t\t\t\t// insert an <li> after the last list item:\n\t\t\t\t\trow.append('<li><a class=\"' + options.deleteCssClass +'\" href=\"javascript:void(0)\">' + options.deleteText + \"</a></li>\");\n\t\t\t\t} else {\n\t\t\t\t\t// Otherwise, just insert the remove button as the\n\t\t\t\t\t// last child element of the form's container:\n\t\t\t\t\trow.children(\":first\").append('<span><a class=\"' + options.deleteCssClass + '\" href=\"javascript:void(0)\">' + options.deleteText + \"</a></span>\");\n\t\t\t\t}\n\t\t\t\trow.find(\"*\").each(function() {\n\t\t\t\t\tupdateElementIndex(this, options.prefix, totalForms.val());\n\t\t\t\t});\n\t\t\t\t// Insert the new form when it has been fully edited\n\t\t\t\trow.insertBefore($(template));\n\t\t\t\t// Update number of total forms\n\t\t\t\t$(totalForms).val(parseInt(totalForms.val()) + 1);\n\t\t\t\tnextIndex += 1;\n\t\t\t\t// Hide add button in case we've hit the max, except we want to add infinitely\n\t\t\t\tif ((maxForms.val() != '') && (maxForms.val()-totalForms.val()) <= 0) {\n\t\t\t\t\taddButton.parent().hide();\n\t\t\t\t}\n\t\t\t\t// The delete button of each row triggers a bunch of other things\n\t\t\t\trow.find(\"a.\" + options.deleteCssClass).click(function() {\n\t\t\t\t\t// Remove the parent form containing this button:\n\t\t\t\t\tvar row = $(this).parents(\".\" + options.formCssClass);\n\t\t\t\t\trow.remove();\n\t\t\t\t\tnextIndex -= 1;\n\t\t\t\t\t// If a post-delete callback was provided, call it with the deleted form:\n\t\t\t\t\tif (options.removed) {\n\t\t\t\t\t\toptions.removed(row);\n\t\t\t\t\t}\n\t\t\t\t\t// Update the TOTAL_FORMS form count.\n\t\t\t\t\tvar forms = $(\".\" + options.formCssClass);\n\t\t\t\t\t$(\"#id_\" + options.prefix + \"-TOTAL_FORMS\").val(forms.length);\n\t\t\t\t\t// Show add button again once we drop below max\n\t\t\t\t\tif ((maxForms.val() == '') || (maxForms.val()-forms.length) > 0) {\n\t\t\t\t\t\taddButton.parent().show();\n\t\t\t\t\t}\n\t\t\t\t\t// Also, update names and ids for all remaining form controls\n\t\t\t\t\t// so they remain in sequence:\n\t\t\t\t\tfor (var i=0, formCount=forms.length; i<formCount; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tupdateElementIndex($(forms).get(i), options.prefix, i);\n\t\t\t\t\t\t$(forms.get(i)).find(\"*\").each(function() {\n\t\t\t\t\t\t\tupdateElementIndex(this, options.prefix, i);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\t// If a post-add callback was supplied, call it with the added form:\n\t\t\t\tif (options.added) {\n\t\t\t\t\toptions.added(row);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t}\n\t/* Setup plugin defaults */\n\t$.fn.formset.defaults = {\n\t\tprefix: \"form\",\t\t\t\t\t// The form prefix for your django formset\n\t\taddText: \"add another\",\t\t\t// Text for the add link\n\t\tdeleteText: \"remove\",\t\t\t// Text for the delete link\n\t\taddCssClass: \"add-row\",\t\t\t// CSS class applied to the add link\n\t\tdeleteCssClass: \"delete-row\",\t// CSS class applied to the delete link\n\t\temptyCssClass: \"empty-row\",\t\t// CSS class applied to the empty row\n\t\tformCssClass: \"dynamic-form\",\t// CSS class applied to each form in a formset\n\t\tadded: null,\t\t\t\t\t// Function called each time a new form is added\n\t\tremoved: null\t\t\t\t\t// Function called each time a form is deleted\n\t}\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/jquery.init.js",
    "content": "// Puts the included jQuery into our own namespace\nvar django = {\n    \"jQuery\": jQuery.noConflict(true)\n};\n"
  },
  {
    "path": "selfblog/static/admin/js/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.4.2\n * http://jquery.com/\n *\n * Copyright 2010, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2010, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Sat Feb 13 22:33:48 2010 -0500\n */\n(function( window, undefined ) {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// (both of which we optimize for)\n\tquickExpr = /^[^<]*(<[\\w\\W]+>)[^>]*$|^#([\\w-]+)$/,\n\n\t// Is it a simple selector\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\trtrim = /^(\\s|\\u00A0)+|(\\s|\\u00A0)+$/g,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\t\n\t// Has the ready events already been bound?\n\treadyBound = false,\n\t\n\t// The functions to execute on DOM ready\n\treadyList = [],\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwnProperty = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\tindexOf = Array.prototype.indexOf;\n\njQuery.fn = jQuery.prototype = {\n\tinit: function( selector, context ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = \"body\";\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tmatch = quickExpr.exec( selector );\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tdoc = (context ? context.ownerDocument || context : document);\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\t\t\t\t\t\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(\"TAG\")\n\t\t\t} else if ( !context && /^\\w+$/.test( selector ) ) {\n\t\t\t\tthis.selector = selector;\n\t\t\t\tthis.context = document;\n\t\t\t\tselector = document.getElementsByTagName( selector );\n\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn (context || rootjQuery).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn jQuery( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif (selector.selector !== undefined) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.4.2\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\t\t\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + (this.selector ? \" \" : \"\") + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\t\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// If the DOM is already ready\n\t\tif ( jQuery.isReady ) {\n\t\t\t// Execute the function immediately\n\t\t\tfn.call( document, jQuery );\n\n\t\t// Otherwise, remember the function for later\n\t\t} else if ( readyList ) {\n\t\t\t// Add the function to the wait list\n\t\t\treadyList.push( fn );\n\t\t}\n\n\t\treturn this;\n\t},\n\t\n\teq: function( i ) {\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, +i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\t\n\tend: function() {\n\t\treturn this.prevObject || jQuery(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\t// copy reference to target object\n\tvar target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging object literal values or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {\n\t\t\t\t\tvar clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src\n\t\t\t\t\t\t: jQuery.isArray(copy) ? [] : {};\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\twindow.$ = _$;\n\n\t\tif ( deep ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\t\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\t\n\t// Handle when the DOM is ready\n\tready: function() {\n\t\t// Make sure that the DOM is not already loaded\n\t\tif ( !jQuery.isReady ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 13 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If there are functions bound, to execute\n\t\t\tif ( readyList ) {\n\t\t\t\t// Execute all of them\n\t\t\t\tvar fn, i = 0;\n\t\t\t\twhile ( (fn = readyList[ i++ ]) ) {\n\t\t\t\t\tfn.call( document, jQuery );\n\t\t\t\t}\n\n\t\t\t\t// Reset the list of functions\n\t\t\t\treadyList = null;\n\t\t\t}\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\t\n\tbindReady: function() {\n\t\tif ( readyBound ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyBound = true;\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\treturn jQuery.ready();\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\t\t\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent(\"onreadystatechange\", DOMContentLoaded);\n\t\t\t\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn toString.call(obj) === \"[object Function]\";\n\t},\n\n\tisArray: function( obj ) {\n\t\treturn toString.call(obj) === \"[object Array]\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || toString.call(obj) !== \"[object Object]\" || obj.nodeType || obj.setInterval ) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor\n\t\t\t&& !hasOwnProperty.call(obj, \"constructor\")\n\t\t\t&& !hasOwnProperty.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\t\t\n\t\treturn key === undefined || hasOwnProperty.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\t\n\terror: function( msg ) {\n\t\tthrow msg;\n\t},\n\t\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\t\t\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( /^[\\],:{}\\s]*$/.test(data.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, \"@\")\n\t\t\t.replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, \"]\")\n\t\t\t.replace(/(?:^|:|,)(?:\\s*\\[)+/g, \"\")) ) {\n\n\t\t\t// Try to use the native JSON parser first\n\t\t\treturn window.JSON && window.JSON.parse ?\n\t\t\t\twindow.JSON.parse( data ) :\n\t\t\t\t(new Function(\"return \" + data))();\n\n\t\t} else {\n\t\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t\t}\n\t},\n\n\tnoop: function() {},\n\n\t// Evalulates a script in a global context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test(data) ) {\n\t\t\t// Inspired by code by Andrea Giammarchi\n\t\t\t// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html\n\t\t\tvar head = document.getElementsByTagName(\"head\")[0] || document.documentElement,\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\tscript.type = \"text/javascript\";\n\n\t\t\tif ( jQuery.support.scriptEval ) {\n\t\t\t\tscript.appendChild( document.createTextNode( data ) );\n\t\t\t} else {\n\t\t\t\tscript.text = data;\n\t\t\t}\n\n\t\t\t// Use insertBefore instead of appendChild to circumvent an IE6 bug.\n\t\t\t// This arises when a base node is used (#2709).\n\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\thead.removeChild( script );\n\t\t}\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction(object);\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( var value = object[0];\n\t\t\t\t\ti < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t},\n\n\ttrim: function( text ) {\n\t\treturn (text || \"\").replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// The extra typeof function check is to prevent crashes\n\t\t\t// in Safari 2 (See: #3039)\n\t\t\tif ( array.length == null || typeof array === \"string\" || jQuery.isFunction(array) || (typeof array !== \"function\" && array.setInterval) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array ) {\n\t\tif ( array.indexOf ) {\n\t\t\treturn array.indexOf( elem );\n\t\t}\n\n\t\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\t\tif ( array[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length, j = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [];\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tif ( !inv !== !callback( elems[ i ], i ) ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar ret = [], value;\n\n\t\t// Go through the array, translating each of the items to their\n\t\t// new value (or values).\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\tif ( value != null ) {\n\t\t\t\tret[ ret.length ] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\tproxy: function( fn, proxy, thisObject ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tif ( typeof proxy === \"string\" ) {\n\t\t\t\tthisObject = fn;\n\t\t\t\tfn = thisObject[ proxy ];\n\t\t\t\tproxy = undefined;\n\n\t\t\t} else if ( proxy && !jQuery.isFunction( proxy ) ) {\n\t\t\t\tthisObject = proxy;\n\t\t\t\tproxy = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( !proxy && fn ) {\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( thisObject || this, arguments );\n\t\t\t};\n\t\t}\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tif ( fn ) {\n\t\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\t\t}\n\n\t\t// So proxy can be declared as an argument\n\t\treturn proxy;\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = /(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t\t/(opera)(?:.*version)?[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\n\t\t\t!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\\w.]+))?/.exec( ua ) ||\n\t\t  \t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tbrowser: {}\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\nif ( indexOf ) {\n\tjQuery.inArray = function( elem, array ) {\n\t\treturn indexOf.call( array, elem );\n\t};\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch( error ) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\nfunction evalScript( i, elem ) {\n\tif ( elem.src ) {\n\t\tjQuery.ajax({\n\t\t\turl: elem.src,\n\t\t\tasync: false,\n\t\t\tdataType: \"script\"\n\t\t});\n\t} else {\n\t\tjQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || \"\" );\n\t}\n\n\tif ( elem.parentNode ) {\n\t\telem.parentNode.removeChild( elem );\n\t}\n}\n\n// Mutifunctional method to get and set values to a collection\n// The value/s can be optionally by executed if its a function\nfunction access( elems, key, value, exec, fn, pass ) {\n\tvar length = elems.length;\n\t\n\t// Setting many attributes\n\tif ( typeof key === \"object\" ) {\n\t\tfor ( var k in key ) {\n\t\t\taccess( elems, k, key[k], exec, fn, value );\n\t\t}\n\t\treturn elems;\n\t}\n\t\n\t// Setting one attribute\n\tif ( value !== undefined ) {\n\t\t// Optionally, function values get executed if exec is true\n\t\texec = !pass && exec && jQuery.isFunction(value);\n\t\t\n\t\tfor ( var i = 0; i < length; i++ ) {\n\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t}\n\t\t\n\t\treturn elems;\n\t}\n\t\n\t// Getting an attribute\n\treturn length ? fn( elems[0], key ) : undefined;\n}\n\nfunction now() {\n\treturn (new Date).getTime();\n}\n(function() {\n\n\tjQuery.support = {};\n\n\tvar root = document.documentElement,\n\t\tscript = document.createElement(\"script\"),\n\t\tdiv = document.createElement(\"div\"),\n\t\tid = \"script\" + now();\n\n\tdiv.style.display = \"none\";\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n\tvar all = div.getElementsByTagName(\"*\"),\n\t\ta = div.getElementsByTagName(\"a\")[0];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn;\n\t}\n\n\tjQuery.support = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText insted)\n\t\tstyle: /red/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55$/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: div.getElementsByTagName(\"input\")[0].value === \"on\",\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: document.createElement(\"select\").appendChild( document.createElement(\"option\") ).selected,\n\n\t\tparentNode: div.removeChild( div.appendChild( document.createElement(\"div\") ) ).parentNode === null,\n\n\t\t// Will be defined later\n\t\tdeleteExpando: true,\n\t\tcheckClone: false,\n\t\tscriptEval: false,\n\t\tnoCloneEvent: true,\n\t\tboxModel: null\n\t};\n\n\tscript.type = \"text/javascript\";\n\ttry {\n\t\tscript.appendChild( document.createTextNode( \"window.\" + id + \"=1;\" ) );\n\t} catch(e) {}\n\n\troot.insertBefore( script, root.firstChild );\n\n\t// Make sure that the execution of code works by injecting a script\n\t// tag with appendChild/createTextNode\n\t// (IE doesn't support this, fails, and uses .text instead)\n\tif ( window[ id ] ) {\n\t\tjQuery.support.scriptEval = true;\n\t\tdelete window[ id ];\n\t}\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete script.test;\n\t\n\t} catch(e) {\n\t\tjQuery.support.deleteExpando = false;\n\t}\n\n\troot.removeChild( script );\n\n\tif ( div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent(\"onclick\", function click() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tjQuery.support.noCloneEvent = false;\n\t\t\tdiv.detachEvent(\"onclick\", click);\n\t\t});\n\t\tdiv.cloneNode(true).fireEvent(\"onclick\");\n\t}\n\n\tdiv = document.createElement(\"div\");\n\tdiv.innerHTML = \"<input type='radio' name='radiotest' checked='checked'/>\";\n\n\tvar fragment = document.createDocumentFragment();\n\tfragment.appendChild( div.firstChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tjQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;\n\n\t// Figure out if the W3C box model works as expected\n\t// document.body must exist before we can do this\n\tjQuery(function() {\n\t\tvar div = document.createElement(\"div\");\n\t\tdiv.style.width = div.style.paddingLeft = \"1px\";\n\n\t\tdocument.body.appendChild( div );\n\t\tjQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;\n\t\tdocument.body.removeChild( div ).style.display = 'none';\n\n\t\tdiv = null;\n\t});\n\n\t// Technique from Juriy Zaytsev\n\t// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/\n\tvar eventSupported = function( eventName ) { \n\t\tvar el = document.createElement(\"div\"); \n\t\teventName = \"on\" + eventName; \n\n\t\tvar isSupported = (eventName in el); \n\t\tif ( !isSupported ) { \n\t\t\tel.setAttribute(eventName, \"return;\"); \n\t\t\tisSupported = typeof el[eventName] === \"function\"; \n\t\t} \n\t\tel = null; \n\n\t\treturn isSupported; \n\t};\n\t\n\tjQuery.support.submitBubbles = eventSupported(\"submit\");\n\tjQuery.support.changeBubbles = eventSupported(\"change\");\n\n\t// release memory in IE\n\troot = script = div = all = a = null;\n})();\n\njQuery.props = {\n\t\"for\": \"htmlFor\",\n\t\"class\": \"className\",\n\treadonly: \"readOnly\",\n\tmaxlength: \"maxLength\",\n\tcellspacing: \"cellSpacing\",\n\trowspan: \"rowSpan\",\n\tcolspan: \"colSpan\",\n\ttabindex: \"tabIndex\",\n\tusemap: \"useMap\",\n\tframeborder: \"frameBorder\"\n};\nvar expando = \"jQuery\" + now(), uuid = 0, windowData = {};\n\njQuery.extend({\n\tcache: {},\n\t\n\texpando:expando,\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t\"object\": true,\n\t\t\"applet\": true\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\treturn;\n\t\t}\n\n\t\telem = elem == window ?\n\t\t\twindowData :\n\t\t\telem;\n\n\t\tvar id = elem[ expando ], cache = jQuery.cache, thisCache;\n\n\t\tif ( !id && typeof name === \"string\" && data === undefined ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Compute a unique ID for the element\n\t\tif ( !id ) { \n\t\t\tid = ++uuid;\n\t\t}\n\n\t\t// Avoid generating a new cache unless none exists and we\n\t\t// want to manipulate it.\n\t\tif ( typeof name === \"object\" ) {\n\t\t\telem[ expando ] = id;\n\t\t\tthisCache = cache[ id ] = jQuery.extend(true, {}, name);\n\n\t\t} else if ( !cache[ id ] ) {\n\t\t\telem[ expando ] = id;\n\t\t\tcache[ id ] = {};\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// Prevent overriding the named cache with undefined values\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ name ] = data;\n\t\t}\n\n\t\treturn typeof name === \"string\" ? thisCache[ name ] : thisCache;\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\treturn;\n\t\t}\n\n\t\telem = elem == window ?\n\t\t\twindowData :\n\t\t\telem;\n\n\t\tvar id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];\n\n\t\t// If we want to remove a specific section of the element's data\n\t\tif ( name ) {\n\t\t\tif ( thisCache ) {\n\t\t\t\t// Remove the section of cache data\n\t\t\t\tdelete thisCache[ name ];\n\n\t\t\t\t// If we've removed all the data, remove the element's cache\n\t\t\t\tif ( jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\t\tjQuery.removeData( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Otherwise, we want to remove all of the element's data\n\t\t} else {\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t}\n\n\t\t\t// Completely remove the data cache\n\t\t\tdelete cache[ id ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tif ( typeof key === \"undefined\" && this.length ) {\n\t\t\treturn jQuery.data( this[0] );\n\n\t\t} else if ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tvar parts = key.split(\".\");\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\n\t\tif ( value === undefined ) {\n\t\t\tvar data = this.triggerHandler(\"getData\" + parts[1] + \"!\", [parts[0]]);\n\n\t\t\tif ( data === undefined && this.length ) {\n\t\t\t\tdata = jQuery.data( this[0], key );\n\t\t\t}\n\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\tdata;\n\t\t} else {\n\t\t\treturn this.trigger(\"setData\" + parts[1] + \"!\", [parts[0], value]).each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t});\n\t\t}\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttype = (type || \"fx\") + \"queue\";\n\t\tvar q = jQuery.data( elem, type );\n\n\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\tif ( !data ) {\n\t\t\treturn q || [];\n\t\t}\n\n\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\tq = jQuery.data( elem, type, jQuery.makeArray(data) );\n\n\t\t} else {\n\t\t\tq.push( data );\n\t\t}\n\n\t\treturn q;\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ), fn = queue.shift();\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift(\"inprogress\");\n\t\t\t}\n\n\t\t\tfn.call(elem, function() {\n\t\t\t\tjQuery.dequeue(elem, type);\n\t\t\t});\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t}\n\n\t\tif ( data === undefined ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\t\treturn this.each(function( i, elem ) {\n\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function() {\n\t\t\tvar elem = this;\n\t\t\tsetTimeout(function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, time );\n\t\t});\n\t},\n\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t}\n});\nvar rclass = /[\\n\\t]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trspecialurl = /href|src|style/,\n\trtype = /(button|input)/i,\n\trfocusable = /(button|input|object|select|textarea)/i,\n\trclickable = /^(a|area)$/i,\n\trradiocheck = /radio|checkbox/;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, name, value, true, jQuery.attr );\n\t},\n\n\tremoveAttr: function( name, fn ) {\n\t\treturn this.each(function(){\n\t\t\tjQuery.attr( this, name, \"\" );\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.removeAttribute( name );\n\t\t\t}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.addClass( value.call(this, i, self.attr(\"class\")) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tvar classNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar className = \" \" + elem.className + \" \", setClass = elem.className;\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( className.indexOf( \" \" + classNames[c] + \" \" ) < 0 ) {\n\t\t\t\t\t\t\t\tsetClass += \" \" + classNames[c];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.removeClass( value.call(this, i, self.attr(\"class\")) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tvar classNames = (value || \"\").split(rspace);\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tvar className = (\" \" + elem.className + \" \").replace(rclass, \" \");\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[c] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value, isBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.toggleClass( value.call(this, i, self.attr(\"class\"), stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className, i = 0, self = jQuery(this),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery.data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery.data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \";\n\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\tif ( (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tif ( value === undefined ) {\n\t\t\tvar elem = this[0];\n\n\t\t\tif ( elem ) {\n\t\t\t\tif ( jQuery.nodeName( elem, \"option\" ) ) {\n\t\t\t\t\treturn (elem.attributes.value || {}).specified ? elem.value : elem.text;\n\t\t\t\t}\n\n\t\t\t\t// We need to handle select boxes special\n\t\t\t\tif ( jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\t\tvar index = elem.selectedIndex,\n\t\t\t\t\t\tvalues = [],\n\t\t\t\t\t\toptions = elem.options,\n\t\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t\t// Nothing was selected\n\t\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Loop through all the selected options\n\t\t\t\t\tfor ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {\n\t\t\t\t\t\tvar option = options[ i ];\n\n\t\t\t\t\t\tif ( option.selected ) {\n\t\t\t\t\t\t\t// Get the specifc value for the option\n\t\t\t\t\t\t\tvalue = jQuery(option).val();\n\n\t\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn values;\n\t\t\t\t}\n\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\tif ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {\n\t\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t\t}\n\t\t\t\t\n\n\t\t\t\t// Everything else, we just grab the value\n\t\t\t\treturn (elem.value || \"\").replace(rreturn, \"\");\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar isFunction = jQuery.isFunction(value);\n\n\t\treturn this.each(function(i) {\n\t\t\tvar self = jQuery(this), val = value;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call(this, i, self.val());\n\t\t\t}\n\n\t\t\t// Typecast each time if the value is a Function and the appended\n\t\t\t// value is therefore different each time.\n\t\t\tif ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t}\n\n\t\t\tif ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {\n\t\t\t\tthis.checked = jQuery.inArray( self.val(), val ) >= 0;\n\n\t\t\t} else if ( jQuery.nodeName( this, \"select\" ) ) {\n\t\t\t\tvar values = jQuery.makeArray(val);\n\n\t\t\t\tjQuery( \"option\", this ).each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\tthis.selectedIndex = -1;\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\t\t\n\tattr: function( elem, name, value, pass ) {\n\t\t// don't set attributes on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery(elem)[name](value);\n\t\t}\n\n\t\tvar notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),\n\t\t\t// Whether we are setting (or getting)\n\t\t\tset = value !== undefined;\n\n\t\t// Try to normalize/fix the name\n\t\tname = notxml && jQuery.props[ name ] || name;\n\n\t\t// Only do all the following if this is a node (faster for style)\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\t// These attributes require special treatment\n\t\t\tvar special = rspecialurl.test( name );\n\n\t\t\t// Safari mis-reports the default selected property of an option\n\t\t\t// Accessing the parent's selectedIndex property fixes it\n\t\t\tif ( name === \"selected\" && !jQuery.support.optSelected ) {\n\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.selectedIndex;\n\t\n\t\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If applicable, access the attribute via the DOM 0 way\n\t\t\tif ( name in elem && notxml && !special ) {\n\t\t\t\tif ( set ) {\n\t\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\t\tif ( name === \"type\" && rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ name ] = value;\n\t\t\t\t}\n\n\t\t\t\t// browsers index elements by id/name on forms, give priority to attributes.\n\t\t\t\tif ( jQuery.nodeName( elem, \"form\" ) && elem.getAttributeNode(name) ) {\n\t\t\t\t\treturn elem.getAttributeNode( name ).nodeValue;\n\t\t\t\t}\n\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tif ( name === \"tabIndex\" ) {\n\t\t\t\t\tvar attributeNode = elem.getAttributeNode( \"tabIndex\" );\n\n\t\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\t\tattributeNode.value :\n\t\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t\t0 :\n\t\t\t\t\t\t\tundefined;\n\t\t\t\t}\n\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\n\t\t\tif ( !jQuery.support.style && notxml && name === \"style\" ) {\n\t\t\t\tif ( set ) {\n\t\t\t\t\telem.style.cssText = \"\" + value;\n\t\t\t\t}\n\n\t\t\t\treturn elem.style.cssText;\n\t\t\t}\n\n\t\t\tif ( set ) {\n\t\t\t\t// convert the value to a string (all browsers do this but IE) see #1070\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t}\n\n\t\t\tvar attr = !jQuery.support.hrefNormalized && notxml && special ?\n\t\t\t\t\t// Some attributes require a special call on IE\n\t\t\t\t\telem.getAttribute( name, 2 ) :\n\t\t\t\t\telem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn attr === null ? undefined : attr;\n\t\t}\n\n\t\t// elem is actually elem.style ... set the style\n\t\t// Using attr for specific style information is now deprecated. Use style instead.\n\t\treturn jQuery.style( elem, name, value );\n\t}\n});\nvar rnamespaces = /\\.(.*)$/,\n\tfcleanup = function( nm ) {\n\t\treturn nm.replace(/[^\\w\\s\\.\\|`]/g, function( ch ) {\n\t\t\treturn \"\\\\\" + ch;\n\t\t});\n\t};\n\n/*\n * A number of helper functions used for managing events.\n * Many of the ideas behind this code originated from\n * Dean Edwards' addEvent library.\n */\njQuery.event = {\n\n\t// Bind an event to an element\n\t// Original by Dean Edwards\n\tadd: function( elem, types, handler, data ) {\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For whatever reason, IE has trouble passing the window object\n\t\t// around, causing it to be cloned in the process\n\t\tif ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {\n\t\t\telem = window;\n\t\t}\n\n\t\tvar handleObjIn, handleObj;\n\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t}\n\n\t\t// Make sure that the function being executed has a unique ID\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure\n\t\tvar elemData = jQuery.data( elem );\n\n\t\t// If no elemData is found then we must be trying to bind to one of the\n\t\t// banned noData elements\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar events = elemData.events = elemData.events || {},\n\t\t\teventHandle = elemData.handle, eventHandle;\n\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function() {\n\t\t\t\t// Handle the second event of a trigger and when\n\t\t\t\t// an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && !jQuery.event.triggered ?\n\t\t\t\t\tjQuery.event.handle.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t}\n\n\t\t// Add elem as a property of the handle function\n\t\t// This is to prevent a memory leak with non-native events in IE.\n\t\teventHandle.elem = elem;\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\tvar type, i = 0, namespaces;\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\thandleObj = handleObjIn ?\n\t\t\t\tjQuery.extend({}, handleObjIn) :\n\t\t\t\t{ handler: handler, data: data };\n\n\t\t\t// Namespaced event handlers\n\t\t\tif ( type.indexOf(\".\") > -1 ) {\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\t\t\t\thandleObj.namespace = namespaces.slice(0).sort().join(\".\");\n\n\t\t\t} else {\n\t\t\t\tnamespaces = [];\n\t\t\t\thandleObj.namespace = \"\";\n\t\t\t}\n\n\t\t\thandleObj.type = type;\n\t\t\thandleObj.guid = handler.guid;\n\n\t\t\t// Get the current list of functions bound to this event\n\t\t\tvar handlers = events[ type ],\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// Init the event handler queue\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\n\t\t\t\t// Check for a special event handler\n\t\t\t\t// Only use addEventListener/attachEvent if the special\n\t\t\t\t// events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ( special.add ) { \n\t\t\t\tspecial.add.call( elem, handleObj ); \n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the function to the element's handler list\n\t\t\thandlers.push( handleObj );\n\n\t\t\t// Keep track of which events have been used, for global triggering\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, pos ) {\n\t\t// don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,\n\t\t\telemData = jQuery.data( elem ),\n\t\t\tevents = elemData && elemData.events;\n\n\t\tif ( !elemData || !events ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// types is actually an event object here\n\t\tif ( types && types.type ) {\n\t\t\thandler = types.handler;\n\t\t\ttypes = types.type;\n\t\t}\n\n\t\t// Unbind all events for the element\n\t\tif ( !types || typeof types === \"string\" && types.charAt(0) === \".\" ) {\n\t\t\ttypes = types || \"\";\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tjQuery.event.remove( elem, type + types );\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).unbind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\torigType = type;\n\t\t\thandleObj = null;\n\t\t\tall = type.indexOf(\".\") < 0;\n\t\t\tnamespaces = [];\n\n\t\t\tif ( !all ) {\n\t\t\t\t// Namespaced event handlers\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\n\t\t\t\tnamespace = new RegExp(\"(^|\\\\.)\" + \n\t\t\t\t\tjQuery.map( namespaces.slice(0).sort(), fcleanup ).join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\")\n\t\t\t}\n\n\t\t\teventType = events[ type ];\n\n\t\t\tif ( !eventType ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !handler ) {\n\t\t\t\tfor ( var j = 0; j < eventType.length; j++ ) {\n\t\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tjQuery.event.remove( elem, origType, handleObj.handler, j );\n\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tfor ( var j = pos || 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( handler.guid === handleObj.guid ) {\n\t\t\t\t\t// remove the given handler for the given type\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tif ( pos == null ) {\n\t\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( pos != null ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// remove generic event handler if no more handlers exist\n\t\t\tif ( eventType.length === 0 || pos != null && eventType.length === 1 ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tremoveEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tret = null;\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tvar handle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\tdelete elemData.events;\n\t\t\tdelete elemData.handle;\n\n\t\t\tif ( jQuery.isEmptyObject( elemData ) ) {\n\t\t\t\tjQuery.removeData( elem );\n\t\t\t}\n\t\t}\n\t},\n\n\t// bubbling is internal\n\ttrigger: function( event, data, elem /*, bubbling */ ) {\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tbubbling = arguments[3];\n\n\t\tif ( !bubbling ) {\n\t\t\tevent = typeof event === \"object\" ?\n\t\t\t\t// jQuery.Event object\n\t\t\t\tevent[expando] ? event :\n\t\t\t\t// Object literal\n\t\t\t\tjQuery.extend( jQuery.Event(type), event ) :\n\t\t\t\t// Just the event type (string)\n\t\t\t\tjQuery.Event(type);\n\n\t\t\tif ( type.indexOf(\"!\") >= 0 ) {\n\t\t\t\tevent.type = type = type.slice(0, -1);\n\t\t\t\tevent.exclusive = true;\n\t\t\t}\n\n\t\t\t// Handle a global trigger\n\t\t\tif ( !elem ) {\n\t\t\t\t// Don't bubble custom events when global (to avoid too much overhead)\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t// Only trigger if we've ever bound an event for it\n\t\t\t\tif ( jQuery.event.global[ type ] ) {\n\t\t\t\t\tjQuery.each( jQuery.cache, function() {\n\t\t\t\t\t\tif ( this.events && this.events[type] ) {\n\t\t\t\t\t\t\tjQuery.event.trigger( event, data, this.handle.elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle triggering a single element\n\n\t\t\t// don't do events on text and comment nodes\n\t\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Clean up in case it is reused\n\t\t\tevent.result = undefined;\n\t\t\tevent.target = elem;\n\n\t\t\t// Clone the incoming data, if any\n\t\t\tdata = jQuery.makeArray( data );\n\t\t\tdata.unshift( event );\n\t\t}\n\n\t\tevent.currentTarget = elem;\n\n\t\t// Trigger the event, it is assumed that \"handle\" is a function\n\t\tvar handle = jQuery.data( elem, \"handle\" );\n\t\tif ( handle ) {\n\t\t\thandle.apply( elem, data );\n\t\t}\n\n\t\tvar parent = elem.parentNode || elem.ownerDocument;\n\n\t\t// Trigger an inline bound script\n\t\ttry {\n\t\t\tif ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {\n\t\t\t\tif ( elem[ \"on\" + type ] && elem[ \"on\" + type ].apply( elem, data ) === false ) {\n\t\t\t\t\tevent.result = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// prevent IE from throwing an error for some elements with some event types, see #3533\n\t\t} catch (e) {}\n\n\t\tif ( !event.isPropagationStopped() && parent ) {\n\t\t\tjQuery.event.trigger( event, data, parent, true );\n\n\t\t} else if ( !event.isDefaultPrevented() ) {\n\t\t\tvar target = event.target, old,\n\t\t\t\tisClick = jQuery.nodeName(target, \"a\") && type === \"click\",\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tif ( (!special._default || special._default.call( elem, event ) === false) && \n\t\t\t\t!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {\n\n\t\t\t\ttry {\n\t\t\t\t\tif ( target[ type ] ) {\n\t\t\t\t\t\t// Make sure that we don't accidentally re-trigger the onFOO events\n\t\t\t\t\t\told = target[ \"on\" + type ];\n\n\t\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\t\ttarget[ \"on\" + type ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.event.triggered = true;\n\t\t\t\t\t\ttarget[ type ]();\n\t\t\t\t\t}\n\n\t\t\t\t// prevent IE from throwing an error for some elements with some event types, see #3533\n\t\t\t\t} catch (e) {}\n\n\t\t\t\tif ( old ) {\n\t\t\t\t\ttarget[ \"on\" + type ] = old;\n\t\t\t\t}\n\n\t\t\t\tjQuery.event.triggered = false;\n\t\t\t}\n\t\t}\n\t},\n\n\thandle: function( event ) {\n\t\tvar all, handlers, namespaces, namespace, events;\n\n\t\tevent = arguments[0] = jQuery.event.fix( event || window.event );\n\t\tevent.currentTarget = this;\n\n\t\t// Namespaced event handlers\n\t\tall = event.type.indexOf(\".\") < 0 && !event.exclusive;\n\n\t\tif ( !all ) {\n\t\t\tnamespaces = event.type.split(\".\");\n\t\t\tevent.type = namespaces.shift();\n\t\t\tnamespace = new RegExp(\"(^|\\\\.)\" + namespaces.slice(0).sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t\t}\n\n\t\tvar events = jQuery.data(this, \"events\"), handlers = events[ event.type ];\n\n\t\tif ( events && handlers ) {\n\t\t\t// Clone the handlers to prevent manipulation\n\t\t\thandlers = handlers.slice(0);\n\n\t\t\tfor ( var j = 0, l = handlers.length; j < l; j++ ) {\n\t\t\t\tvar handleObj = handlers[ j ];\n\n\t\t\t\t// Filter the functions by class\n\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t// Pass in a reference to the handler function itself\n\t\t\t\t\t// So that we can later remove it\n\t\t\t\t\tevent.handler = handleObj.handler;\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\n\t\t\t\t\tvar ret = handleObj.handler.apply( this, arguments );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tevent.result = ret;\n\t\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( event.isImmediatePropagationStopped() ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tprops: \"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which\".split(\" \"),\n\n\tfix: function( event ) {\n\t\tif ( event[ expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// store a copy of the original event object\n\t\t// and \"clone\" to set read-only properties\n\t\tvar originalEvent = event;\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( var i = this.props.length, prop; i; ) {\n\t\t\tprop = this.props[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary\n\t\tif ( !event.target ) {\n\t\t\tevent.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either\n\t\t}\n\n\t\t// check if target is a textnode (safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Add relatedTarget, if necessary\n\t\tif ( !event.relatedTarget && event.fromElement ) {\n\t\t\tevent.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n\t\t}\n\n\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\tif ( event.pageX == null && event.clientX != null ) {\n\t\t\tvar doc = document.documentElement, body = document.body;\n\t\t\tevent.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n\t\t\tevent.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);\n\t\t}\n\n\t\t// Add which for key events\n\t\tif ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {\n\t\t\tevent.which = event.charCode || event.keyCode;\n\t\t}\n\n\t\t// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)\n\t\tif ( !event.metaKey && event.ctrlKey ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t// Note: button is not normalized, so don't use it\n\t\tif ( !event.which && event.button !== undefined ) {\n\t\t\tevent.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));\n\t\t}\n\n\t\treturn event;\n\t},\n\n\t// Deprecated, use jQuery.guid instead\n\tguid: 1E8,\n\n\t// Deprecated, use jQuery.proxy instead\n\tproxy: jQuery.proxy,\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady,\n\t\t\tteardown: jQuery.noop\n\t\t},\n\n\t\tlive: {\n\t\t\tadd: function( handleObj ) {\n\t\t\t\tjQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); \n\t\t\t},\n\n\t\t\tremove: function( handleObj ) {\n\t\t\t\tvar remove = true,\n\t\t\t\t\ttype = handleObj.origType.replace(rnamespaces, \"\");\n\t\t\t\t\n\t\t\t\tjQuery.each( jQuery.data(this, \"events\").live || [], function() {\n\t\t\t\t\tif ( type === this.origType.replace(rnamespaces, \"\") ) {\n\t\t\t\t\t\tremove = false;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif ( remove ) {\n\t\t\t\t\tjQuery.event.remove( this, handleObj.origType, liveHandler );\n\t\t\t\t}\n\t\t\t}\n\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( this.setInterval ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\telem.removeEventListener( type, handle, false );\n\t} : \n\tfunction( elem, type, handle ) {\n\t\telem.detachEvent( \"on\" + type, handle );\n\t};\n\njQuery.Event = function( src ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !this.preventDefault ) {\n\t\treturn new jQuery.Event( src );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// timeStamp is buggy for some events on Firefox(#3843)\n\t// So we won't rely on the native value\n\tthis.timeStamp = now();\n\n\t// Mark it as fixed\n\tthis[ expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\te.returnValue = false;\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Checks if an event happened on an element within another element\n// Used in jQuery.event.special.mouseenter and mouseleave handlers\nvar withinElement = function( event ) {\n\t// Check if mouse(over|out) are still within the same parent element\n\tvar parent = event.relatedTarget;\n\n\t// Firefox sometimes assigns relatedTarget a XUL element\n\t// which we cannot access the parentNode property of\n\ttry {\n\t\t// Traverse up the tree\n\t\twhile ( parent && parent !== this ) {\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\tif ( parent !== this ) {\n\t\t\t// set the correct event type\n\t\t\tevent.type = event.data;\n\n\t\t\t// handle event if we actually just moused on to a non sub-element\n\t\t\tjQuery.event.handle.apply( this, arguments );\n\t\t}\n\n\t// assuming we've left the element since we most likely mousedover a xul element\n\t} catch(e) { }\n},\n\n// In case of event delegation, we only need to rename the event.type,\n// liveHandler will take care of the rest.\ndelegate = function( event ) {\n\tevent.type = event.data;\n\tjQuery.event.handle.apply( this, arguments );\n};\n\n// Create mouseenter and mouseleave events\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tsetup: function( data ) {\n\t\t\tjQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );\n\t\t},\n\t\tteardown: function( data ) {\n\t\t\tjQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );\n\t\t}\n\t};\n});\n\n// submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( this.nodeName.toLowerCase() !== \"form\" ) {\n\t\t\t\tjQuery.event.add(this, \"click.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target, type = elem.type;\n\n\t\t\t\t\tif ( (type === \"submit\" || type === \"image\") && jQuery( elem ).closest(\"form\").length ) {\n\t\t\t\t\t\treturn trigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\t \n\t\t\t\tjQuery.event.add(this, \"keypress.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target, type = elem.type;\n\n\t\t\t\t\tif ( (type === \"text\" || type === \"password\") && jQuery( elem ).closest(\"form\").length && e.keyCode === 13 ) {\n\t\t\t\t\t\treturn trigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialSubmit\" );\n\t\t}\n\t};\n\n}\n\n// change delegation, happens here so we have bind.\nif ( !jQuery.support.changeBubbles ) {\n\n\tvar formElems = /textarea|input|select/i,\n\n\tchangeFilters,\n\n\tgetVal = function( elem ) {\n\t\tvar type = elem.type, val = elem.value;\n\n\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\tval = elem.checked;\n\n\t\t} else if ( type === \"select-multiple\" ) {\n\t\t\tval = elem.selectedIndex > -1 ?\n\t\t\t\tjQuery.map( elem.options, function( elem ) {\n\t\t\t\t\treturn elem.selected;\n\t\t\t\t}).join(\"-\") :\n\t\t\t\t\"\";\n\n\t\t} else if ( elem.nodeName.toLowerCase() === \"select\" ) {\n\t\t\tval = elem.selectedIndex;\n\t\t}\n\n\t\treturn val;\n\t},\n\n\ttestChange = function testChange( e ) {\n\t\tvar elem = e.target, data, val;\n\n\t\tif ( !formElems.test( elem.nodeName ) || elem.readOnly ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdata = jQuery.data( elem, \"_change_data\" );\n\t\tval = getVal(elem);\n\n\t\t// the current data will be also retrieved by beforeactivate\n\t\tif ( e.type !== \"focusout\" || elem.type !== \"radio\" ) {\n\t\t\tjQuery.data( elem, \"_change_data\", val );\n\t\t}\n\t\t\n\t\tif ( data === undefined || val === data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( data != null || val ) {\n\t\t\te.type = \"change\";\n\t\t\treturn jQuery.event.trigger( e, arguments[1], elem );\n\t\t}\n\t};\n\n\tjQuery.event.special.change = {\n\t\tfilters: {\n\t\t\tfocusout: testChange, \n\n\t\t\tclick: function( e ) {\n\t\t\t\tvar elem = e.target, type = elem.type;\n\n\t\t\t\tif ( type === \"radio\" || type === \"checkbox\" || elem.nodeName.toLowerCase() === \"select\" ) {\n\t\t\t\t\treturn testChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Change has to be called before submit\n\t\t\t// Keydown will be called before keypress, which is used in submit-event delegation\n\t\t\tkeydown: function( e ) {\n\t\t\t\tvar elem = e.target, type = elem.type;\n\n\t\t\t\tif ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== \"textarea\") ||\n\t\t\t\t\t(e.keyCode === 32 && (type === \"checkbox\" || type === \"radio\")) ||\n\t\t\t\t\ttype === \"select-multiple\" ) {\n\t\t\t\t\treturn testChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Beforeactivate happens also before the previous element is blurred\n\t\t\t// with this event you can't trigger a change event, but you can store\n\t\t\t// information/focus[in] is not needed anymore\n\t\t\tbeforeactivate: function( e ) {\n\t\t\t\tvar elem = e.target;\n\t\t\t\tjQuery.data( elem, \"_change_data\", getVal(elem) );\n\t\t\t}\n\t\t},\n\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( this.type === \"file\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor ( var type in changeFilters ) {\n\t\t\t\tjQuery.event.add( this, type + \".specialChange\", changeFilters[type] );\n\t\t\t}\n\n\t\t\treturn formElems.test( this.nodeName );\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialChange\" );\n\n\t\t\treturn formElems.test( this.nodeName );\n\t\t}\n\t};\n\n\tchangeFilters = jQuery.event.special.change.filters;\n}\n\nfunction trigger( type, elem, args ) {\n\targs[0].type = type;\n\treturn jQuery.event.handle.apply( elem, args );\n}\n\n// Create \"bubbling\" focus and blur events\nif ( document.addEventListener ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tthis.addEventListener( orig, handler, true );\n\t\t\t}, \n\t\t\tteardown: function() { \n\t\t\t\tthis.removeEventListener( orig, handler, true );\n\t\t\t}\n\t\t};\n\n\t\tfunction handler( e ) { \n\t\t\te = jQuery.event.fix( e );\n\t\t\te.type = fix;\n\t\t\treturn jQuery.event.handle.call( this, e );\n\t\t}\n\t});\n}\n\njQuery.each([\"bind\", \"one\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( type, data, fn ) {\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis[ name ](key, data, type[key], fn);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\tvar handler = name === \"one\" ? jQuery.proxy( fn, function( event ) {\n\t\t\tjQuery( this ).unbind( event, handler );\n\t\t\treturn fn.apply( this, arguments );\n\t\t}) : fn;\n\n\t\tif ( type === \"unload\" && name !== \"one\" ) {\n\t\t\tthis.one( type, data, fn );\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( this[i], type, handler, data );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n});\n\njQuery.fn.extend({\n\tunbind: function( type, fn ) {\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" && !type.preventDefault ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis.unbind(key, type[key]);\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.remove( this[i], type, fn );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\t\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.live( types, data, fn, selector );\n\t},\n\t\n\tundelegate: function( selector, types, fn ) {\n\t\tif ( arguments.length === 0 ) {\n\t\t\t\treturn this.unbind( \"live\" );\n\t\t\n\t\t} else {\n\t\t\treturn this.die( types, null, fn, selector );\n\t\t}\n\t},\n\t\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\tvar event = jQuery.Event( type );\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tjQuery.event.trigger( event, data, this[0] );\n\t\t\treturn event.result;\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments, i = 1;\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\twhile ( i < args.length ) {\n\t\t\tjQuery.proxy( fn, args[ i++ ] );\n\t\t}\n\n\t\treturn this.click( jQuery.proxy( fn, function( event ) {\n\t\t\t// Figure out which function to execute\n\t\t\tvar lastToggle = ( jQuery.data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\tjQuery.data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t// Make sure that clicks stop\n\t\t\tevent.preventDefault();\n\n\t\t\t// and execute the function\n\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t}));\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\nvar liveMap = {\n\tfocus: \"focusin\",\n\tblur: \"focusout\",\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n};\n\njQuery.each([\"live\", \"die\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {\n\t\tvar type, i = 0, match, namespaces, preType,\n\t\t\tselector = origSelector || this.selector,\n\t\t\tcontext = origSelector ? this : jQuery( this.context );\n\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\ttypes = (types || \"\").split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) != null ) {\n\t\t\tmatch = rnamespaces.exec( type );\n\t\t\tnamespaces = \"\";\n\n\t\t\tif ( match )  {\n\t\t\t\tnamespaces = match[0];\n\t\t\t\ttype = type.replace( rnamespaces, \"\" );\n\t\t\t}\n\n\t\t\tif ( type === \"hover\" ) {\n\t\t\t\ttypes.push( \"mouseenter\" + namespaces, \"mouseleave\" + namespaces );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpreType = type;\n\n\t\t\tif ( type === \"focus\" || type === \"blur\" ) {\n\t\t\t\ttypes.push( liveMap[ type ] + namespaces );\n\t\t\t\ttype = type + namespaces;\n\n\t\t\t} else {\n\t\t\t\ttype = (liveMap[ type ] || type) + namespaces;\n\t\t\t}\n\n\t\t\tif ( name === \"live\" ) {\n\t\t\t\t// bind live handler\n\t\t\t\tcontext.each(function(){\n\t\t\t\t\tjQuery.event.add( this, liveConvert( type, selector ),\n\t\t\t\t\t\t{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\t// unbind live handler\n\t\t\t\tcontext.unbind( liveConvert( type, selector ), fn );\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn this;\n\t}\n});\n\nfunction liveHandler( event ) {\n\tvar stop, elems = [], selectors = [], args = arguments,\n\t\trelated, match, handleObj, elem, j, i, l, data,\n\t\tevents = jQuery.data( this, \"events\" );\n\n\t// Make sure we avoid non-left-click bubbling in Firefox (#3861)\n\tif ( event.liveFired === this || !events || !events.live || event.button && event.type === \"click\" ) {\n\t\treturn;\n\t}\n\n\tevent.liveFired = this;\n\n\tvar live = events.live.slice(0);\n\n\tfor ( j = 0; j < live.length; j++ ) {\n\t\thandleObj = live[j];\n\n\t\tif ( handleObj.origType.replace( rnamespaces, \"\" ) === event.type ) {\n\t\t\tselectors.push( handleObj.selector );\n\n\t\t} else {\n\t\t\tlive.splice( j--, 1 );\n\t\t}\n\t}\n\n\tmatch = jQuery( event.target ).closest( selectors, event.currentTarget );\n\n\tfor ( i = 0, l = match.length; i < l; i++ ) {\n\t\tfor ( j = 0; j < live.length; j++ ) {\n\t\t\thandleObj = live[j];\n\n\t\t\tif ( match[i].selector === handleObj.selector ) {\n\t\t\t\telem = match[i].elem;\n\t\t\t\trelated = null;\n\n\t\t\t\t// Those two events require additional checking\n\t\t\t\tif ( handleObj.preType === \"mouseenter\" || handleObj.preType === \"mouseleave\" ) {\n\t\t\t\t\trelated = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];\n\t\t\t\t}\n\n\t\t\t\tif ( !related || related !== elem ) {\n\t\t\t\t\telems.push({ elem: elem, handleObj: handleObj });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( i = 0, l = elems.length; i < l; i++ ) {\n\t\tmatch = elems[i];\n\t\tevent.currentTarget = match.elem;\n\t\tevent.data = match.handleObj.data;\n\t\tevent.handleObj = match.handleObj;\n\n\t\tif ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {\n\t\t\tstop = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn stop;\n}\n\nfunction liveConvert( type, selector ) {\n\treturn \"live.\" + (type && type !== \"*\" ? type + \".\" : \"\") + selector.replace(/\\./g, \"`\").replace(/ /g, \"&\");\n}\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( fn ) {\n\t\treturn fn ? this.bind( name, fn ) : this.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n});\n\n// Prevent memory leaks in IE\n// Window isn't included so as not to unbind existing unload events\n// More info:\n//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/\nif ( window.attachEvent && !window.addEventListener ) {\n\twindow.attachEvent(\"onunload\", function() {\n\t\tfor ( var id in jQuery.cache ) {\n\t\t\tif ( jQuery.cache[ id ].handle ) {\n\t\t\t\t// Try/Catch is to handle iframes being unloaded, see #4280\n\t\t\t\ttry {\n\t\t\t\t\tjQuery.event.remove( jQuery.cache[ id ].handle.elem );\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\t\t}\n\t});\n}\n/*!\n * Sizzle CSS Selector Engine - v1.0\n *  Copyright 2009, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^[\\]]*\\]|['\"][^'\"]*['\"]|[^[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function(){\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function(selector, context, results, seed) {\n\tresults = results || [];\n\tvar origContext = context = context || document;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\t\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),\n\t\tsoFar = selector;\n\t\n\t// Reset the position of the chunker regexp (start from head)\n\twhile ( (chunker.exec(\"\"), m = chunker.exec(soFar)) !== null ) {\n\t\tsoFar = m[3];\n\t\t\n\t\tparts.push( m[1] );\n\t\t\n\t\tif ( m[2] ) {\n\t\t\textra = m[3];\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context );\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tset = posProcess( selector, set );\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\t\t\tvar ret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tvar ret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\t\t\tset = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray(set);\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tvar cur = parts.pop(), pop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( var i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( var i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function(results){\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort(sortOrder);\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[i-1] ) {\n\t\t\t\t\tresults.splice(i--, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function(expr, set){\n\treturn Sizzle(expr, null, null, set);\n};\n\nSizzle.find = function(expr, context, isXML){\n\tvar set, match;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( var i = 0, l = Expr.order.length; i < l; i++ ) {\n\t\tvar type = Expr.order[i], match;\n\t\t\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tvar left = match[1];\n\t\t\tmatch.splice(1,1);\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace(/\\\\/g, \"\");\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = context.getElementsByTagName(\"*\");\n\t}\n\n\treturn {set: set, expr: expr};\n};\n\nSizzle.filter = function(expr, set, inplace, not){\n\tvar old = expr, result = [], curLoop = set, match, anyFound,\n\t\tisXMLFilter = set && set[0] && isXML(set[0]);\n\n\twhile ( expr && set.length ) {\n\t\tfor ( var type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tvar filter = Expr.filter[ type ], found, item, left = match[1];\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( var i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tvar pass = not ^ !!found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow \"Syntax error, unrecognized expression: \" + msg;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(['\"]*)(.*?)\\3|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\((even|odd|[\\dn+-]*)\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\tleftMatch: {},\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\tattrHandle: {\n\t\thref: function(elem){\n\t\t\treturn elem.getAttribute(\"href\");\n\t\t}\n\t},\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !/\\W/.test(part),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\t\t\">\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\";\n\n\t\t\tif ( isPartStr && !/\\W/.test(part) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\t\t\t\tvar elem = checkSet[i];\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\t\t\t\tvar elem = checkSet[i];\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar doneName = done++, checkFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !/\\W/.test(part) ) {\n\t\t\t\tvar nodeCheck = part = part.toLowerCase();\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn(\"parentNode\", part, doneName, checkSet, nodeCheck, isXML);\n\t\t},\n\t\t\"~\": function(checkSet, part, isXML){\n\t\t\tvar doneName = done++, checkFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !/\\W/.test(part) ) {\n\t\t\t\tvar nodeCheck = part = part.toLowerCase();\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn(\"previousSibling\", part, doneName, checkSet, nodeCheck, isXML);\n\t\t}\n\t},\n\tfind: {\n\t\tID: function(match, context, isXML){\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\treturn m ? [m] : [];\n\t\t\t}\n\t\t},\n\t\tNAME: function(match, context){\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [], results = context.getElementsByName(match[1]);\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\t\tTAG: function(match, context){\n\t\t\treturn context.getElementsByTagName(match[1]);\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function(match, curLoop, inplace, result, not, isXML){\n\t\t\tmatch = \" \" + match[1].replace(/\\\\/g, \"\") + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tID: function(match){\n\t\t\treturn match[1].replace(/\\\\/g, \"\");\n\t\t},\n\t\tTAG: function(match, curLoop){\n\t\t\treturn match[1].toLowerCase();\n\t\t},\n\t\tCHILD: function(match){\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)n((?:\\+|-)?\\d*)/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\t\tATTR: function(match, curLoop, inplace, result, not, isXML){\n\t\t\tvar name = match[1].replace(/\\\\/g, \"\");\n\t\t\t\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\t\tPSEUDO: function(match, curLoop, inplace, result, not){\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\treturn match;\n\t\t},\n\t\tPOS: function(match){\n\t\t\tmatch.unshift( true );\n\t\t\treturn match;\n\t\t}\n\t},\n\tfilters: {\n\t\tenabled: function(elem){\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\t\tdisabled: function(elem){\n\t\t\treturn elem.disabled === true;\n\t\t},\n\t\tchecked: function(elem){\n\t\t\treturn elem.checked === true;\n\t\t},\n\t\tselected: function(elem){\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\telem.parentNode.selectedIndex;\n\t\t\treturn elem.selected === true;\n\t\t},\n\t\tparent: function(elem){\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\t\tempty: function(elem){\n\t\t\treturn !elem.firstChild;\n\t\t},\n\t\thas: function(elem, i, match){\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\t\theader: function(elem){\n\t\t\treturn /h\\d/i.test( elem.nodeName );\n\t\t},\n\t\ttext: function(elem){\n\t\t\treturn \"text\" === elem.type;\n\t\t},\n\t\tradio: function(elem){\n\t\t\treturn \"radio\" === elem.type;\n\t\t},\n\t\tcheckbox: function(elem){\n\t\t\treturn \"checkbox\" === elem.type;\n\t\t},\n\t\tfile: function(elem){\n\t\t\treturn \"file\" === elem.type;\n\t\t},\n\t\tpassword: function(elem){\n\t\t\treturn \"password\" === elem.type;\n\t\t},\n\t\tsubmit: function(elem){\n\t\t\treturn \"submit\" === elem.type;\n\t\t},\n\t\timage: function(elem){\n\t\t\treturn \"image\" === elem.type;\n\t\t},\n\t\treset: function(elem){\n\t\t\treturn \"reset\" === elem.type;\n\t\t},\n\t\tbutton: function(elem){\n\t\t\treturn \"button\" === elem.type || elem.nodeName.toLowerCase() === \"button\";\n\t\t},\n\t\tinput: function(elem){\n\t\t\treturn /input|select|textarea|button/i.test(elem.nodeName);\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function(elem, i){\n\t\t\treturn i === 0;\n\t\t},\n\t\tlast: function(elem, i, match, array){\n\t\t\treturn i === array.length - 1;\n\t\t},\n\t\teven: function(elem, i){\n\t\t\treturn i % 2 === 0;\n\t\t},\n\t\todd: function(elem, i){\n\t\t\treturn i % 2 === 1;\n\t\t},\n\t\tlt: function(elem, i, match){\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\t\tgt: function(elem, i, match){\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\t\tnth: function(elem, i, match){\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\t\teq: function(elem, i, match){\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function(elem, match, i, array){\n\t\t\tvar name = match[1], filter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var i = 0, l = not.length; i < l; i++ ) {\n\t\t\t\t\tif ( not[i] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tSizzle.error( \"Syntax error, unrecognized expression: \" + name );\n\t\t\t}\n\t\t},\n\t\tCHILD: function(elem, match){\n\t\t\tvar type = match[1], node = elem;\n\t\t\tswitch (type) {\n\t\t\t\tcase 'only':\n\t\t\t\tcase 'first':\n\t\t\t\t\twhile ( (node = node.previousSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( type === \"first\" ) { \n\t\t\t\t\t\treturn true; \n\t\t\t\t\t}\n\t\t\t\t\tnode = elem;\n\t\t\t\tcase 'last':\n\t\t\t\t\twhile ( (node = node.nextSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\tcase 'nth':\n\t\t\t\t\tvar first = match[2], last = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar doneName = match[0],\n\t\t\t\t\t\tparent = elem.parentNode;\n\t\n\t\t\t\t\tif ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} \n\t\t\t\t\t\tparent.sizcache = doneName;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar diff = elem.nodeIndex - last;\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tID: function(elem, match){\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\t\tTAG: function(elem, match){\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;\n\t\t},\n\t\tCLASS: function(elem, match){\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\t\tATTR: function(elem, match){\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Expr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\t\tPOS: function(elem, match, i, array){\n\t\t\tvar name = match[2], filter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS;\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\\[]*\\])(?![^\\(]*\\))/.source );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t}));\n}\n\nvar makeArray = function(array, results) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\t\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch(e){\n\tmakeArray = function(array, results) {\n\t\tvar ret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( var i = 0; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\tif ( a == b ) {\n\t\t\t\thasDuplicate = true;\n\t\t\t}\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\tvar ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;\n\t\tif ( ret === 0 ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn ret;\n\t};\n} else if ( \"sourceIndex\" in document.documentElement ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( !a.sourceIndex || !b.sourceIndex ) {\n\t\t\tif ( a == b ) {\n\t\t\t\thasDuplicate = true;\n\t\t\t}\n\t\t\treturn a.sourceIndex ? -1 : 1;\n\t\t}\n\n\t\tvar ret = a.sourceIndex - b.sourceIndex;\n\t\tif ( ret === 0 ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn ret;\n\t};\n} else if ( document.createRange ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( !a.ownerDocument || !b.ownerDocument ) {\n\t\t\tif ( a == b ) {\n\t\t\t\thasDuplicate = true;\n\t\t\t}\n\t\t\treturn a.ownerDocument ? -1 : 1;\n\t\t}\n\n\t\tvar aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();\n\t\taRange.setStart(a, 0);\n\t\taRange.setEnd(a, 0);\n\t\tbRange.setStart(b, 0);\n\t\tbRange.setEnd(b, 0);\n\t\tvar ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);\n\t\tif ( ret === 0 ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn ret;\n\t};\n}\n\n// Utility function for retreiving the text value of an array of DOM nodes\nfunction getText( elems ) {\n\tvar ret = \"\", elem;\n\n\tfor ( var i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date).getTime();\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\tvar root = document.documentElement;\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function(match, context, isXML){\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\treturn m ? m.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ? [m] : undefined : [];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function(elem, match){\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\troot = form = null; // release memory in IE\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function(match, context){\n\t\t\tvar results = context.getElementsByTagName(match[1]);\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\t\tExpr.attrHandle.href = function(elem){\n\t\t\treturn elem.getAttribute(\"href\", 2);\n\t\t};\n\t}\n\n\tdiv = null; // release memory in IE\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle, div = document.createElement(\"div\");\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tSizzle = function(query, context, extra, seed){\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && context.nodeType === 9 && !isXML(context) ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t} catch(e){}\n\t\t\t}\n\t\t\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\tdiv = null; // release memory in IE\n\t})();\n}\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\t\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function(match, context, isXML) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\tdiv = null; // release memory in IE\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\t\tif ( elem ) {\n\t\t\telem = elem[dir];\n\t\t\tvar match = false;\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\t\tif ( elem ) {\n\t\t\telem = elem[dir];\n\t\t\tvar match = false;\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nvar contains = document.compareDocumentPosition ? function(a, b){\n\treturn !!(a.compareDocumentPosition(b) & 16);\n} : function(a, b){\n\treturn a !== b && (a.contains ? a.contains(b) : true);\n};\n\nvar isXML = function(elem){\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833) \n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function(selector, context){\n\tvar tmpSet = [], later = \"\", match,\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = getText;\njQuery.isXMLDoc = isXML;\njQuery.contains = contains;\n\nreturn;\n\nwindow.Sizzle = Sizzle;\n\n})();\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tslice = Array.prototype.slice;\n\n// Implement the identical functionality for filter and not\nvar winnow = function( elements, qualifier, keep ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn (elem === qualifier) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn (jQuery.inArray( elem, qualifier ) >= 0) === keep;\n\t});\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ), length = 0;\n\n\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( var n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( var r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\t\n\tis: function( selector ) {\n\t\treturn !!selector && jQuery.filter( selector, this ).length > 0;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar ret = [], cur = this[0], match, matches = {}, selector;\n\n\t\t\tif ( cur && selectors.length ) {\n\t\t\t\tfor ( var i = 0, l = selectors.length; i < l; i++ ) {\n\t\t\t\t\tselector = selectors[i];\n\n\t\t\t\t\tif ( !matches[selector] ) {\n\t\t\t\t\t\tmatches[selector] = jQuery.expr.match.POS.test( selector ) ? \n\t\t\t\t\t\t\tjQuery( selector, context || this.context ) :\n\t\t\t\t\t\t\tselector;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\t\tfor ( selector in matches ) {\n\t\t\t\t\t\tmatch = matches[selector];\n\n\t\t\t\t\t\tif ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {\n\t\t\t\t\t\t\tret.push({ selector: selector, elem: cur });\n\t\t\t\t\t\t\tdelete matches[selector];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar pos = jQuery.expr.match.POS.test( selectors ) ? \n\t\t\tjQuery( selectors, context || this.context ) : null;\n\n\t\treturn this.map(function( i, cur ) {\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {\n\t\t\t\t\treturn cur;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t},\n\t\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\t\tif ( !elem || typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0],\n\t\t\t\t// If it receives a string, the selector is used\n\t\t\t\t// If it receives nothing, the siblings are used\n\t\t\t\telem ? jQuery( elem ) : this.parent().children() );\n\t\t}\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context || this.context ) :\n\t\t\t\tjQuery.makeArray( selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( elem.parentNode.firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\t\t\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, slice.call(arguments).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn jQuery.find.matches(expr, elems);\n\t},\n\t\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [], cur = elem[dir];\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\nvar rinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /(<([\\w:]+)[^>]*?)\\/>/g,\n\trselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnocache = /<script|<object|<embed|<option|<style/i,\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,  // checked=\"checked\" or checked (html5)\n\tfcloseTag = function( all, front, tag ) {\n\t\treturn rselfClosing.test( tag ) ?\n\t\t\tall :\n\t\t\tfront + \"></\" + tag + \">\";\n\t},\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( text ) {\n\t\tif ( jQuery.isFunction(text) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.text( text.call(this, i, self.text()) );\n\t\t\t});\n\t\t}\n\n\t\tif ( typeof text !== \"object\" && text !== undefined ) {\n\t\t\treturn this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );\n\t\t}\n\n\t\treturn jQuery.text( this );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append(this);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ), contents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery( this ).wrapAll( html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery(arguments[0]);\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery(arguments[0]).toArray() );\n\t\t\treturn set;\n\t\t}\n\t},\n\t\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t elem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn this;\n\t},\n\n\tclone: function( events ) {\n\t\t// Do the clone\n\t\tvar ret = this.map(function() {\n\t\t\tif ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {\n\t\t\t\t// IE copies events bound via attachEvent when\n\t\t\t\t// using cloneNode. Calling detachEvent on the\n\t\t\t\t// clone will also remove the events from the orignal\n\t\t\t\t// In order to get around this, we use innerHTML.\n\t\t\t\t// Unfortunately, this means some modifications to\n\t\t\t\t// attributes in IE that are actually only stored\n\t\t\t\t// as properties will not be copied (such as the\n\t\t\t\t// the name attribute on an input).\n\t\t\t\tvar html = this.outerHTML, ownerDocument = this.ownerDocument;\n\t\t\t\tif ( !html ) {\n\t\t\t\t\tvar div = ownerDocument.createElement(\"div\");\n\t\t\t\t\tdiv.appendChild( this.cloneNode(true) );\n\t\t\t\t\thtml = div.innerHTML;\n\t\t\t\t}\n\n\t\t\t\treturn jQuery.clean([html.replace(rinlinejQuery, \"\")\n\t\t\t\t\t// Handle the case in IE 8 where action=/test/> self-closes a tag\n\t\t\t\t\t.replace(/=([^=\"'>\\s]+\\/)>/g, '=\"$1\">')\n\t\t\t\t\t.replace(rleadingWhitespace, \"\")], ownerDocument)[0];\n\t\t\t} else {\n\t\t\t\treturn this.cloneNode(true);\n\t\t\t}\n\t\t});\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( events === true ) {\n\t\t\tcloneCopyEvent( this, ret );\n\t\t\tcloneCopyEvent( this.find(\"*\"), ret.find(\"*\") );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn ret;\n\t},\n\n\thtml: function( value ) {\n\t\tif ( value === undefined ) {\n\t\t\treturn this[0] && this[0].nodeType === 1 ?\n\t\t\t\tthis[0].innerHTML.replace(rinlinejQuery, \"\") :\n\t\t\t\tnull;\n\n\t\t// See if we can take a shortcut and just use innerHTML\n\t\t} else if ( typeof value === \"string\" && !rnocache.test( value ) &&\n\t\t\t(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&\n\t\t\t!wrapMap[ (rtagName.exec( value ) || [\"\", \"\"])[1].toLowerCase() ] ) {\n\n\t\t\tvalue = value.replace(rxhtmlTag, fcloseTag);\n\n\t\t\ttry {\n\t\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\tif ( this[i].nodeType === 1 ) {\n\t\t\t\t\t\tjQuery.cleanData( this[i].getElementsByTagName(\"*\") );\n\t\t\t\t\t\tthis[i].innerHTML = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t} catch(e) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\n\t\t} else if ( jQuery.isFunction( value ) ) {\n\t\t\tthis.each(function(i){\n\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\tself.empty().append(function(){\n\t\t\t\t\treturn value.call( this, i, old );\n\t\t\t\t});\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.empty().append( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery(value).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling, parent = this.parentNode;\n\n\t\t\t\tjQuery(this).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value );\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, value = args[0], scripts = [], fragment, parent;\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = buildFragment( args, this, scripts );\n\t\t\t}\n\t\t\t\n\t\t\tfragment = results.fragment;\n\t\t\t\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\ti > 0 || results.cacheable || this.length > 1  ?\n\t\t\t\t\t\t\tfragment.cloneNode(true) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, evalScript );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t\tfunction root( elem, cur ) {\n\t\t\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\t\t\telem;\n\t\t}\n\t}\n});\n\nfunction cloneCopyEvent(orig, ret) {\n\tvar i = 0;\n\n\tret.each(function() {\n\t\tif ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;\n\n\t\tif ( events ) {\n\t\t\tdelete curData.handle;\n\t\t\tcurData.events = {};\n\n\t\t\tfor ( var type in events ) {\n\t\t\t\tfor ( var handler in events[ type ] ) {\n\t\t\t\t\tjQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction buildFragment( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults,\n\t\tdoc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);\n\n\t// Only cache \"small\" (1/2 KB) strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\tif ( args.length === 1 && typeof args[0] === \"string\" && args[0].length < 512 && doc === document &&\n\t\t!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {\n\n\t\tcacheable = true;\n\t\tcacheresults = jQuery.fragments[ args[0] ];\n\t\tif ( cacheresults ) {\n\t\t\tif ( cacheresults !== 1 ) {\n\t\t\t\tfragment = cacheresults;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n}\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [], insert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\t\t\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\t\t\t\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = (i > 0 ? this.clone(true) : this).get();\n\t\t\t\tjQuery.fn[ original ].apply( jQuery(insert[i]), elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\t\t\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\njQuery.extend({\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tvar ret = [];\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" && !rhtml.test( elem ) ) {\n\t\t\t\telem = context.createTextNode( elem );\n\n\t\t\t} else if ( typeof elem === \"string\" ) {\n\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\telem = elem.replace(rxhtmlTag, fcloseTag);\n\n\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\tvar tag = (rtagName.exec( elem ) || [\"\", \"\"])[1].toLowerCase(),\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\tdiv = context.createElement(\"div\");\n\n\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t// Move to the right depth\n\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\tfor ( var j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t}\n\n\t\t\t\telem = div.childNodes;\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tfor ( var i = 0; ret[i]; i++ ) {\n\t\t\t\tif ( scripts && jQuery.nodeName( ret[i], \"script\" ) && (!ret[i].type || ret[i].type.toLowerCase() === \"text/javascript\") ) {\n\t\t\t\t\tscripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );\n\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\tif ( ret[i].nodeType === 1 ) {\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName(\"script\"))) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( ret[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\t\n\tcleanData: function( elems ) {\n\t\tvar data, id, cache = jQuery.cache,\n\t\t\tspecial = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\t\t\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tid = elem[ jQuery.expando ];\n\t\t\t\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ];\n\t\t\t\t\n\t\t\t\tif ( data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tremoveEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n// exclude the following css properties to add px\nvar rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,\n\tralpha = /alpha\\([^)]*\\)/,\n\tropacity = /opacity=([^)]*)/,\n\trfloat = /float/i,\n\trdashAlpha = /-([a-z])/ig,\n\trupper = /([A-Z])/g,\n\trnumpx = /^-?\\d+(?:px)?$/i,\n\trnum = /^-?\\d/,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display:\"block\" },\n\tcssWidth = [ \"Left\", \"Right\" ],\n\tcssHeight = [ \"Top\", \"Bottom\" ],\n\n\t// cache check for defaultView.getComputedStyle\n\tgetComputedStyle = document.defaultView && document.defaultView.getComputedStyle,\n\t// normalize float css property\n\tstyleFloat = jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\",\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn.css = function( name, value ) {\n\treturn access( this, name, value, true, function( elem, name, value ) {\n\t\tif ( value === undefined ) {\n\t\t\treturn jQuery.curCSS( elem, name );\n\t\t}\n\t\t\n\t\tif ( typeof value === \"number\" && !rexclude.test(name) ) {\n\t\t\tvalue += \"px\";\n\t\t}\n\n\t\tjQuery.style( elem, name, value );\n\t});\n};\n\njQuery.extend({\n\tstyle: function( elem, name, value ) {\n\t\t// don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// ignore negative width and height values #1599\n\t\tif ( (name === \"width\" || name === \"height\") && parseFloat(value) < 0 ) {\n\t\t\tvalue = undefined;\n\t\t}\n\n\t\tvar style = elem.style || elem, set = value !== undefined;\n\n\t\t// IE uses filters for opacity\n\t\tif ( !jQuery.support.opacity && name === \"opacity\" ) {\n\t\t\tif ( set ) {\n\t\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t\t// Force it by setting the zoom level\n\t\t\t\tstyle.zoom = 1;\n\n\t\t\t\t// Set the alpha filter to set the opacity\n\t\t\t\tvar opacity = parseInt( value, 10 ) + \"\" === \"NaN\" ? \"\" : \"alpha(opacity=\" + value * 100 + \")\";\n\t\t\t\tvar filter = style.filter || jQuery.curCSS( elem, \"filter\" ) || \"\";\n\t\t\t\tstyle.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;\n\t\t\t}\n\n\t\t\treturn style.filter && style.filter.indexOf(\"opacity=\") >= 0 ?\n\t\t\t\t(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + \"\":\n\t\t\t\t\"\";\n\t\t}\n\n\t\t// Make sure we're using the right name for getting the float value\n\t\tif ( rfloat.test( name ) ) {\n\t\t\tname = styleFloat;\n\t\t}\n\n\t\tname = name.replace(rdashAlpha, fcamelCase);\n\n\t\tif ( set ) {\n\t\t\tstyle[ name ] = value;\n\t\t}\n\n\t\treturn style[ name ];\n\t},\n\n\tcss: function( elem, name, force, extra ) {\n\t\tif ( name === \"width\" || name === \"height\" ) {\n\t\t\tvar val, props = cssShow, which = name === \"width\" ? cssWidth : cssHeight;\n\n\t\t\tfunction getWH() {\n\t\t\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight;\n\n\t\t\t\tif ( extra === \"border\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tjQuery.each( which, function() {\n\t\t\t\t\tif ( !extra ) {\n\t\t\t\t\t\tval -= parseFloat(jQuery.curCSS( elem, \"padding\" + this, true)) || 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\t\t\tval += parseFloat(jQuery.curCSS( elem, \"margin\" + this, true)) || 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tval -= parseFloat(jQuery.curCSS( elem, \"border\" + this + \"Width\", true)) || 0;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\tgetWH();\n\t\t\t} else {\n\t\t\t\tjQuery.swap( elem, props, getWH );\n\t\t\t}\n\n\t\t\treturn Math.max(0, Math.round(val));\n\t\t}\n\n\t\treturn jQuery.curCSS( elem, name, force );\n\t},\n\n\tcurCSS: function( elem, name, force ) {\n\t\tvar ret, style = elem.style, filter;\n\n\t\t// IE uses filters for opacity\n\t\tif ( !jQuery.support.opacity && name === \"opacity\" && elem.currentStyle ) {\n\t\t\tret = ropacity.test(elem.currentStyle.filter || \"\") ?\n\t\t\t\t(parseFloat(RegExp.$1) / 100) + \"\" :\n\t\t\t\t\"\";\n\n\t\t\treturn ret === \"\" ?\n\t\t\t\t\"1\" :\n\t\t\t\tret;\n\t\t}\n\n\t\t// Make sure we're using the right name for getting the float value\n\t\tif ( rfloat.test( name ) ) {\n\t\t\tname = styleFloat;\n\t\t}\n\n\t\tif ( !force && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\n\t\t} else if ( getComputedStyle ) {\n\n\t\t\t// Only \"float\" is needed here\n\t\t\tif ( rfloat.test( name ) ) {\n\t\t\t\tname = \"float\";\n\t\t\t}\n\n\t\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\t\tvar defaultView = elem.ownerDocument.defaultView;\n\n\t\t\tif ( !defaultView ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tvar computedStyle = defaultView.getComputedStyle( elem, null );\n\n\t\t\tif ( computedStyle ) {\n\t\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\t}\n\n\t\t\t// We should always get a number back from opacity\n\t\t\tif ( name === \"opacity\" && ret === \"\" ) {\n\t\t\t\tret = \"1\";\n\t\t\t}\n\n\t\t} else if ( elem.currentStyle ) {\n\t\t\tvar camelCase = name.replace(rdashAlpha, fcamelCase);\n\n\t\t\tret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];\n\n\t\t\t// From the awesome hack by Dean Edwards\n\t\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t\t// If we're not dealing with a regular pixel number\n\t\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t\tif ( !rnumpx.test( ret ) && rnum.test( ret ) ) {\n\t\t\t\t// Remember the original values\n\t\t\t\tvar left = style.left, rsLeft = elem.runtimeStyle.left;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t\tstyle.left = camelCase === \"fontSize\" ? \"1em\" : (ret || 0);\n\t\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.left = left;\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( var name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tcallback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( var name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth, height = elem.offsetHeight,\n\t\t\tskip = elem.nodeName.toLowerCase() === \"tr\";\n\n\t\treturn width === 0 && height === 0 && !skip ?\n\t\t\ttrue :\n\t\t\twidth > 0 && height > 0 && !skip ?\n\t\t\t\tfalse :\n\t\t\t\tjQuery.curCSS(elem, \"display\") === \"none\";\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\nvar jsc = now(),\n\trscript = /<script(.|\\s)*?\\/script>/gi,\n\trselectTextarea = /select|textarea/i,\n\trinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,\n\tjsre = /=\\?(&|$)/,\n\trquery = /\\?/,\n\trts = /(\\?|&)_=.*?(&|$)/,\n\trurl = /^(\\w+:)?\\/\\/([^\\/?#]+)/,\n\tr20 = /%20/g,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load;\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" ) {\n\t\t\treturn _load.call( this, url );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf(\" \");\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice(off, url.length);\n\t\t\turl = url.slice(0, off);\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = null;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\tcomplete: function( res, status ) {\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( status === \"success\" || status === \"notmodified\" ) {\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div />\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(res.responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tres.responseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [res.responseText, status, res] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param(this.serializeArray());\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\treturn this.elements ? jQuery.makeArray(this.elements) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t(this.checked || rselectTextarea.test(this.nodeName) ||\n\t\t\t\t\trinput.test(this.type));\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery(this).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray(val) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split(\" \"), function( i, o ) {\n\tjQuery.fn[o] = function( f ) {\n\t\treturn this.bind(o, f);\n\t};\n});\n\njQuery.extend({\n\n\tget: function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omited\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: \"GET\",\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get(url, null, callback, \"script\");\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get(url, data, callback, \"json\");\n\t},\n\n\tpost: function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omited\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = {};\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: \"POST\",\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t},\n\n\tajaxSetup: function( settings ) {\n\t\tjQuery.extend( jQuery.ajaxSettings, settings );\n\t},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\ttraditional: false,\n\t\t*/\n\t\t// Create the request object; Microsoft failed to properly\n\t\t// implement the XMLHttpRequest in IE7 (can't request local files),\n\t\t// so we use the ActiveXObject when it is available\n\t\t// This function can be overriden by calling jQuery.ajaxSetup\n\t\txhr: window.XMLHttpRequest && (window.location.protocol !== \"file:\" || !window.ActiveXObject) ?\n\t\t\tfunction() {\n\t\t\t\treturn new window.XMLHttpRequest();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\ttry {\n\t\t\t\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t\t\t\t} catch(e) {}\n\t\t\t},\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\tscript: \"text/javascript, application/javascript\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\ttext: \"text/plain\",\n\t\t\t_default: \"*/*\"\n\t\t}\n\t},\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajax: function( origSettings ) {\n\t\tvar s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);\n\t\t\n\t\tvar jsonp, status, data,\n\t\t\tcallbackContext = origSettings && origSettings.context || s,\n\t\t\ttype = s.type.toUpperCase();\n\n\t\t// convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Handle JSONP Parameter Callbacks\n\t\tif ( s.dataType === \"jsonp\" ) {\n\t\t\tif ( type === \"GET\" ) {\n\t\t\t\tif ( !jsre.test( s.url ) ) {\n\t\t\t\t\ts.url += (rquery.test( s.url ) ? \"&\" : \"?\") + (s.jsonp || \"callback\") + \"=?\";\n\t\t\t\t}\n\t\t\t} else if ( !s.data || !jsre.test(s.data) ) {\n\t\t\t\ts.data = (s.data ? s.data + \"&\" : \"\") + (s.jsonp || \"callback\") + \"=?\";\n\t\t\t}\n\t\t\ts.dataType = \"json\";\n\t\t}\n\n\t\t// Build temporary JSONP function\n\t\tif ( s.dataType === \"json\" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {\n\t\t\tjsonp = s.jsonpCallback || (\"jsonp\" + jsc++);\n\n\t\t\t// Replace the =? sequence both in the query string and the data\n\t\t\tif ( s.data ) {\n\t\t\t\ts.data = (s.data + \"\").replace(jsre, \"=\" + jsonp + \"$1\");\n\t\t\t}\n\n\t\t\ts.url = s.url.replace(jsre, \"=\" + jsonp + \"$1\");\n\n\t\t\t// We need to make sure\n\t\t\t// that a JSONP style response is executed properly\n\t\t\ts.dataType = \"script\";\n\n\t\t\t// Handle JSONP-style loading\n\t\t\twindow[ jsonp ] = window[ jsonp ] || function( tmp ) {\n\t\t\t\tdata = tmp;\n\t\t\t\tsuccess();\n\t\t\t\tcomplete();\n\t\t\t\t// Garbage collect\n\t\t\t\twindow[ jsonp ] = undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tdelete window[ jsonp ];\n\t\t\t\t} catch(e) {}\n\n\t\t\t\tif ( head ) {\n\t\t\t\t\thead.removeChild( script );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif ( s.dataType === \"script\" && s.cache === null ) {\n\t\t\ts.cache = false;\n\t\t}\n\n\t\tif ( s.cache === false && type === \"GET\" ) {\n\t\t\tvar ts = now();\n\n\t\t\t// try replacing _= if it is there\n\t\t\tvar ret = s.url.replace(rts, \"$1_=\" + ts + \"$2\");\n\n\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\ts.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? \"&\" : \"?\") + \"_=\" + ts : \"\");\n\t\t}\n\n\t\t// If data is available, append data to url for get requests\n\t\tif ( s.data && type === \"GET\" ) {\n\t\t\ts.url += (rquery.test(s.url) ? \"&\" : \"?\") + s.data;\n\t\t}\n\n\t\t// Watch for a new set of requests\n\t\tif ( s.global && ! jQuery.active++ ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Matches an absolute URL, and saves the domain\n\t\tvar parts = rurl.exec( s.url ),\n\t\t\tremote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);\n\n\t\t// If we're requesting a remote document\n\t\t// and trying to load JSON or Script with a GET\n\t\tif ( s.dataType === \"script\" && type === \"GET\" && remote ) {\n\t\t\tvar head = document.getElementsByTagName(\"head\")[0] || document.documentElement;\n\t\t\tvar script = document.createElement(\"script\");\n\t\t\tscript.src = s.url;\n\t\t\tif ( s.scriptCharset ) {\n\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t}\n\n\t\t\t// Handle Script loading\n\t\t\tif ( !jsonp ) {\n\t\t\t\tvar done = false;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function() {\n\t\t\t\t\tif ( !done && (!this.readyState ||\n\t\t\t\t\t\t\tthis.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\tsuccess();\n\t\t\t\t\t\tcomplete();\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\thead.insertBefore( script, head.firstChild );\n\n\t\t\t// We handle everything using the script element injection\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar requestDone = false;\n\n\t\t// Create the request object\n\t\tvar xhr = s.xhr();\n\n\t\tif ( !xhr ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Open the socket\n\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\tif ( s.username ) {\n\t\t\txhr.open(type, s.url, s.async, s.username, s.password);\n\t\t} else {\n\t\t\txhr.open(type, s.url, s.async);\n\t\t}\n\n\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\ttry {\n\t\t\t// Set the correct header, if data is being sent\n\t\t\tif ( s.data || origSettings && origSettings.contentType ) {\n\t\t\t\txhr.setRequestHeader(\"Content-Type\", s.contentType);\n\t\t\t}\n\n\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\tif ( s.ifModified ) {\n\t\t\t\tif ( jQuery.lastModified[s.url] ) {\n\t\t\t\t\txhr.setRequestHeader(\"If-Modified-Since\", jQuery.lastModified[s.url]);\n\t\t\t\t}\n\n\t\t\t\tif ( jQuery.etag[s.url] ) {\n\t\t\t\t\txhr.setRequestHeader(\"If-None-Match\", jQuery.etag[s.url]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set header so the called script knows that it's an XMLHttpRequest\n\t\t\t// Only send the header if it's not a remote XHR\n\t\t\tif ( !remote ) {\n\t\t\t\txhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\t\t\t}\n\n\t\t\t// Set the Accepts header for the server, depending on the dataType\n\t\t\txhr.setRequestHeader(\"Accept\", s.dataType && s.accepts[ s.dataType ] ?\n\t\t\t\ts.accepts[ s.dataType ] + \", */*\" :\n\t\t\t\ts.accepts._default );\n\t\t} catch(e) {}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {\n\t\t\t// Handle the global AJAX counter\n\t\t\tif ( s.global && ! --jQuery.active ) {\n\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t}\n\n\t\t\t// close opended socket\n\t\t\txhr.abort();\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( s.global ) {\n\t\t\ttrigger(\"ajaxSend\", [xhr, s]);\n\t\t}\n\n\t\t// Wait for a response to come back\n\t\tvar onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {\n\t\t\t// The request was aborted\n\t\t\tif ( !xhr || xhr.readyState === 0 || isTimeout === \"abort\" ) {\n\t\t\t\t// Opera doesn't call onreadystatechange before this point\n\t\t\t\t// so we simulate the call\n\t\t\t\tif ( !requestDone ) {\n\t\t\t\t\tcomplete();\n\t\t\t\t}\n\n\t\t\t\trequestDone = true;\n\t\t\t\tif ( xhr ) {\n\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t}\n\n\t\t\t// The transfer is complete and the data is available, or the request timed out\n\t\t\t} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === \"timeout\") ) {\n\t\t\t\trequestDone = true;\n\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\n\t\t\t\tstatus = isTimeout === \"timeout\" ?\n\t\t\t\t\t\"timeout\" :\n\t\t\t\t\t!jQuery.httpSuccess( xhr ) ?\n\t\t\t\t\t\t\"error\" :\n\t\t\t\t\t\ts.ifModified && jQuery.httpNotModified( xhr, s.url ) ?\n\t\t\t\t\t\t\t\"notmodified\" :\n\t\t\t\t\t\t\t\"success\";\n\n\t\t\t\tvar errMsg;\n\n\t\t\t\tif ( status === \"success\" ) {\n\t\t\t\t\t// Watch for, and catch, XML document parse errors\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// process the data (runs the xml through httpData regardless of callback)\n\t\t\t\t\t\tdata = jQuery.httpData( xhr, s.dataType, s );\n\t\t\t\t\t} catch(err) {\n\t\t\t\t\t\tstatus = \"parsererror\";\n\t\t\t\t\t\terrMsg = err;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Make sure that the request was successful or notmodified\n\t\t\t\tif ( status === \"success\" || status === \"notmodified\" ) {\n\t\t\t\t\t// JSONP handles its own success callback\n\t\t\t\t\tif ( !jsonp ) {\n\t\t\t\t\t\tsuccess();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.handleError(s, xhr, status, errMsg);\n\t\t\t\t}\n\n\t\t\t\t// Fire the complete handlers\n\t\t\t\tcomplete();\n\n\t\t\t\tif ( isTimeout === \"timeout\" ) {\n\t\t\t\t\txhr.abort();\n\t\t\t\t}\n\n\t\t\t\t// Stop memory leaks\n\t\t\t\tif ( s.async ) {\n\t\t\t\t\txhr = null;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Override the abort handler, if we can (IE doesn't allow it, but that's OK)\n\t\t// Opera doesn't fire onreadystatechange at all on abort\n\t\ttry {\n\t\t\tvar oldAbort = xhr.abort;\n\t\t\txhr.abort = function() {\n\t\t\t\tif ( xhr ) {\n\t\t\t\t\toldAbort.call( xhr );\n\t\t\t\t}\n\n\t\t\t\tonreadystatechange( \"abort\" );\n\t\t\t};\n\t\t} catch(e) { }\n\n\t\t// Timeout checker\n\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\tsetTimeout(function() {\n\t\t\t\t// Check to see if the request is still happening\n\t\t\t\tif ( xhr && !requestDone ) {\n\t\t\t\t\tonreadystatechange( \"timeout\" );\n\t\t\t\t}\n\t\t\t}, s.timeout);\n\t\t}\n\n\t\t// Send the data\n\t\ttry {\n\t\t\txhr.send( type === \"POST\" || type === \"PUT\" || type === \"DELETE\" ? s.data : null );\n\t\t} catch(e) {\n\t\t\tjQuery.handleError(s, xhr, null, e);\n\t\t\t// Fire the complete handlers\n\t\t\tcomplete();\n\t\t}\n\n\t\t// firefox 1.5 doesn't fire statechange for sync requests\n\t\tif ( !s.async ) {\n\t\t\tonreadystatechange();\n\t\t}\n\n\t\tfunction success() {\n\t\t\t// If a local callback was specified, fire it and pass it the data\n\t\t\tif ( s.success ) {\n\t\t\t\ts.success.call( callbackContext, data, status, xhr );\n\t\t\t}\n\n\t\t\t// Fire the global callback\n\t\t\tif ( s.global ) {\n\t\t\t\ttrigger( \"ajaxSuccess\", [xhr, s] );\n\t\t\t}\n\t\t}\n\n\t\tfunction complete() {\n\t\t\t// Process result\n\t\t\tif ( s.complete ) {\n\t\t\t\ts.complete.call( callbackContext, xhr, status);\n\t\t\t}\n\n\t\t\t// The request was completed\n\t\t\tif ( s.global ) {\n\t\t\t\ttrigger( \"ajaxComplete\", [xhr, s] );\n\t\t\t}\n\n\t\t\t// Handle the global AJAX counter\n\t\t\tif ( s.global && ! --jQuery.active ) {\n\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction trigger(type, args) {\n\t\t\t(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);\n\t\t}\n\n\t\t// return XMLHttpRequest to allow aborting the request etc.\n\t\treturn xhr;\n\t},\n\n\thandleError: function( s, xhr, status, e ) {\n\t\t// If a local callback was specified, fire it\n\t\tif ( s.error ) {\n\t\t\ts.error.call( s.context || s, xhr, status, e );\n\t\t}\n\n\t\t// Fire the global callback\n\t\tif ( s.global ) {\n\t\t\t(s.context ? jQuery(s.context) : jQuery.event).trigger( \"ajaxError\", [xhr, s, e] );\n\t\t}\n\t},\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Determines if an XMLHttpRequest was successful or not\n\thttpSuccess: function( xhr ) {\n\t\ttry {\n\t\t\t// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450\n\t\t\treturn !xhr.status && location.protocol === \"file:\" ||\n\t\t\t\t// Opera returns 0 when status is 304\n\t\t\t\t( xhr.status >= 200 && xhr.status < 300 ) ||\n\t\t\t\txhr.status === 304 || xhr.status === 1223 || xhr.status === 0;\n\t\t} catch(e) {}\n\n\t\treturn false;\n\t},\n\n\t// Determines if an XMLHttpRequest returns NotModified\n\thttpNotModified: function( xhr, url ) {\n\t\tvar lastModified = xhr.getResponseHeader(\"Last-Modified\"),\n\t\t\tetag = xhr.getResponseHeader(\"Etag\");\n\n\t\tif ( lastModified ) {\n\t\t\tjQuery.lastModified[url] = lastModified;\n\t\t}\n\n\t\tif ( etag ) {\n\t\t\tjQuery.etag[url] = etag;\n\t\t}\n\n\t\t// Opera returns 0 when status is 304\n\t\treturn xhr.status === 304 || xhr.status === 0;\n\t},\n\n\thttpData: function( xhr, type, s ) {\n\t\tvar ct = xhr.getResponseHeader(\"content-type\") || \"\",\n\t\t\txml = type === \"xml\" || !type && ct.indexOf(\"xml\") >= 0,\n\t\t\tdata = xml ? xhr.responseXML : xhr.responseText;\n\n\t\tif ( xml && data.documentElement.nodeName === \"parsererror\" ) {\n\t\t\tjQuery.error( \"parsererror\" );\n\t\t}\n\n\t\t// Allow a pre-filtering function to sanitize the response\n\t\t// s is checked to keep backwards compatibility\n\t\tif ( s && s.dataFilter ) {\n\t\t\tdata = s.dataFilter( data, type );\n\t\t}\n\n\t\t// The filter can actually parse the response\n\t\tif ( typeof data === \"string\" ) {\n\t\t\t// Get the JavaScript object, if JSON is used.\n\t\t\tif ( type === \"json\" || !type && ct.indexOf(\"json\") >= 0 ) {\n\t\t\t\tdata = jQuery.parseJSON( data );\n\n\t\t\t// If the type is \"script\", eval it in global context\n\t\t\t} else if ( type === \"script\" || !type && ct.indexOf(\"javascript\") >= 0 ) {\n\t\t\t\tjQuery.globalEval( data );\n\t\t\t}\n\t\t}\n\n\t\treturn data;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [];\n\t\t\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\t\t\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray(a) || a.jquery ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\t\t\t\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[prefix] );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join(\"&\").replace(r20, \"+\");\n\n\t\tfunction buildParams( prefix, obj ) {\n\t\t\tif ( jQuery.isArray(obj) ) {\n\t\t\t\t// Serialize array item.\n\t\t\t\tjQuery.each( obj, function( i, v ) {\n\t\t\t\t\tif ( traditional || /\\[\\]$/.test( prefix ) ) {\n\t\t\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\t\t\tadd( prefix, v );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" || jQuery.isArray(v) ? i : \"\" ) + \"]\", v );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\t\n\t\t\t} else if ( !traditional && obj != null && typeof obj === \"object\" ) {\n\t\t\t\t// Serialize object item.\n\t\t\t\tjQuery.each( obj, function( k, v ) {\n\t\t\t\t\tbuildParams( prefix + \"[\" + k + \"]\", v );\n\t\t\t\t});\n\t\t\t\t\t\n\t\t\t} else {\n\t\t\t\t// Serialize scalar item.\n\t\t\t\tadd( prefix, obj );\n\t\t\t}\n\t\t}\n\n\t\tfunction add( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction(value) ? value() : value;\n\t\t\ts[ s.length ] = encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\n\t\t}\n\t}\n});\nvar elemdisplay = {},\n\trfxtypes = /toggle|show|hide/,\n\trfxnum = /^([+-]=)?([\\d+-.]+)(.*)$/,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t];\n\njQuery.fn.extend({\n\tshow: function( speed, callback ) {\n\t\tif ( speed || speed === 0) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar old = jQuery.data(this[i], \"olddisplay\");\n\n\t\t\t\tthis[i].style.display = old || \"\";\n\n\t\t\t\tif ( jQuery.css(this[i], \"display\") === \"none\" ) {\n\t\t\t\t\tvar nodeName = this[i].nodeName, display;\n\n\t\t\t\t\tif ( elemdisplay[ nodeName ] ) {\n\t\t\t\t\t\tdisplay = elemdisplay[ nodeName ];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar elem = jQuery(\"<\" + nodeName + \" />\").appendTo(\"body\");\n\n\t\t\t\t\t\tdisplay = elem.css(\"display\");\n\n\t\t\t\t\t\tif ( display === \"none\" ) {\n\t\t\t\t\t\t\tdisplay = \"block\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\telem.remove();\n\n\t\t\t\t\t\telemdisplay[ nodeName ] = display;\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.data(this[i], \"olddisplay\", display);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( var j = 0, k = this.length; j < k; j++ ) {\n\t\t\t\tthis[j].style.display = jQuery.data(this[j], \"olddisplay\") || \"\";\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar old = jQuery.data(this[i], \"olddisplay\");\n\t\t\t\tif ( !old && old !== \"none\" ) {\n\t\t\t\t\tjQuery.data(this[i], \"olddisplay\", jQuery.css(this[i], \"display\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( var j = 0, k = this.length; j < k; j++ ) {\n\t\t\t\tthis[j].style.display = \"none\";\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2 ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed(speed, easing, callback);\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete );\n\t\t}\n\n\t\treturn this[ optall.queue === false ? \"each\" : \"queue\" ](function() {\n\t\t\tvar opt = jQuery.extend({}, optall), p,\n\t\t\t\thidden = this.nodeType === 1 && jQuery(this).is(\":hidden\"),\n\t\t\t\tself = this;\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\tvar name = p.replace(rdashAlpha, fcamelCase);\n\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t\tp = name;\n\t\t\t\t}\n\n\t\t\t\tif ( prop[p] === \"hide\" && hidden || prop[p] === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call(this);\n\t\t\t\t}\n\n\t\t\t\tif ( ( p === \"height\" || p === \"width\" ) && this.style ) {\n\t\t\t\t\t// Store display property\n\t\t\t\t\topt.display = jQuery.css(this, \"display\");\n\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\topt.overflow = this.style.overflow;\n\t\t\t\t}\n\n\t\t\t\tif ( jQuery.isArray( prop[p] ) ) {\n\t\t\t\t\t// Create (if needed) and add to specialEasing\n\t\t\t\t\t(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];\n\t\t\t\t\tprop[p] = prop[p][0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\topt.curAnim = jQuery.extend({}, prop);\n\n\t\t\tjQuery.each( prop, function( name, val ) {\n\t\t\t\tvar e = new jQuery.fx( self, opt, name );\n\n\t\t\t\tif ( rfxtypes.test(val) ) {\n\t\t\t\t\te[ val === \"toggle\" ? hidden ? \"show\" : \"hide\" : val ]( prop );\n\n\t\t\t\t} else {\n\t\t\t\t\tvar parts = rfxnum.exec(val),\n\t\t\t\t\t\tstart = e.cur(true) || 0;\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tvar end = parseFloat( parts[2] ),\n\t\t\t\t\t\t\tunit = parts[3] || \"px\";\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tself.style[ name ] = (end || 1) + unit;\n\t\t\t\t\t\t\tstart = ((end || 1) / e.cur(true)) * start;\n\t\t\t\t\t\t\tself.style[ name ] = start + unit;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ((parts[1] === \"-=\" ? -1 : 1) * end) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t});\n\t},\n\n\tstop: function( clearQueue, gotoEnd ) {\n\t\tvar timers = jQuery.timers;\n\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue([]);\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\t// go in reverse order so anything added to the queue during the loop is ignored\n\t\t\tfor ( var i = timers.length - 1; i >= 0; i-- ) {\n\t\t\t\tif ( timers[i].elem === this ) {\n\t\t\t\t\tif (gotoEnd) {\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[i](true);\n\t\t\t\t\t}\n\n\t\t\t\t\ttimers.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// start the next in the queue if the last step wasn't forced\n\t\tif ( !gotoEnd ) {\n\t\t\tthis.dequeue();\n\t\t}\n\n\t\treturn this;\n\t}\n\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\", 1),\n\tslideUp: genFx(\"hide\", 1),\n\tslideToggle: genFx(\"toggle\", 1),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, callback ) {\n\t\treturn this.animate( props, speed, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? speed : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction(easing) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\tjQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\t\topt.complete = function() {\n\t\t\tif ( opt.queue !== false ) {\n\t\t\t\tjQuery(this).dequeue();\n\t\t\t}\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p, n, firstNum, diff ) {\n\t\t\treturn firstNum + diff * p;\n\t\t},\n\t\tswing: function( p, n, firstNum, diff ) {\n\t\t\treturn ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\tif ( !options.orig ) {\n\t\t\toptions.orig = {};\n\t\t}\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );\n\n\t\t// Set display property to block for height/width animations\n\t\tif ( ( this.prop === \"height\" || this.prop === \"width\" ) && this.elem.style ) {\n\t\t\tthis.elem.style.display = \"block\";\n\t\t}\n\t},\n\n\t// Get the current size\n\tcur: function( force ) {\n\t\tif ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar r = parseFloat(jQuery.css(this.elem, this.prop, force));\n\t\treturn r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tthis.startTime = now();\n\t\tthis.start = from;\n\t\tthis.end = to;\n\t\tthis.unit = unit || this.unit || \"px\";\n\t\tthis.now = this.start;\n\t\tthis.pos = this.state = 0;\n\n\t\tvar self = this;\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step(gotoEnd);\n\t\t}\n\n\t\tt.elem = this.elem;\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\ttimerId = setInterval(jQuery.fx.tick, 13);\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any\n\t\t// flash of content\n\t\tthis.custom(this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur());\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom(this.cur(), 0);\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar t = now(), done = true;\n\n\t\tif ( gotoEnd || t >= this.options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\tthis.options.curAnim[ this.prop ] = true;\n\n\t\t\tfor ( var i in this.options.curAnim ) {\n\t\t\t\tif ( this.options.curAnim[i] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\tif ( this.options.display != null ) {\n\t\t\t\t\t// Reset the overflow\n\t\t\t\t\tthis.elem.style.overflow = this.options.overflow;\n\n\t\t\t\t\t// Reset the display\n\t\t\t\t\tvar old = jQuery.data(this.elem, \"olddisplay\");\n\t\t\t\t\tthis.elem.style.display = old ? old : this.options.display;\n\n\t\t\t\t\tif ( jQuery.css(this.elem, \"display\") === \"none\" ) {\n\t\t\t\t\t\tthis.elem.style.display = \"block\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( this.options.hide ) {\n\t\t\t\t\tjQuery(this.elem).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( this.options.hide || this.options.show ) {\n\t\t\t\t\tfor ( var p in this.options.curAnim ) {\n\t\t\t\t\t\tjQuery.style(this.elem, p, this.options.orig[p]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\tthis.options.complete.call( this.elem );\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\tvar n = t - this.startTime;\n\t\t\tthis.state = n / this.options.duration;\n\n\t\t\t// Perform the easing function, defaults to swing\n\t\t\tvar specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];\n\t\t\tvar defaultEasing = this.options.easing || (jQuery.easing.swing ? \"swing\" : \"linear\");\n\t\t\tthis.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);\n\t\t\tthis.now = this.start + ((this.end - this.start) * this.pos);\n\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tvar timers = jQuery.timers;\n\n\t\tfor ( var i = 0; i < timers.length; i++ ) {\n\t\t\tif ( !timers[i]() ) {\n\t\t\t\ttimers.splice(i--, 1);\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\t\t\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\t\n\tspeeds: {\n\t\tslow: 600,\n \t\tfast: 200,\n \t\t// Default speed\n \t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style(fx.elem, \"opacity\", fx.now);\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = (fx.prop === \"width\" || fx.prop === \"height\" ? Math.max(0, fx.now) : fx.now) + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0];\n\n\t\tif ( options ) { \n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\tvar box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,\n\t\t\tclientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\ttop  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,\n\t\t\tleft = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0];\n\n\t\tif ( options ) { \n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\tjQuery.offset.initialize();\n\n\t\tvar offsetParent = elem.offsetParent, prevOffsetParent = elem,\n\t\t\tdoc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,\n\t\t\tbody = doc.body, defaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop, left = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent, offsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.offset = {\n\tinitialize: function() {\n\t\tvar body = document.body, container = document.createElement(\"div\"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, \"marginTop\", true) ) || 0,\n\t\t\thtml = \"<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";\n\n\t\tjQuery.extend( container.style, { position: \"absolute\", top: 0, left: 0, margin: 0, border: 0, width: \"1px\", height: \"1px\", visibility: \"hidden\" } );\n\n\t\tcontainer.innerHTML = html;\n\t\tbody.insertBefore( container, body.firstChild );\n\t\tinnerDiv = container.firstChild;\n\t\tcheckDiv = innerDiv.firstChild;\n\t\ttd = innerDiv.nextSibling.firstChild.firstChild;\n\n\t\tthis.doesNotAddBorder = (checkDiv.offsetTop !== 5);\n\t\tthis.doesAddBorderForTableAndCells = (td.offsetTop === 5);\n\n\t\tcheckDiv.style.position = \"fixed\", checkDiv.style.top = \"20px\";\n\t\t// safari subtracts parent border width here which is 5px\n\t\tthis.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);\n\t\tcheckDiv.style.position = checkDiv.style.top = \"\";\n\n\t\tinnerDiv.style.overflow = \"hidden\", innerDiv.style.position = \"relative\";\n\t\tthis.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);\n\n\t\tthis.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);\n\n\t\tbody.removeChild( container );\n\t\tbody = container = innerDiv = checkDiv = table = td = null;\n\t\tjQuery.offset.initialize = jQuery.noop;\n\t},\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop, left = body.offsetLeft;\n\n\t\tjQuery.offset.initialize();\n\n\t\tif ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.curCSS(body, \"marginTop\",  true) ) || 0;\n\t\t\tleft += parseFloat( jQuery.curCSS(body, \"marginLeft\", true) ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\t\n\tsetOffset: function( elem, options, i ) {\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( /static/.test( jQuery.curCSS( elem, \"position\" ) ) ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\t\tvar curElem   = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurTop    = parseInt( jQuery.curCSS( elem, \"top\",  true ), 10 ) || 0,\n\t\t\tcurLeft   = parseInt( jQuery.curCSS( elem, \"left\", true ), 10 ) || 0;\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tvar props = {\n\t\t\ttop:  (options.top  - curOffset.top)  + curTop,\n\t\t\tleft: (options.left - curOffset.left) + curLeft\n\t\t};\n\t\t\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.curCSS(elem, \"marginTop\",  true) ) || 0;\n\t\toffset.left -= parseFloat( jQuery.curCSS(elem, \"marginLeft\", true) ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], \"borderTopWidth\",  true) ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], \"borderLeftWidth\", true) ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( [\"Left\", \"Top\"], function( i, name ) {\n\tvar method = \"scroll\" + name;\n\n\tjQuery.fn[ method ] = function(val) {\n\t\tvar elem = this[0], win;\n\t\t\n\t\tif ( !elem ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( val !== undefined ) {\n\t\t\t// Set the scroll offset\n\t\t\treturn this.each(function() {\n\t\t\t\twin = getWindow( this );\n\n\t\t\t\tif ( win ) {\n\t\t\t\t\twin.scrollTo(\n\t\t\t\t\t\t!i ? val : jQuery(win).scrollLeft(),\n\t\t\t\t\t\t i ? val : jQuery(win).scrollTop()\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\t\t\t\t\tthis[ method ] = val;\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\twin = getWindow( elem );\n\n\t\t\t// Return the scroll offset\n\t\t\treturn win ? (\"pageXOffset\" in win) ? win[ i ? \"pageYOffset\" : \"pageXOffset\" ] :\n\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\telem[ method ];\n\t\t}\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn (\"scrollTo\" in elem && elem.document) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each([ \"Height\", \"Width\" ], function( i, name ) {\n\n\tvar type = name.toLowerCase();\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[\"inner\" + name] = function() {\n\t\treturn this[0] ?\n\t\t\tjQuery.css( this[0], type, false, \"padding\" ) :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[\"outer\" + name] = function( margin ) {\n\t\treturn this[0] ?\n\t\t\tjQuery.css( this[0], type, false, margin ? \"margin\" : \"border\" ) :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( size ) {\n\t\t// Get window width or height\n\t\tvar elem = this[0];\n\t\tif ( !elem ) {\n\t\t\treturn size == null ? null : this;\n\t\t}\n\t\t\n\t\tif ( jQuery.isFunction( size ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tvar self = jQuery( this );\n\t\t\t\tself[ type ]( size.call( this, i, self[ type ]() ) );\n\t\t\t});\n\t\t}\n\n\t\treturn (\"scrollTo\" in elem && elem.document) ? // does it walk and quack like a window?\n\t\t\t// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode\n\t\t\telem.document.compatMode === \"CSS1Compat\" && elem.document.documentElement[ \"client\" + name ] ||\n\t\t\telem.document.body[ \"client\" + name ] :\n\n\t\t\t// Get document width or height\n\t\t\t(elem.nodeType === 9) ? // is it a document\n\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\t\tMath.max(\n\t\t\t\t\telem.documentElement[\"client\" + name],\n\t\t\t\t\telem.body[\"scroll\" + name], elem.documentElement[\"scroll\" + name],\n\t\t\t\t\telem.body[\"offset\" + name], elem.documentElement[\"offset\" + name]\n\t\t\t\t) :\n\n\t\t\t\t// Get or set width or height on the element\n\t\t\t\tsize === undefined ?\n\t\t\t\t\t// Get width or height on the element\n\t\t\t\t\tjQuery.css( elem, type ) :\n\n\t\t\t\t\t// Set the width or height on the element (default to pixels if value is unitless)\n\t\t\t\t\tthis.css( type, typeof size === \"string\" ? size : size + \"px\" );\n\t};\n\n});\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n})(window);\n"
  },
  {
    "path": "selfblog/static/admin/js/prepopulate.js",
    "content": "(function($) {\n    $.fn.prepopulate = function(dependencies, maxLength) {\n        /*\n            Depends on urlify.js\n            Populates a selected field with the values of the dependent fields,\n            URLifies and shortens the string. \n            dependencies - array of dependent fields id's \n            maxLength - maximum length of the URLify'd string \n        */\n        return this.each(function() {\n            var field = $(this);\n\n            field.data('_changed', false);\n            field.change(function() {\n                field.data('_changed', true);\n            });\n\n            var populate = function () {\n                // Bail if the fields value has changed\n                if (field.data('_changed') == true) return;\n \n                var values = [];\n                $.each(dependencies, function(i, field) {\n                  if ($(field).val().length > 0) {\n                      values.push($(field).val());\n                  }\n                })\n                field.val(URLify(values.join(' '), maxLength));\n            };\n\n            $(dependencies.join(',')).keyup(populate).change(populate).focus(populate);\n        });\n    };\n})(django.jQuery);\n"
  },
  {
    "path": "selfblog/static/admin/js/timeparse.js",
    "content": "var timeParsePatterns = [\n    // 9\n    {   re: /^\\d{1,2}$/i,\n        handler: function(bits) {\n            if (bits[0].length == 1) {\n                return '0' + bits[0] + ':00';\n            } else {\n                return bits[0] + ':00';\n            }\n        }\n    },\n    // 13:00\n    {   re: /^\\d{2}[:.]\\d{2}$/i,\n        handler: function(bits) {\n            return bits[0].replace('.', ':');\n        }\n    },\n    // 9:00\n    {   re: /^\\d[:.]\\d{2}$/i,\n        handler: function(bits) {\n            return '0' + bits[0].replace('.', ':');\n        }\n    },\n    // 3 am / 3 a.m. / 3am\n    {   re: /^(\\d+)\\s*([ap])(?:.?m.?)?$/i,\n        handler: function(bits) {\n            var hour = parseInt(bits[1]);\n            if (hour == 12) {\n                hour = 0;\n            }\n            if (bits[2].toLowerCase() == 'p') {\n                if (hour == 12) {\n                    hour = 0;\n                }\n                return (hour + 12) + ':00';\n            } else {\n                if (hour < 10) {\n                    return '0' + hour + ':00';\n                } else {\n                    return hour + ':00';\n                }\n            }\n        }\n    },\n    // 3.30 am / 3:15 a.m. / 3.00am\n    {   re: /^(\\d+)[.:](\\d{2})\\s*([ap]).?m.?$/i,\n        handler: function(bits) {\n            var hour = parseInt(bits[1]);\n            var mins = parseInt(bits[2]);\n            if (mins < 10) {\n                mins = '0' + mins;\n            }\n            if (hour == 12) {\n                hour = 0;\n            }\n            if (bits[3].toLowerCase() == 'p') {\n                if (hour == 12) {\n                    hour = 0;\n                }\n                return (hour + 12) + ':' + mins;\n            } else {\n                if (hour < 10) {\n                    return '0' + hour + ':' + mins;\n                } else {\n                    return hour + ':' + mins;\n                }\n            }\n        }\n    },\n    // noon\n    {   re: /^no/i,\n        handler: function(bits) {\n            return '12:00';\n        }\n    },\n    // midnight\n    {   re: /^mid/i,\n        handler: function(bits) {\n            return '00:00';\n        }\n    }\n];\n\nfunction parseTimeString(s) {\n    for (var i = 0; i < timeParsePatterns.length; i++) {\n        var re = timeParsePatterns[i].re;\n        var handler = timeParsePatterns[i].handler;\n        var bits = re.exec(s);\n        if (bits) {\n            return handler(bits);\n        }\n    }\n    return s;\n}\n"
  },
  {
    "path": "selfblog/static/admin/js/urlify.js",
    "content": "var LATIN_MAP = {\n    'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç':\n    'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',\n    'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö':\n    'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',\n    'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä':\n    'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',\n    'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó':\n    'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',\n    'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'\n}\nvar LATIN_SYMBOLS_MAP = {\n    '©':'(c)'\n}\nvar GREEK_MAP = {\n    'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',\n    'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',\n    'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',\n    'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',\n    'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',\n    'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',\n    'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',\n    'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',\n    'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',\n    'Ϋ':'Y'\n}\nvar TURKISH_MAP = {\n    'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',\n    'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'\n}\nvar RUSSIAN_MAP = {\n    'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',\n    'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',\n    'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',\n    'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu',\n    'я':'ya',\n    'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',\n    'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',\n    'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',\n    'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu',\n    'Я':'Ya'\n}\nvar UKRAINIAN_MAP = {\n    'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g'\n}\nvar CZECH_MAP = {\n    'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u',\n    'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T',\n    'Ů':'U', 'Ž':'Z'\n}\n\nvar POLISH_MAP = {\n    'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z',\n    'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'e', 'Ł':'L', 'Ń':'N', 'Ó':'o', 'Ś':'S',\n    'Ź':'Z', 'Ż':'Z'\n}\n\nvar LATVIAN_MAP = {\n    'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n',\n    'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'i',\n    'Ķ':'k', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'u', 'Ž':'Z'\n}\n\nvar ALL_DOWNCODE_MAPS=new Array()\nALL_DOWNCODE_MAPS[0]=LATIN_MAP\nALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP\nALL_DOWNCODE_MAPS[2]=GREEK_MAP\nALL_DOWNCODE_MAPS[3]=TURKISH_MAP\nALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP\nALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP\nALL_DOWNCODE_MAPS[6]=CZECH_MAP\nALL_DOWNCODE_MAPS[7]=POLISH_MAP\nALL_DOWNCODE_MAPS[8]=LATVIAN_MAP\n\nvar Downcoder = new Object();\nDowncoder.Initialize = function()\n{\n    if (Downcoder.map) // already made\n        return ;\n    Downcoder.map ={}\n    Downcoder.chars = '' ;\n    for(var i in ALL_DOWNCODE_MAPS)\n    {\n        var lookup = ALL_DOWNCODE_MAPS[i]\n        for (var c in lookup)\n        {\n            Downcoder.map[c] = lookup[c] ;\n            Downcoder.chars += c ;\n        }\n     }\n    Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ;\n}\n\ndowncode= function( slug )\n{\n    Downcoder.Initialize() ;\n    var downcoded =\"\"\n    var pieces = slug.match(Downcoder.regex);\n    if(pieces)\n    {\n        for (var i = 0 ; i < pieces.length ; i++)\n        {\n            if (pieces[i].length == 1)\n            {\n                var mapped = Downcoder.map[pieces[i]] ;\n                if (mapped != null)\n                {\n                    downcoded+=mapped;\n                    continue ;\n                }\n            }\n            downcoded+=pieces[i];\n        }\n    }\n    else\n    {\n        downcoded = slug;\n    }\n    return downcoded;\n}\n\n\nfunction URLify(s, num_chars) {\n    // changes, e.g., \"Petty theft\" to \"petty_theft\"\n    // remove all these words from the string before urlifying\n    s = downcode(s);\n    removelist = [\"a\", \"an\", \"as\", \"at\", \"before\", \"but\", \"by\", \"for\", \"from\",\n                  \"is\", \"in\", \"into\", \"like\", \"of\", \"off\", \"on\", \"onto\", \"per\",\n                  \"since\", \"than\", \"the\", \"this\", \"that\", \"to\", \"up\", \"via\",\n                  \"with\"];\n    r = new RegExp('\\\\b(' + removelist.join('|') + ')\\\\b', 'gi');\n    s = s.replace(r, '');\n    // if downcode doesn't hit, the char will be stripped here\n    s = s.replace(/[^-\\w\\s]/g, '');  // remove unneeded chars\n    s = s.replace(/^\\s+|\\s+$/g, ''); // trim leading/trailing spaces\n    s = s.replace(/[-\\s]+/g, '-');   // convert spaces to hyphens\n    s = s.toLowerCase();             // convert to lowercase\n    return s.substring(0, num_chars);// trim to first num_chars chars\n}\n\n"
  },
  {
    "path": "selfblog/static/blog/css/code.css",
    "content": "/*\n * :Author: David Goodger (goodger@python.org)\n * :Id: $Id$\n * :Copyright: This stylesheet has been placed in the public domain.\n *\n * Default cascading style sheet for the HTML output of Docutils.\n *\n * See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to\n * customize this style sheet.\n * */\n\n/* used to remove borders from tables and images */\n.borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for \"table.docutils td\" with \"! important\".  *      The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with \"! important\". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } object[type=\"image/svg+xml\"], object[type=\"application/x-shockwave-flash\"] { overflow: hidden; } /* Uncomment (and remove this text!) to get bold-faced definition list terms * dl.docutils dt { *   font-weight: bold } *   */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title, .code .error { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in *    compound paragraphs.  *    div.compound .compound-first, div.compound .compound-middle { *      margin-bottom: 0.5em } * *      div.compound .compound-last, div.compound .compound-middle { *        margin-top: 0.5em } *        */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left, .figure.align-left, object.align-left { clear: left ; float: left ; margin-right: 1em } img.align-right, .figure.align-right, object.align-right { clear: right ; float: right ; margin-left: 1em } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left } .align-center { clear: both ; text-align: center } .align-right { text-align: right } /* reset inner alignment in figures */ div.align-right { text-align: inherit } /* div.align-center * { */ /*   text-align: left } */ ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font: inherit } pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } pre.code .ln { color: grey; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } pre.code .literal.string, code .literal.string { color: #0C5404 } pre.code .name.builtin, code .name.builtin { color: #352B84 } pre.code .deleted, code .deleted { background-color: #DEB0A1} pre.code .inserted, code .inserted { background-color: #A3D289} span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; padding-left: 0 } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } ul.auto-toc { list-style-type: none } \n"
  },
  {
    "path": "selfblog/static/blog/css/codehilite.css",
    "content": ".codehilite .hll { background-color: #ffffcc }\n.codehilite  { background: #f8f8f8; }\n.codehilite .c { color: #408080; font-style: italic } /* Comment */\n.codehilite .err { border: 1px solid #FF0000 } /* Error */\n.codehilite .k { color: #008000; font-weight: bold } /* Keyword */\n.codehilite .o { color: #666666 } /* Operator */\n.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */\n.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */\n.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */\n.codehilite .gd { color: #A00000 } /* Generic.Deleted */\n.codehilite .ge { font-style: italic } /* Generic.Emph */\n.codehilite .gr { color: #FF0000 } /* Generic.Error */\n.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.codehilite .gi { color: #00A000 } /* Generic.Inserted */\n.codehilite .go { color: #808080 } /* Generic.Output */\n.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.codehilite .gs { font-weight: bold } /* Generic.Strong */\n.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.codehilite .gt { color: #0040D0 } /* Generic.Traceback */\n.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.codehilite .kp { color: #008000 } /* Keyword.Pseudo */\n.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.codehilite .kt { color: #B00040 } /* Keyword.Type */\n.codehilite .m { color: #666666 } /* Literal.Number */\n.codehilite .s { color: #BA2121 } /* Literal.String */\n.codehilite .na { color: #7D9029 } /* Name.Attribute */\n.codehilite .nb { color: #008000 } /* Name.Builtin */\n.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n.codehilite .no { color: #880000 } /* Name.Constant */\n.codehilite .nd { color: #AA22FF } /* Name.Decorator */\n.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */\n.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n.codehilite .nf { color: #0000FF } /* Name.Function */\n.codehilite .nl { color: #A0A000 } /* Name.Label */\n.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.codehilite .nv { color: #19177C } /* Name.Variable */\n.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n.codehilite .w { color: #bbbbbb } /* Text.Whitespace */\n.codehilite .mf { color: #666666 } /* Literal.Number.Float */\n.codehilite .mh { color: #666666 } /* Literal.Number.Hex */\n.codehilite .mi { color: #666666 } /* Literal.Number.Integer */\n.codehilite .mo { color: #666666 } /* Literal.Number.Oct */\n.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */\n.codehilite .sc { color: #BA2121 } /* Literal.String.Char */\n.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */\n.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n.codehilite .sx { color: #008000 } /* Literal.String.Other */\n.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */\n.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */\n.codehilite .ss { color: #19177C } /* Literal.String.Symbol */\n.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.codehilite .vc { color: #19177C } /* Name.Variable.Class */\n.codehilite .vg { color: #19177C } /* Name.Variable.Global */\n.codehilite .vi { color: #19177C } /* Name.Variable.Instance */\n.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */\n"
  },
  {
    "path": "selfblog/static/blog/css/style.css",
    "content": "body {\n    background-color:#e8e8e8;\n}\n#content {\n    background-color:#fff;\n    padding:0 30px;\n    border:1px solid #bbb;\n    border-bottom-color:#aaa;\n    box-shadow:0 1px 4px rgba(0, 0, 0, 0.25);\n}\n.line {\n    margin-left: 2px;\n    position: absolute;\n}\n\n.under_line {\n    border-bottom:1px solid #333;\n}\n\n.clear {\n    clear:both;\n}\n\nheader {\n    margin-top:20px;\n}\n\n.hightline {\n    color:red;\n}\n\nh1 {\n    font-size:18px;\n}\nh1 a {\n    color:#222;\n    font:18px 微软雅黑,PMingLiU,Verdana,Arial,Helvetica,sans-serif;\n}\n\nheader h1 {\n    margin-bottom:0;\n}\n\n#blogdesc {\n    font-size:13px;\n    color:#666;\n}\n\n#search_box {\n    margin-top: 18px;\n    float: right;\n}\n\n#searchform {\n    background: #DADADA;\n    border-radius: 3px;\n    padding: 3px;\n}\n\n#searchform input {\n    width: 153px;\n    height: 24px;\n    line-height: 24px;\n    vertical-align: middle;\n    padding: 0 5px;\n}\n\n#searchform button, #searchform #searchsubmit {\n    width: 48px;\n    text-align: center;\n    height: 24px;\n    line-height: 24px;\n    background: #666;\n    margin-left: -4px;\n    border: none;\n    color: white;\n    cursor: pointer;\n    vertical-align: middle;\n    text-shadow: 1px 1px #333;\n}\n\n.subnav{\n    height:35px;\n}\n\n.subnav ul.nav {\n    margin-bottom:10px;\n}\n\n.subnav ul.nav li {\n    font-weight:bold;\n    border-bottom: #eee 1px solid;\n    color: #555;\n    background-color:#efefef;\n    border-right: 3px solid #fff;\n}\n.subnav ul.nav li a {\n    color:#555;\n}\n\n.subnav ul.nav li:hover {\n    background-color:#ddd;\n}\n\n.subnav ul.nav li a:hover {\n    color:#08c;\n    background-color:inherit;\n}\n\n.article h2, .sidebar h3 {\n    margin:5px 0;\n    font-size: 16px;\n    height: 24px;\n    padding-left: 10px;\n    padding-bottom: 10px;\n}\n\n.article h2 a:link, .article h2 a:visited {\n    color: #333;\n    text-decoration:none;\n}\n\n.article h2 a:hover {\n    color:#005580;\n}\n\n.article .entry_post {\n    padding:10px;\n}\n\n.article .entry_post p {\n    text-indent:2em;\n}\n\n.info {\n    font-size: 12px;\n    color:#757575;\n}\n\n\n/* detail css */\n.detail h2 {\n    margin:10px 0 0 0;\n    font-size: 16px;\n    height: 24px;\n    padding-bottom: 10px;\n}\n\n.detail .info {\n    color:#777;\n}\n\n.detail .content {\n    padding:20px 0;\n    font-size:15px;\n}\n\n.detail .content p {\n    padding: 5px 0px;\n    margin: 0 0 18px;\n    line-height: 26px;\n}\n.detail .box {\n    padding:10px 0;\n    border-bottom:1px #DDD solid;\n}\n\n.content img, .content a img {\n    margin: 0 auto;\n    display: block;\n}\n\n.content h1 {\n    font-size:120%;\n}\n.content h2 {\n    font-size:118%;\n}\n.content h3 {\n    font-size:116%;\n}\n.content h4 {\n    font-size:114%;\n}\n.content h5 {\n    font-size:110%;\n}\n\n/*widget 配置*/\n.sidebar .widget h3 {\n    font-size:14px;\n}\n\n.sidebar ul {\n    margin:0px;\n}\n\n.sidebar ul li {\n    list-style:none;\n    padding:2px;\n}\n\n/*code*/\n.docutils {\n    color: rgb(48, 206, 103);\n}\n"
  },
  {
    "path": "selfblog/static/blog/js/prettify.js",
    "content": "// Copyright (C) 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview\n * some functions for browser-side pretty printing of code contained in html.\n *\n * <p>\n * For a fairly comprehensive set of languages see the\n * <a href=\"http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs\">README</a>\n * file that came with this source.  At a minimum, the lexer should work on a\n * number of languages including C and friends, Java, Python, Bash, SQL, HTML,\n * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk\n * and a subset of Perl, but, because of commenting conventions, doesn't work on\n * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.\n * <p>\n * Usage: <ol>\n * <li> include this source file in an html page via\n *   {@code <script type=\"text/javascript\" src=\"/path/to/prettify.js\"></script>}\n * <li> define style rules.  See the example page for examples.\n * <li> mark the {@code <pre>} and {@code <code>} tags in your source with\n *    {@code class=prettyprint.}\n *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty\n *    printer needs to do more substantial DOM manipulations to support that, so\n *    some css styles may not be preserved.\n * </ol>\n * That's it.  I wanted to keep the API as simple as possible, so there's no\n * need to specify which language the code is in, but if you wish, you can add\n * another class to the {@code <pre>} or {@code <code>} element to specify the\n * language, as in {@code <pre class=\"prettyprint lang-java\">}.  Any class that\n * starts with \"lang-\" followed by a file extension, specifies the file type.\n * See the \"lang-*.js\" files in this directory for code that implements\n * per-language file handlers.\n * <p>\n * Change log:<br>\n * cbeust, 2006/08/22\n * <blockquote>\n *   Java annotations (start with \"@\") are now captured as literals (\"lit\")\n * </blockquote>\n * @requires console\n */\n\n// JSLint declarations\n/*global console, document, navigator, setTimeout, window */\n\n/**\n * Split {@code prettyPrint} into multiple timeouts so as not to interfere with\n * UI events.\n * If set to {@code false}, {@code prettyPrint()} is synchronous.\n */\nwindow['PR_SHOULD_USE_CONTINUATION'] = true;\n\n(function () {\n  // Keyword lists for various languages.\n  // We use things that coerce to strings to make them compact when minified\n  // and to defeat aggressive optimizers that fold large string constants.\n  var FLOW_CONTROL_KEYWORDS = [\"break,continue,do,else,for,if,return,while\"];\n  var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,\"auto,case,char,const,default,\" + \n      \"double,enum,extern,float,goto,int,long,register,short,signed,sizeof,\" +\n      \"static,struct,switch,typedef,union,unsigned,void,volatile\"];\n  var COMMON_KEYWORDS = [C_KEYWORDS,\"catch,class,delete,false,import,\" +\n      \"new,operator,private,protected,public,this,throw,true,try,typeof\"];\n  var CPP_KEYWORDS = [COMMON_KEYWORDS,\"alignof,align_union,asm,axiom,bool,\" +\n      \"concept,concept_map,const_cast,constexpr,decltype,\" +\n      \"dynamic_cast,explicit,export,friend,inline,late_check,\" +\n      \"mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,\" +\n      \"template,typeid,typename,using,virtual,where\"];\n  var JAVA_KEYWORDS = [COMMON_KEYWORDS,\n      \"abstract,boolean,byte,extends,final,finally,implements,import,\" +\n      \"instanceof,null,native,package,strictfp,super,synchronized,throws,\" +\n      \"transient\"];\n  var CSHARP_KEYWORDS = [JAVA_KEYWORDS,\n      \"as,base,by,checked,decimal,delegate,descending,dynamic,event,\" +\n      \"fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,\" +\n      \"object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,\" +\n      \"stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"];\n  var COFFEE_KEYWORDS = \"all,and,by,catch,class,else,extends,false,finally,\" +\n      \"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,\" +\n      \"true,try,unless,until,when,while,yes\";\n  var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,\n      \"debugger,eval,export,function,get,null,set,undefined,var,with,\" +\n      \"Infinity,NaN\"];\n  var PERL_KEYWORDS = \"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,\" +\n      \"goto,if,import,last,local,my,next,no,our,print,package,redo,require,\" +\n      \"sub,undef,unless,until,use,wantarray,while,BEGIN,END\";\n  var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"and,as,assert,class,def,del,\" +\n      \"elif,except,exec,finally,from,global,import,in,is,lambda,\" +\n      \"nonlocal,not,or,pass,print,raise,try,with,yield,\" +\n      \"False,True,None\"];\n  var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"alias,and,begin,case,class,\" +\n      \"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,\" +\n      \"rescue,retry,self,super,then,true,undef,unless,until,when,yield,\" +\n      \"BEGIN,END\"];\n  var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, \"case,done,elif,esac,eval,fi,\" +\n      \"function,in,local,set,then,until\"];\n  var ALL_KEYWORDS = [\n      CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +\n      PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS];\n  var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/;\n\n  // token style names.  correspond to css classes\n  /**\n   * token style for a string literal\n   * @const\n   */\n  var PR_STRING = 'str';\n  /**\n   * token style for a keyword\n   * @const\n   */\n  var PR_KEYWORD = 'kwd';\n  /**\n   * token style for a comment\n   * @const\n   */\n  var PR_COMMENT = 'com';\n  /**\n   * token style for a type\n   * @const\n   */\n  var PR_TYPE = 'typ';\n  /**\n   * token style for a literal value.  e.g. 1, null, true.\n   * @const\n   */\n  var PR_LITERAL = 'lit';\n  /**\n   * token style for a punctuation string.\n   * @const\n   */\n  var PR_PUNCTUATION = 'pun';\n  /**\n   * token style for a punctuation string.\n   * @const\n   */\n  var PR_PLAIN = 'pln';\n\n  /**\n   * token style for an sgml tag.\n   * @const\n   */\n  var PR_TAG = 'tag';\n  /**\n   * token style for a markup declaration such as a DOCTYPE.\n   * @const\n   */\n  var PR_DECLARATION = 'dec';\n  /**\n   * token style for embedded source.\n   * @const\n   */\n  var PR_SOURCE = 'src';\n  /**\n   * token style for an sgml attribute name.\n   * @const\n   */\n  var PR_ATTRIB_NAME = 'atn';\n  /**\n   * token style for an sgml attribute value.\n   * @const\n   */\n  var PR_ATTRIB_VALUE = 'atv';\n\n  /**\n   * A class that indicates a section of markup that is not code, e.g. to allow\n   * embedding of line numbers within code listings.\n   * @const\n   */\n  var PR_NOCODE = 'nocode';\n\n\n\n/**\n * A set of tokens that can precede a regular expression literal in\n * javascript\n * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html\n * has the full list, but I've removed ones that might be problematic when\n * seen in languages that don't support regular expression literals.\n *\n * <p>Specifically, I've removed any keywords that can't precede a regexp\n * literal in a syntactically legal javascript program, and I've removed the\n * \"in\" keyword since it's not a keyword in many languages, and might be used\n * as a count of inches.\n *\n * <p>The link a above does not accurately describe EcmaScript rules since\n * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works\n * very well in practice.\n *\n * @private\n * @const\n */\nvar REGEXP_PRECEDER_PATTERN = '(?:^^\\\\.?|[+-]|\\\\!|\\\\!=|\\\\!==|\\\\#|\\\\%|\\\\%=|&|&&|&&=|&=|\\\\(|\\\\*|\\\\*=|\\\\+=|\\\\,|\\\\-=|\\\\->|\\\\/|\\\\/=|:|::|\\\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\@|\\\\[|\\\\^|\\\\^=|\\\\^\\\\^|\\\\^\\\\^=|\\\\{|\\\\||\\\\|=|\\\\|\\\\||\\\\|\\\\|=|\\\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*';\n\n// CAVEAT: this does not properly handle the case where a regular\n// expression immediately follows another since a regular expression may\n// have flags for case-sensitivity and the like.  Having regexp tokens\n// adjacent is not valid in any language I'm aware of, so I'm punting.\n// TODO: maybe style special characters inside a regexp as punctuation.\n\n\n  /**\n   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally\n   * matches the union of the sets of strings matched by the input RegExp.\n   * Since it matches globally, if the input strings have a start-of-input\n   * anchor (/^.../), it is ignored for the purposes of unioning.\n   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.\n   * @return {RegExp} a global regex.\n   */\n  function combinePrefixPatterns(regexs) {\n    var capturedGroupIndex = 0;\n  \n    var needToFoldCase = false;\n    var ignoreCase = false;\n    for (var i = 0, n = regexs.length; i < n; ++i) {\n      var regex = regexs[i];\n      if (regex.ignoreCase) {\n        ignoreCase = true;\n      } else if (/[a-z]/i.test(regex.source.replace(\n                     /\\\\u[0-9a-f]{4}|\\\\x[0-9a-f]{2}|\\\\[^ux]/gi, ''))) {\n        needToFoldCase = true;\n        ignoreCase = false;\n        break;\n      }\n    }\n  \n    var escapeCharToCodeUnit = {\n      'b': 8,\n      't': 9,\n      'n': 0xa,\n      'v': 0xb,\n      'f': 0xc,\n      'r': 0xd\n    };\n  \n    function decodeEscape(charsetPart) {\n      var cc0 = charsetPart.charCodeAt(0);\n      if (cc0 !== 92 /* \\\\ */) {\n        return cc0;\n      }\n      var c1 = charsetPart.charAt(1);\n      cc0 = escapeCharToCodeUnit[c1];\n      if (cc0) {\n        return cc0;\n      } else if ('0' <= c1 && c1 <= '7') {\n        return parseInt(charsetPart.substring(1), 8);\n      } else if (c1 === 'u' || c1 === 'x') {\n        return parseInt(charsetPart.substring(2), 16);\n      } else {\n        return charsetPart.charCodeAt(1);\n      }\n    }\n  \n    function encodeEscape(charCode) {\n      if (charCode < 0x20) {\n        return (charCode < 0x10 ? '\\\\x0' : '\\\\x') + charCode.toString(16);\n      }\n      var ch = String.fromCharCode(charCode);\n      if (ch === '\\\\' || ch === '-' || ch === '[' || ch === ']') {\n        ch = '\\\\' + ch;\n      }\n      return ch;\n    }\n  \n    function caseFoldCharset(charSet) {\n      var charsetParts = charSet.substring(1, charSet.length - 1).match(\n          new RegExp(\n              '\\\\\\\\u[0-9A-Fa-f]{4}'\n              + '|\\\\\\\\x[0-9A-Fa-f]{2}'\n              + '|\\\\\\\\[0-3][0-7]{0,2}'\n              + '|\\\\\\\\[0-7]{1,2}'\n              + '|\\\\\\\\[\\\\s\\\\S]'\n              + '|-'\n              + '|[^-\\\\\\\\]',\n              'g'));\n      var groups = [];\n      var ranges = [];\n      var inverse = charsetParts[0] === '^';\n      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {\n        var p = charsetParts[i];\n        if (/\\\\[bdsw]/i.test(p)) {  // Don't muck with named groups.\n          groups.push(p);\n        } else {\n          var start = decodeEscape(p);\n          var end;\n          if (i + 2 < n && '-' === charsetParts[i + 1]) {\n            end = decodeEscape(charsetParts[i + 2]);\n            i += 2;\n          } else {\n            end = start;\n          }\n          ranges.push([start, end]);\n          // If the range might intersect letters, then expand it.\n          // This case handling is too simplistic.\n          // It does not deal with non-latin case folding.\n          // It works for latin source code identifiers though.\n          if (!(end < 65 || start > 122)) {\n            if (!(end < 65 || start > 90)) {\n              ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);\n            }\n            if (!(end < 97 || start > 122)) {\n              ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);\n            }\n          }\n        }\n      }\n  \n      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]\n      // -> [[1, 12], [14, 14], [16, 17]]\n      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });\n      var consolidatedRanges = [];\n      var lastRange = [NaN, NaN];\n      for (var i = 0; i < ranges.length; ++i) {\n        var range = ranges[i];\n        if (range[0] <= lastRange[1] + 1) {\n          lastRange[1] = Math.max(lastRange[1], range[1]);\n        } else {\n          consolidatedRanges.push(lastRange = range);\n        }\n      }\n  \n      var out = ['['];\n      if (inverse) { out.push('^'); }\n      out.push.apply(out, groups);\n      for (var i = 0; i < consolidatedRanges.length; ++i) {\n        var range = consolidatedRanges[i];\n        out.push(encodeEscape(range[0]));\n        if (range[1] > range[0]) {\n          if (range[1] + 1 > range[0]) { out.push('-'); }\n          out.push(encodeEscape(range[1]));\n        }\n      }\n      out.push(']');\n      return out.join('');\n    }\n  \n    function allowAnywhereFoldCaseAndRenumberGroups(regex) {\n      // Split into character sets, escape sequences, punctuation strings\n      // like ('(', '(?:', ')', '^'), and runs of characters that do not\n      // include any of the above.\n      var parts = regex.source.match(\n          new RegExp(\n              '(?:'\n              + '\\\\[(?:[^\\\\x5C\\\\x5D]|\\\\\\\\[\\\\s\\\\S])*\\\\]'  // a character set\n              + '|\\\\\\\\u[A-Fa-f0-9]{4}'  // a unicode escape\n              + '|\\\\\\\\x[A-Fa-f0-9]{2}'  // a hex escape\n              + '|\\\\\\\\[0-9]+'  // a back-reference or octal escape\n              + '|\\\\\\\\[^ux0-9]'  // other escape sequence\n              + '|\\\\(\\\\?[:!=]'  // start of a non-capturing group\n              + '|[\\\\(\\\\)\\\\^]'  // start/emd of a group, or line start\n              + '|[^\\\\x5B\\\\x5C\\\\(\\\\)\\\\^]+'  // run of other characters\n              + ')',\n              'g'));\n      var n = parts.length;\n  \n      // Maps captured group numbers to the number they will occupy in\n      // the output or to -1 if that has not been determined, or to\n      // undefined if they need not be capturing in the output.\n      var capturedGroups = [];\n  \n      // Walk over and identify back references to build the capturedGroups\n      // mapping.\n      for (var i = 0, groupIndex = 0; i < n; ++i) {\n        var p = parts[i];\n        if (p === '(') {\n          // groups are 1-indexed, so max group index is count of '('\n          ++groupIndex;\n        } else if ('\\\\' === p.charAt(0)) {\n          var decimalValue = +p.substring(1);\n          if (decimalValue && decimalValue <= groupIndex) {\n            capturedGroups[decimalValue] = -1;\n          }\n        }\n      }\n  \n      // Renumber groups and reduce capturing groups to non-capturing groups\n      // where possible.\n      for (var i = 1; i < capturedGroups.length; ++i) {\n        if (-1 === capturedGroups[i]) {\n          capturedGroups[i] = ++capturedGroupIndex;\n        }\n      }\n      for (var i = 0, groupIndex = 0; i < n; ++i) {\n        var p = parts[i];\n        if (p === '(') {\n          ++groupIndex;\n          if (capturedGroups[groupIndex] === undefined) {\n            parts[i] = '(?:';\n          }\n        } else if ('\\\\' === p.charAt(0)) {\n          var decimalValue = +p.substring(1);\n          if (decimalValue && decimalValue <= groupIndex) {\n            parts[i] = '\\\\' + capturedGroups[groupIndex];\n          }\n        }\n      }\n  \n      // Remove any prefix anchors so that the output will match anywhere.\n      // ^^ really does mean an anchored match though.\n      for (var i = 0, groupIndex = 0; i < n; ++i) {\n        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }\n      }\n  \n      // Expand letters to groups to handle mixing of case-sensitive and\n      // case-insensitive patterns if necessary.\n      if (regex.ignoreCase && needToFoldCase) {\n        for (var i = 0; i < n; ++i) {\n          var p = parts[i];\n          var ch0 = p.charAt(0);\n          if (p.length >= 2 && ch0 === '[') {\n            parts[i] = caseFoldCharset(p);\n          } else if (ch0 !== '\\\\') {\n            // TODO: handle letters in numeric escapes.\n            parts[i] = p.replace(\n                /[a-zA-Z]/g,\n                function (ch) {\n                  var cc = ch.charCodeAt(0);\n                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';\n                });\n          }\n        }\n      }\n  \n      return parts.join('');\n    }\n  \n    var rewritten = [];\n    for (var i = 0, n = regexs.length; i < n; ++i) {\n      var regex = regexs[i];\n      if (regex.global || regex.multiline) { throw new Error('' + regex); }\n      rewritten.push(\n          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');\n    }\n  \n    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');\n  }\n\n\n  /**\n   * Split markup into a string of source code and an array mapping ranges in\n   * that string to the text nodes in which they appear.\n   *\n   * <p>\n   * The HTML DOM structure:</p>\n   * <pre>\n   * (Element   \"p\"\n   *   (Element \"b\"\n   *     (Text  \"print \"))       ; #1\n   *   (Text    \"'Hello '\")      ; #2\n   *   (Element \"br\")            ; #3\n   *   (Text    \"  + 'World';\")) ; #4\n   * </pre>\n   * <p>\n   * corresponds to the HTML\n   * {@code <p><b>print </b>'Hello '<br>  + 'World';</p>}.</p>\n   *\n   * <p>\n   * It will produce the output:</p>\n   * <pre>\n   * {\n   *   sourceCode: \"print 'Hello '\\n  + 'World';\",\n   *   //                 1         2\n   *   //       012345678901234 5678901234567\n   *   spans: [0, #1, 6, #2, 14, #3, 15, #4]\n   * }\n   * </pre>\n   * <p>\n   * where #1 is a reference to the {@code \"print \"} text node above, and so\n   * on for the other text nodes.\n   * </p>\n   *\n   * <p>\n   * The {@code} spans array is an array of pairs.  Even elements are the start\n   * indices of substrings, and odd elements are the text nodes (or BR elements)\n   * that contain the text for those substrings.\n   * Substrings continue until the next index or the end of the source.\n   * </p>\n   *\n   * @param {Node} node an HTML DOM subtree containing source-code.\n   * @return {Object} source code and the text nodes in which they occur.\n   */\n  function extractSourceSpans(node) {\n    var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n  \n    var chunks = [];\n    var length = 0;\n    var spans = [];\n    var k = 0;\n  \n    var whitespace;\n    if (node.currentStyle) {\n      whitespace = node.currentStyle.whiteSpace;\n    } else if (window.getComputedStyle) {\n      whitespace = document.defaultView.getComputedStyle(node, null)\n          .getPropertyValue('white-space');\n    }\n    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);\n  \n    function walk(node) {\n      switch (node.nodeType) {\n        case 1:  // Element\n          if (nocode.test(node.className)) { return; }\n          for (var child = node.firstChild; child; child = child.nextSibling) {\n            walk(child);\n          }\n          var nodeName = node.nodeName;\n          if ('BR' === nodeName || 'LI' === nodeName) {\n            chunks[k] = '\\n';\n            spans[k << 1] = length++;\n            spans[(k++ << 1) | 1] = node;\n          }\n          break;\n        case 3: case 4:  // Text\n          var text = node.nodeValue;\n          if (text.length) {\n            if (!isPreformatted) {\n              text = text.replace(/[ \\t\\r\\n]+/g, ' ');\n            } else {\n              text = text.replace(/\\r\\n?/g, '\\n');  // Normalize newlines.\n            }\n            // TODO: handle tabs here?\n            chunks[k] = text;\n            spans[k << 1] = length;\n            length += text.length;\n            spans[(k++ << 1) | 1] = node;\n          }\n          break;\n      }\n    }\n  \n    walk(node);\n  \n    return {\n      sourceCode: chunks.join('').replace(/\\n$/, ''),\n      spans: spans\n    };\n  }\n\n\n  /**\n   * Apply the given language handler to sourceCode and add the resulting\n   * decorations to out.\n   * @param {number} basePos the index of sourceCode within the chunk of source\n   *    whose decorations are already present on out.\n   */\n  function appendDecorations(basePos, sourceCode, langHandler, out) {\n    if (!sourceCode) { return; }\n    var job = {\n      sourceCode: sourceCode,\n      basePos: basePos\n    };\n    langHandler(job);\n    out.push.apply(out, job.decorations);\n  }\n\n  var notWs = /\\S/;\n\n  /**\n   * Given an element, if it contains only one child element and any text nodes\n   * it contains contain only space characters, return the sole child element.\n   * Otherwise returns undefined.\n   * <p>\n   * This is meant to return the CODE element in {@code <pre><code ...>} when\n   * there is a single child element that contains all the non-space textual\n   * content, but not to return anything where there are multiple child elements\n   * as in {@code <pre><code>...</code><code>...</code></pre>} or when there\n   * is textual content.\n   */\n  function childContentWrapper(element) {\n    var wrapper = undefined;\n    for (var c = element.firstChild; c; c = c.nextSibling) {\n      var type = c.nodeType;\n      wrapper = (type === 1)  // Element Node\n          ? (wrapper ? element : c)\n          : (type === 3)  // Text Node\n          ? (notWs.test(c.nodeValue) ? element : wrapper)\n          : wrapper;\n    }\n    return wrapper === element ? undefined : wrapper;\n  }\n\n  /** Given triples of [style, pattern, context] returns a lexing function,\n    * The lexing function interprets the patterns to find token boundaries and\n    * returns a decoration list of the form\n    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]\n    * where index_n is an index into the sourceCode, and style_n is a style\n    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to\n    * all characters in sourceCode[index_n-1:index_n].\n    *\n    * The stylePatterns is a list whose elements have the form\n    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].\n    *\n    * Style is a style constant like PR_PLAIN, or can be a string of the\n    * form 'lang-FOO', where FOO is a language extension describing the\n    * language of the portion of the token in $1 after pattern executes.\n    * E.g., if style is 'lang-lisp', and group 1 contains the text\n    * '(hello (world))', then that portion of the token will be passed to the\n    * registered lisp handler for formatting.\n    * The text before and after group 1 will be restyled using this decorator\n    * so decorators should take care that this doesn't result in infinite\n    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks\n    * something like ['lang-js', /<[s]cript>(.+?)<\\/script>/].  This may match\n    * '<script>foo()<\\/script>', which would cause the current decorator to\n    * be called with '<script>' which would not match the same rule since\n    * group 1 must not be empty, so it would be instead styled as PR_TAG by\n    * the generic tag rule.  The handler registered for the 'js' extension would\n    * then be called with 'foo()', and finally, the current decorator would\n    * be called with '<\\/script>' which would not match the original rule and\n    * so the generic tag rule would identify it as a tag.\n    *\n    * Pattern must only match prefixes, and if it matches a prefix, then that\n    * match is considered a token with the same style.\n    *\n    * Context is applied to the last non-whitespace, non-comment token\n    * recognized.\n    *\n    * Shortcut is an optional string of characters, any of which, if the first\n    * character, gurantee that this pattern and only this pattern matches.\n    *\n    * @param {Array} shortcutStylePatterns patterns that always start with\n    *   a known character.  Must have a shortcut string.\n    * @param {Array} fallthroughStylePatterns patterns that will be tried in\n    *   order if the shortcut ones fail.  May have shortcuts.\n    *\n    * @return {function (Object)} a\n    *   function that takes source code and returns a list of decorations.\n    */\n  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {\n    var shortcuts = {};\n    var tokenizer;\n    (function () {\n      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);\n      var allRegexs = [];\n      var regexKeys = {};\n      for (var i = 0, n = allPatterns.length; i < n; ++i) {\n        var patternParts = allPatterns[i];\n        var shortcutChars = patternParts[3];\n        if (shortcutChars) {\n          for (var c = shortcutChars.length; --c >= 0;) {\n            shortcuts[shortcutChars.charAt(c)] = patternParts;\n          }\n        }\n        var regex = patternParts[1];\n        var k = '' + regex;\n        if (!regexKeys.hasOwnProperty(k)) {\n          allRegexs.push(regex);\n          regexKeys[k] = null;\n        }\n      }\n      allRegexs.push(/[\\0-\\uffff]/);\n      tokenizer = combinePrefixPatterns(allRegexs);\n    })();\n\n    var nPatterns = fallthroughStylePatterns.length;\n\n    /**\n     * Lexes job.sourceCode and produces an output array job.decorations of\n     * style classes preceded by the position at which they start in\n     * job.sourceCode in order.\n     *\n     * @param {Object} job an object like <pre>{\n     *    sourceCode: {string} sourceText plain text,\n     *    basePos: {int} position of job.sourceCode in the larger chunk of\n     *        sourceCode.\n     * }</pre>\n     */\n    var decorate = function (job) {\n      var sourceCode = job.sourceCode, basePos = job.basePos;\n      /** Even entries are positions in source in ascending order.  Odd enties\n        * are style markers (e.g., PR_COMMENT) that run from that position until\n        * the end.\n        * @type {Array.<number|string>}\n        */\n      var decorations = [basePos, PR_PLAIN];\n      var pos = 0;  // index into sourceCode\n      var tokens = sourceCode.match(tokenizer) || [];\n      var styleCache = {};\n\n      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {\n        var token = tokens[ti];\n        var style = styleCache[token];\n        var match = void 0;\n\n        var isEmbedded;\n        if (typeof style === 'string') {\n          isEmbedded = false;\n        } else {\n          var patternParts = shortcuts[token.charAt(0)];\n          if (patternParts) {\n            match = token.match(patternParts[1]);\n            style = patternParts[0];\n          } else {\n            for (var i = 0; i < nPatterns; ++i) {\n              patternParts = fallthroughStylePatterns[i];\n              match = token.match(patternParts[1]);\n              if (match) {\n                style = patternParts[0];\n                break;\n              }\n            }\n\n            if (!match) {  // make sure that we make progress\n              style = PR_PLAIN;\n            }\n          }\n\n          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);\n          if (isEmbedded && !(match && typeof match[1] === 'string')) {\n            isEmbedded = false;\n            style = PR_SOURCE;\n          }\n\n          if (!isEmbedded) { styleCache[token] = style; }\n        }\n\n        var tokenStart = pos;\n        pos += token.length;\n\n        if (!isEmbedded) {\n          decorations.push(basePos + tokenStart, style);\n        } else {  // Treat group 1 as an embedded block of source code.\n          var embeddedSource = match[1];\n          var embeddedSourceStart = token.indexOf(embeddedSource);\n          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;\n          if (match[2]) {\n            // If embeddedSource can be blank, then it would match at the\n            // beginning which would cause us to infinitely recurse on the\n            // entire token, so we catch the right context in match[2].\n            embeddedSourceEnd = token.length - match[2].length;\n            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;\n          }\n          var lang = style.substring(5);\n          // Decorate the left of the embedded source\n          appendDecorations(\n              basePos + tokenStart,\n              token.substring(0, embeddedSourceStart),\n              decorate, decorations);\n          // Decorate the embedded source\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceStart,\n              embeddedSource,\n              langHandlerForExtension(lang, embeddedSource),\n              decorations);\n          // Decorate the right of the embedded section\n          appendDecorations(\n              basePos + tokenStart + embeddedSourceEnd,\n              token.substring(embeddedSourceEnd),\n              decorate, decorations);\n        }\n      }\n      job.decorations = decorations;\n    };\n    return decorate;\n  }\n\n  /** returns a function that produces a list of decorations from source text.\n    *\n    * This code treats \", ', and ` as string delimiters, and \\ as a string\n    * escape.  It does not recognize perl's qq() style strings.\n    * It has no special handling for double delimiter escapes as in basic, or\n    * the tripled delimiters used in python, but should work on those regardless\n    * although in those cases a single string literal may be broken up into\n    * multiple adjacent string literals.\n    *\n    * It recognizes C, C++, and shell style comments.\n    *\n    * @param {Object} options a set of optional parameters.\n    * @return {function (Object)} a function that examines the source code\n    *     in the input job and builds the decoration list.\n    */\n  function sourceDecorator(options) {\n    var shortcutStylePatterns = [], fallthroughStylePatterns = [];\n    if (options['tripleQuotedStrings']) {\n      // '''multi-line-string''', 'single-line-string', and double-quoted\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'\\'\\'(?:[^\\'\\\\]|\\\\[\\s\\S]|\\'{1,2}(?=[^\\']))*(?:\\'\\'\\'|$)|\\\"\\\"\\\"(?:[^\\\"\\\\]|\\\\[\\s\\S]|\\\"{1,2}(?=[^\\\"]))*(?:\\\"\\\"\\\"|$)|\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$))/,\n           null, '\\'\"']);\n    } else if (options['multiLineStrings']) {\n      // 'multi-line-string', \"multi-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,  /^(?:\\'(?:[^\\\\\\']|\\\\[\\s\\S])*(?:\\'|$)|\\\"(?:[^\\\\\\\"]|\\\\[\\s\\S])*(?:\\\"|$)|\\`(?:[^\\\\\\`]|\\\\[\\s\\S])*(?:\\`|$))/,\n           null, '\\'\"`']);\n    } else {\n      // 'single-line-string', \"single-line-string\"\n      shortcutStylePatterns.push(\n          [PR_STRING,\n           /^(?:\\'(?:[^\\\\\\'\\r\\n]|\\\\.)*(?:\\'|$)|\\\"(?:[^\\\\\\\"\\r\\n]|\\\\.)*(?:\\\"|$))/,\n           null, '\"\\'']);\n    }\n    if (options['verbatimStrings']) {\n      // verbatim-string-literal production from the C# grammar.  See issue 93.\n      fallthroughStylePatterns.push(\n          [PR_STRING, /^@\\\"(?:[^\\\"]|\\\"\\\")*(?:\\\"|$)/, null]);\n    }\n    var hc = options['hashComments'];\n    if (hc) {\n      if (options['cStyleComments']) {\n        if (hc > 1) {  // multiline hash comments\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);\n        } else {\n          // Stop C preprocessor declarations at an unclosed open comment\n          shortcutStylePatterns.push(\n              [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\r\\n]*)/,\n               null, '#']);\n        }\n        fallthroughStylePatterns.push(\n            [PR_STRING,\n             /^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,\n             null]);\n      } else {\n        shortcutStylePatterns.push([PR_COMMENT, /^#[^\\r\\n]*/, null, '#']);\n      }\n    }\n    if (options['cStyleComments']) {\n      fallthroughStylePatterns.push([PR_COMMENT, /^\\/\\/[^\\r\\n]*/, null]);\n      fallthroughStylePatterns.push(\n          [PR_COMMENT, /^\\/\\*[\\s\\S]*?(?:\\*\\/|$)/, null]);\n    }\n    if (options['regexLiterals']) {\n      /**\n       * @const\n       */\n      var REGEX_LITERAL = (\n          // A regular expression literal starts with a slash that is\n          // not followed by * or / so that it is not confused with\n          // comments.\n          '/(?=[^/*])'\n          // and then contains any number of raw characters,\n          + '(?:[^/\\\\x5B\\\\x5C]'\n          // escape sequences (\\x5C),\n          +    '|\\\\x5C[\\\\s\\\\S]'\n          // or non-nesting character sets (\\x5B\\x5D);\n          +    '|\\\\x5B(?:[^\\\\x5C\\\\x5D]|\\\\x5C[\\\\s\\\\S])*(?:\\\\x5D|$))+'\n          // finally closed by a /.\n          + '/');\n      fallthroughStylePatterns.push(\n          ['lang-regex',\n           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')\n           ]);\n    }\n\n    var types = options['types'];\n    if (types) {\n      fallthroughStylePatterns.push([PR_TYPE, types]);\n    }\n\n    var keywords = (\"\" + options['keywords']).replace(/^ | $/g, '');\n    if (keywords.length) {\n      fallthroughStylePatterns.push(\n          [PR_KEYWORD,\n           new RegExp('^(?:' + keywords.replace(/[\\s,]+/g, '|') + ')\\\\b'),\n           null]);\n    }\n\n    shortcutStylePatterns.push([PR_PLAIN,       /^\\s+/, null, ' \\r\\n\\t\\xA0']);\n    fallthroughStylePatterns.push(\n        // TODO(mikesamuel): recognize non-latin letters and numerals in idents\n        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_TYPE,        /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\\w+_t\\b)/, null],\n        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],\n        [PR_LITERAL,\n         new RegExp(\n             '^(?:'\n             // A hex number\n             + '0x[a-f0-9]+'\n             // or an octal or decimal number,\n             + '|(?:\\\\d(?:_\\\\d+)*\\\\d*(?:\\\\.\\\\d*)?|\\\\.\\\\d\\\\+)'\n             // possibly in scientific notation\n             + '(?:e[+\\\\-]?\\\\d+)?'\n             + ')'\n             // with an optional modifier like UL for unsigned long\n             + '[a-z]*', 'i'),\n         null, '0123456789'],\n        // Don't treat escaped quotes in bash as starting strings.  See issue 144.\n        [PR_PLAIN,       /^\\\\[\\s\\S]?/, null],\n        [PR_PUNCTUATION, /^.[^\\s\\w\\.$@\\'\\\"\\`\\/\\#\\\\]*/, null]);\n\n    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);\n  }\n\n  var decorateSource = sourceDecorator({\n        'keywords': ALL_KEYWORDS,\n        'hashComments': true,\n        'cStyleComments': true,\n        'multiLineStrings': true,\n        'regexLiterals': true\n      });\n\n  /**\n   * Given a DOM subtree, wraps it in a list, and puts each line into its own\n   * list item.\n   *\n   * @param {Node} node modified in place.  Its content is pulled into an\n   *     HTMLOListElement, and each line is moved into a separate list item.\n   *     This requires cloning elements, so the input might not have unique\n   *     IDs after numbering.\n   */\n  function numberLines(node, opt_startLineNum) {\n    var nocode = /(?:^|\\s)nocode(?:\\s|$)/;\n    var lineBreak = /\\r\\n?|\\n/;\n  \n    var document = node.ownerDocument;\n  \n    var whitespace;\n    if (node.currentStyle) {\n      whitespace = node.currentStyle.whiteSpace;\n    } else if (window.getComputedStyle) {\n      whitespace = document.defaultView.getComputedStyle(node, null)\n          .getPropertyValue('white-space');\n    }\n    // If it's preformatted, then we need to split lines on line breaks\n    // in addition to <BR>s.\n    var isPreformatted = whitespace && 'pre' === whitespace.substring(0, 3);\n  \n    var li = document.createElement('LI');\n    while (node.firstChild) {\n      li.appendChild(node.firstChild);\n    }\n    // An array of lines.  We split below, so this is initialized to one\n    // un-split line.\n    var listItems = [li];\n  \n    function walk(node) {\n      switch (node.nodeType) {\n        case 1:  // Element\n          if (nocode.test(node.className)) { break; }\n          if ('BR' === node.nodeName) {\n            breakAfter(node);\n            // Discard the <BR> since it is now flush against a </LI>.\n            if (node.parentNode) {\n              node.parentNode.removeChild(node);\n            }\n          } else {\n            for (var child = node.firstChild; child; child = child.nextSibling) {\n              walk(child);\n            }\n          }\n          break;\n        case 3: case 4:  // Text\n          if (isPreformatted) {\n            var text = node.nodeValue;\n            var match = text.match(lineBreak);\n            if (match) {\n              var firstLine = text.substring(0, match.index);\n              node.nodeValue = firstLine;\n              var tail = text.substring(match.index + match[0].length);\n              if (tail) {\n                var parent = node.parentNode;\n                parent.insertBefore(\n                    document.createTextNode(tail), node.nextSibling);\n              }\n              breakAfter(node);\n              if (!firstLine) {\n                // Don't leave blank text nodes in the DOM.\n                node.parentNode.removeChild(node);\n              }\n            }\n          }\n          break;\n      }\n    }\n  \n    // Split a line after the given node.\n    function breakAfter(lineEndNode) {\n      // If there's nothing to the right, then we can skip ending the line\n      // here, and move root-wards since splitting just before an end-tag\n      // would require us to create a bunch of empty copies.\n      while (!lineEndNode.nextSibling) {\n        lineEndNode = lineEndNode.parentNode;\n        if (!lineEndNode) { return; }\n      }\n  \n      function breakLeftOf(limit, copy) {\n        // Clone shallowly if this node needs to be on both sides of the break.\n        var rightSide = copy ? limit.cloneNode(false) : limit;\n        var parent = limit.parentNode;\n        if (parent) {\n          // We clone the parent chain.\n          // This helps us resurrect important styling elements that cross lines.\n          // E.g. in <i>Foo<br>Bar</i>\n          // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.\n          var parentClone = breakLeftOf(parent, 1);\n          // Move the clone and everything to the right of the original\n          // onto the cloned parent.\n          var next = limit.nextSibling;\n          parentClone.appendChild(rightSide);\n          for (var sibling = next; sibling; sibling = next) {\n            next = sibling.nextSibling;\n            parentClone.appendChild(sibling);\n          }\n        }\n        return rightSide;\n      }\n  \n      var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);\n  \n      // Walk the parent chain until we reach an unattached LI.\n      for (var parent;\n           // Check nodeType since IE invents document fragments.\n           (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {\n        copiedListItem = parent;\n      }\n      // Put it on the list of lines for later processing.\n      listItems.push(copiedListItem);\n    }\n  \n    // Split lines while there are lines left to split.\n    for (var i = 0;  // Number of lines that have been split so far.\n         i < listItems.length;  // length updated by breakAfter calls.\n         ++i) {\n      walk(listItems[i]);\n    }\n  \n    // Make sure numeric indices show correctly.\n    if (opt_startLineNum === (opt_startLineNum|0)) {\n      listItems[0].setAttribute('value', opt_startLineNum);\n    }\n  \n    var ol = document.createElement('OL');\n    ol.className = 'linenums';\n    var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;\n    for (var i = 0, n = listItems.length; i < n; ++i) {\n      li = listItems[i];\n      // Stick a class on the LIs so that stylesheets can\n      // color odd/even rows, or any other row pattern that\n      // is co-prime with 10.\n      li.className = 'L' + ((i + offset) % 10);\n      if (!li.firstChild) {\n        li.appendChild(document.createTextNode('\\xA0'));\n      }\n      ol.appendChild(li);\n    }\n  \n    node.appendChild(ol);\n  }\n\n  /**\n   * Breaks {@code job.sourceCode} around style boundaries in\n   * {@code job.decorations} and modifies {@code job.sourceNode} in place.\n   * @param {Object} job like <pre>{\n   *    sourceCode: {string} source as plain text,\n   *    spans: {Array.<number|Node>} alternating span start indices into source\n   *       and the text node or element (e.g. {@code <BR>}) corresponding to that\n   *       span.\n   *    decorations: {Array.<number|string} an array of style classes preceded\n   *       by the position at which they start in job.sourceCode in order\n   * }</pre>\n   * @private\n   */\n  function recombineTagsAndDecorations(job) {\n    var isIE = /\\bMSIE\\b/.test(navigator.userAgent);\n    var newlineRe = /\\n/g;\n  \n    var source = job.sourceCode;\n    var sourceLength = source.length;\n    // Index into source after the last code-unit recombined.\n    var sourceIndex = 0;\n  \n    var spans = job.spans;\n    var nSpans = spans.length;\n    // Index into spans after the last span which ends at or before sourceIndex.\n    var spanIndex = 0;\n  \n    var decorations = job.decorations;\n    var nDecorations = decorations.length;\n    // Index into decorations after the last decoration which ends at or before\n    // sourceIndex.\n    var decorationIndex = 0;\n  \n    // Remove all zero-length decorations.\n    decorations[nDecorations] = sourceLength;\n    var decPos, i;\n    for (i = decPos = 0; i < nDecorations;) {\n      if (decorations[i] !== decorations[i + 2]) {\n        decorations[decPos++] = decorations[i++];\n        decorations[decPos++] = decorations[i++];\n      } else {\n        i += 2;\n      }\n    }\n    nDecorations = decPos;\n  \n    // Simplify decorations.\n    for (i = decPos = 0; i < nDecorations;) {\n      var startPos = decorations[i];\n      // Conflate all adjacent decorations that use the same style.\n      var startDec = decorations[i + 1];\n      var end = i + 2;\n      while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {\n        end += 2;\n      }\n      decorations[decPos++] = startPos;\n      decorations[decPos++] = startDec;\n      i = end;\n    }\n  \n    nDecorations = decorations.length = decPos;\n  \n    var decoration = null;\n    while (spanIndex < nSpans) {\n      var spanStart = spans[spanIndex];\n      var spanEnd = spans[spanIndex + 2] || sourceLength;\n  \n      var decStart = decorations[decorationIndex];\n      var decEnd = decorations[decorationIndex + 2] || sourceLength;\n  \n      var end = Math.min(spanEnd, decEnd);\n  \n      var textNode = spans[spanIndex + 1];\n      var styledText;\n      if (textNode.nodeType !== 1  // Don't muck with <BR>s or <LI>s\n          // Don't introduce spans around empty text nodes.\n          && (styledText = source.substring(sourceIndex, end))) {\n        // This may seem bizarre, and it is.  Emitting LF on IE causes the\n        // code to display with spaces instead of line breaks.\n        // Emitting Windows standard issue linebreaks (CRLF) causes a blank\n        // space to appear at the beginning of every line but the first.\n        // Emitting an old Mac OS 9 line separator makes everything spiffy.\n        if (isIE) { styledText = styledText.replace(newlineRe, '\\r'); }\n        textNode.nodeValue = styledText;\n        var document = textNode.ownerDocument;\n        var span = document.createElement('SPAN');\n        span.className = decorations[decorationIndex + 1];\n        var parentNode = textNode.parentNode;\n        parentNode.replaceChild(span, textNode);\n        span.appendChild(textNode);\n        if (sourceIndex < spanEnd) {  // Split off a text node.\n          spans[spanIndex + 1] = textNode\n              // TODO: Possibly optimize by using '' if there's no flicker.\n              = document.createTextNode(source.substring(end, spanEnd));\n          parentNode.insertBefore(textNode, span.nextSibling);\n        }\n      }\n  \n      sourceIndex = end;\n  \n      if (sourceIndex >= spanEnd) {\n        spanIndex += 2;\n      }\n      if (sourceIndex >= decEnd) {\n        decorationIndex += 2;\n      }\n    }\n  }\n\n\n  /** Maps language-specific file extensions to handlers. */\n  var langHandlerRegistry = {};\n  /** Register a language handler for the given file extensions.\n    * @param {function (Object)} handler a function from source code to a list\n    *      of decorations.  Takes a single argument job which describes the\n    *      state of the computation.   The single parameter has the form\n    *      {@code {\n    *        sourceCode: {string} as plain text.\n    *        decorations: {Array.<number|string>} an array of style classes\n    *                     preceded by the position at which they start in\n    *                     job.sourceCode in order.\n    *                     The language handler should assigned this field.\n    *        basePos: {int} the position of source in the larger source chunk.\n    *                 All positions in the output decorations array are relative\n    *                 to the larger source chunk.\n    *      } }\n    * @param {Array.<string>} fileExtensions\n    */\n  function registerLangHandler(handler, fileExtensions) {\n    for (var i = fileExtensions.length; --i >= 0;) {\n      var ext = fileExtensions[i];\n      if (!langHandlerRegistry.hasOwnProperty(ext)) {\n        langHandlerRegistry[ext] = handler;\n      } else if (window['console']) {\n        console['warn']('cannot override language handler %s', ext);\n      }\n    }\n  }\n  function langHandlerForExtension(extension, source) {\n    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {\n      // Treat it as markup if the first non whitespace character is a < and\n      // the last non-whitespace character is a >.\n      extension = /^\\s*</.test(source)\n          ? 'default-markup'\n          : 'default-code';\n    }\n    return langHandlerRegistry[extension];\n  }\n  registerLangHandler(decorateSource, ['default-code']);\n  registerLangHandler(\n      createSimpleLexer(\n          [],\n          [\n           [PR_PLAIN,       /^[^<?]+/],\n           [PR_DECLARATION, /^<!\\w[^>]*(?:>|$)/],\n           [PR_COMMENT,     /^<\\!--[\\s\\S]*?(?:-\\->|$)/],\n           // Unescaped content in an unknown language\n           ['lang-',        /^<\\?([\\s\\S]+?)(?:\\?>|$)/],\n           ['lang-',        /^<%([\\s\\S]+?)(?:%>|$)/],\n           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],\n           ['lang-',        /^<xmp\\b[^>]*>([\\s\\S]+?)<\\/xmp\\b[^>]*>/i],\n           // Unescaped content in javascript.  (Or possibly vbscript).\n           ['lang-js',      /^<script\\b[^>]*>([\\s\\S]*?)(<\\/script\\b[^>]*>)/i],\n           // Contains unescaped stylesheet content\n           ['lang-css',     /^<style\\b[^>]*>([\\s\\S]*?)(<\\/style\\b[^>]*>)/i],\n           ['lang-in.tag',  /^(<\\/?[a-z][^<>]*>)/i]\n          ]),\n      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);\n  registerLangHandler(\n      createSimpleLexer(\n          [\n           [PR_PLAIN,        /^[\\s]+/, null, ' \\t\\r\\n'],\n           [PR_ATTRIB_VALUE, /^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)/, null, '\\\"\\'']\n           ],\n          [\n           [PR_TAG,          /^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$/i],\n           [PR_ATTRIB_NAME,  /^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],\n           ['lang-uq.val',   /^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))/],\n           [PR_PUNCTUATION,  /^[=<>\\/]+/],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-js',       /^on\\w+\\s*=\\s*([^\\\"\\'>\\s]+)/i],\n           ['lang-css',      /^style\\s*=\\s*\\\"([^\\\"]+)\\\"/i],\n           ['lang-css',      /^style\\s*=\\s*\\'([^\\']+)\\'/i],\n           ['lang-css',      /^style\\s*=\\s*([^\\\"\\'>\\s]+)/i]\n           ]),\n      ['in.tag']);\n  registerLangHandler(\n      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\\s\\S]+/]]), ['uq.val']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CPP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'types': C_TYPES\n        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': 'null,true,false'\n        }), ['json']);\n  registerLangHandler(sourceDecorator({\n          'keywords': CSHARP_KEYWORDS,\n          'hashComments': true,\n          'cStyleComments': true,\n          'verbatimStrings': true,\n          'types': C_TYPES\n        }), ['cs']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JAVA_KEYWORDS,\n          'cStyleComments': true\n        }), ['java']);\n  registerLangHandler(sourceDecorator({\n          'keywords': SH_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true\n        }), ['bsh', 'csh', 'sh']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PYTHON_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'tripleQuotedStrings': true\n        }), ['cv', 'py']);\n  registerLangHandler(sourceDecorator({\n          'keywords': PERL_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': true\n        }), ['perl', 'pl', 'pm']);\n  registerLangHandler(sourceDecorator({\n          'keywords': RUBY_KEYWORDS,\n          'hashComments': true,\n          'multiLineStrings': true,\n          'regexLiterals': true\n        }), ['rb']);\n  registerLangHandler(sourceDecorator({\n          'keywords': JSCRIPT_KEYWORDS,\n          'cStyleComments': true,\n          'regexLiterals': true\n        }), ['js']);\n  registerLangHandler(sourceDecorator({\n          'keywords': COFFEE_KEYWORDS,\n          'hashComments': 3,  // ### style block comments\n          'cStyleComments': true,\n          'multilineStrings': true,\n          'tripleQuotedStrings': true,\n          'regexLiterals': true\n        }), ['coffee']);\n  registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\\s\\S]+/]]), ['regex']);\n\n  function applyDecorator(job) {\n    var opt_langExtension = job.langExtension;\n\n    try {\n      // Extract tags, and convert the source code to plain text.\n      var sourceAndSpans = extractSourceSpans(job.sourceNode);\n      /** Plain text. @type {string} */\n      var source = sourceAndSpans.sourceCode;\n      job.sourceCode = source;\n      job.spans = sourceAndSpans.spans;\n      job.basePos = 0;\n\n      // Apply the appropriate language handler\n      langHandlerForExtension(opt_langExtension, source)(job);\n\n      // Integrate the decorations and tags back into the source code,\n      // modifying the sourceNode in place.\n      recombineTagsAndDecorations(job);\n    } catch (e) {\n      if ('console' in window) {\n        console['log'](e && e['stack'] ? e['stack'] : e);\n      }\n    }\n  }\n\n  /**\n   * @param sourceCodeHtml {string} The HTML to pretty print.\n   * @param opt_langExtension {string} The language name to use.\n   *     Typically, a filename extension like 'cpp' or 'java'.\n   * @param opt_numberLines {number|boolean} True to number lines,\n   *     or the 1-indexed number of the first line in sourceCodeHtml.\n   */\n  function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {\n    var container = document.createElement('PRE');\n    // This could cause images to load and onload listeners to fire.\n    // E.g. <img onerror=\"alert(1337)\" src=\"nosuchimage.png\">.\n    // We assume that the inner HTML is from a trusted source.\n    container.innerHTML = sourceCodeHtml;\n    if (opt_numberLines) {\n      numberLines(container, opt_numberLines);\n    }\n\n    var job = {\n      langExtension: opt_langExtension,\n      numberLines: opt_numberLines,\n      sourceNode: container\n    };\n    applyDecorator(job);\n    return container.innerHTML;\n  }\n\n  function prettyPrint(opt_whenDone) {\n    function byTagName(tn) { return document.getElementsByTagName(tn); }\n    // fetch a list of nodes to rewrite\n    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];\n    var elements = [];\n    for (var i = 0; i < codeSegments.length; ++i) {\n      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {\n        elements.push(codeSegments[i][j]);\n      }\n    }\n    codeSegments = null;\n\n    var clock = Date;\n    if (!clock['now']) {\n      clock = { 'now': function () { return +(new Date); } };\n    }\n\n    // The loop is broken into a series of continuations to make sure that we\n    // don't make the browser unresponsive when rewriting a large page.\n    var k = 0;\n    var prettyPrintingJob;\n\n    var langExtensionRe = /\\blang(?:uage)?-([\\w.]+)(?!\\S)/;\n    var prettyPrintRe = /\\bprettyprint\\b/;\n\n    function doWork() {\n      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?\n                     clock['now']() + 250 /* ms */ :\n                     Infinity);\n      for (; k < elements.length && clock['now']() < endTime; k++) {\n        var cs = elements[k];\n        var className = cs.className;\n        if (className.indexOf('prettyprint') >= 0) {\n          // If the classes includes a language extensions, use it.\n          // Language extensions can be specified like\n          //     <pre class=\"prettyprint lang-cpp\">\n          // the language extension \"cpp\" is used to find a language handler as\n          // passed to PR.registerLangHandler.\n          // HTML5 recommends that a language be specified using \"language-\"\n          // as the prefix instead.  Google Code Prettify supports both.\n          // http://dev.w3.org/html5/spec-author-view/the-code-element.html\n          var langExtension = className.match(langExtensionRe);\n          // Support <pre class=\"prettyprint\"><code class=\"language-c\">\n          var wrapper;\n          if (!langExtension && (wrapper = childContentWrapper(cs))\n              && \"CODE\" === wrapper.tagName) {\n            langExtension = wrapper.className.match(langExtensionRe);\n          }\n\n          if (langExtension) {\n            langExtension = langExtension[1];\n          }\n\n          // make sure this is not nested in an already prettified element\n          var nested = false;\n          for (var p = cs.parentNode; p; p = p.parentNode) {\n            if ((p.tagName === 'pre' || p.tagName === 'code' ||\n                 p.tagName === 'xmp') &&\n                p.className && p.className.indexOf('prettyprint') >= 0) {\n              nested = true;\n              break;\n            }\n          }\n          if (!nested) {\n            // Look for a class like linenums or linenums:<n> where <n> is the\n            // 1-indexed number of the first line.\n            var lineNums = cs.className.match(/\\blinenums\\b(?::(\\d+))?/);\n            lineNums = lineNums\n                  ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true\n                  : false;\n            if (lineNums) { numberLines(cs, lineNums); }\n\n            // do the pretty printing\n            prettyPrintingJob = {\n              langExtension: langExtension,\n              sourceNode: cs,\n              numberLines: lineNums\n            };\n            applyDecorator(prettyPrintingJob);\n          }\n        }\n      }\n      if (k < elements.length) {\n        // finish up in a continuation\n        setTimeout(doWork, 250);\n      } else if (opt_whenDone) {\n        opt_whenDone();\n      }\n    }\n\n    doWork();\n  }\n\n   /**\n    * Find all the {@code <pre>} and {@code <code>} tags in the DOM with\n    * {@code class=prettyprint} and prettify them.\n    *\n    * @param {Function?} opt_whenDone if specified, called when the last entry\n    *     has been finished.\n    */\n  window['prettyPrintOne'] = prettyPrintOne;\n   /**\n    * Pretty print a chunk of code.\n    *\n    * @param {string} sourceCodeHtml code as html\n    * @return {string} code as html, but prettier\n    */\n  window['prettyPrint'] = prettyPrint;\n   /**\n    * Contains functions for creating and registering new language handlers.\n    * @type {Object}\n    */\n  window['PR'] = {\n        'createSimpleLexer': createSimpleLexer,\n        'registerLangHandler': registerLangHandler,\n        'sourceDecorator': sourceDecorator,\n        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,\n        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,\n        'PR_COMMENT': PR_COMMENT,\n        'PR_DECLARATION': PR_DECLARATION,\n        'PR_KEYWORD': PR_KEYWORD,\n        'PR_LITERAL': PR_LITERAL,\n        'PR_NOCODE': PR_NOCODE,\n        'PR_PLAIN': PR_PLAIN,\n        'PR_PUNCTUATION': PR_PUNCTUATION,\n        'PR_SOURCE': PR_SOURCE,\n        'PR_STRING': PR_STRING,\n        'PR_TAG': PR_TAG,\n        'PR_TYPE': PR_TYPE\n      };\n})();\n"
  },
  {
    "path": "selfblog/static/bootstrap/css/bootstrap-responsive.css",
    "content": "/*!\n * Bootstrap Responsive v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.clearfix {\n  *zoom: 1;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n.visible-phone {\n  display: none !important;\n}\n\n.visible-tablet {\n  display: none !important;\n}\n\n.hidden-desktop {\n  display: none !important;\n}\n\n.visible-desktop {\n  display: inherit !important;\n}\n\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: left;\n    width: 100%;\n    min-height: 30px;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: left;\n    width: 100%;\n    min-height: 30px;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n\n@media (max-width: 767px) {\n  body {\n    padding-right: 20px;\n    padding-left: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-right: -20px;\n    margin-left: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    width: auto;\n    clear: none;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: none;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    right: 20px;\n    left: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-right: 10px;\n    padding-left: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    display: block;\n    float: none;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    right: 10px;\n    left: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-right: 10px;\n    padding-left: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: #777777;\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: #777777;\n    -webkit-border-radius: 3px;\n       -moz-border-radius: 3px;\n            border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 4px;\n       -moz-border-radius: 4px;\n            border-radius: 4px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .dropdown-menu a:hover {\n    background-color: #f2f2f2;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #999999;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover {\n    background-color: #111111;\n  }\n  .nav-collapse.in .btn-group {\n    padding: 0;\n    margin-top: 5px;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    display: none;\n    float: none;\n    max-width: none;\n    padding: 0;\n    margin: 0 15px;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n       -moz-border-radius: 0;\n            border-radius: 0;\n    -webkit-box-shadow: none;\n       -moz-box-shadow: none;\n            box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #f2f2f2;\n    border-bottom: 1px solid #f2f2f2;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #111111;\n    border-bottom-color: #111111;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    height: 0;\n    overflow: hidden;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-right: 10px;\n    padding-left: 10px;\n  }\n}\n\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "selfblog/static/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v2.2.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\naudio:not([controls]) {\n  display: none;\n}\n\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\na:hover,\na:active {\n  outline: 0;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  width: auto\\9;\n  height: auto;\n  max-width: 100%;\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\n\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\n\n.clearfix {\n  *zoom: 1;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nbody {\n  margin: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #ffffff;\n}\n\na {\n  color: #0088cc;\n  text-decoration: none;\n}\n\na:hover {\n  color: #005580;\n  text-decoration: underline;\n}\n\n.img-rounded {\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.img-circle {\n  -webkit-border-radius: 500px;\n     -moz-border-radius: 500px;\n          border-radius: 500px;\n}\n\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.row:after {\n  clear: both;\n}\n\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n\n.span12 {\n  width: 940px;\n}\n\n.span11 {\n  width: 860px;\n}\n\n.span10 {\n  width: 780px;\n}\n\n.span9 {\n  width: 700px;\n}\n\n.span8 {\n  width: 620px;\n}\n\n.span7 {\n  width: 540px;\n}\n\n.span6 {\n  width: 460px;\n}\n\n.span5 {\n  width: 380px;\n}\n\n.span4 {\n  width: 300px;\n}\n\n.span3 {\n  width: 220px;\n}\n\n.span2 {\n  width: 140px;\n}\n\n.span1 {\n  width: 60px;\n}\n\n.offset12 {\n  margin-left: 980px;\n}\n\n.offset11 {\n  margin-left: 900px;\n}\n\n.offset10 {\n  margin-left: 820px;\n}\n\n.offset9 {\n  margin-left: 740px;\n}\n\n.offset8 {\n  margin-left: 660px;\n}\n\n.offset7 {\n  margin-left: 580px;\n}\n\n.offset6 {\n  margin-left: 500px;\n}\n\n.offset5 {\n  margin-left: 420px;\n}\n\n.offset4 {\n  margin-left: 340px;\n}\n\n.offset3 {\n  margin-left: 260px;\n}\n\n.offset2 {\n  margin-left: 180px;\n}\n\n.offset1 {\n  margin-left: 100px;\n}\n\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.row-fluid:after {\n  clear: both;\n}\n\n.row-fluid [class*=\"span\"] {\n  display: block;\n  float: left;\n  width: 100%;\n  min-height: 30px;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.container-fluid:after {\n  clear: both;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\n\nsmall {\n  font-size: 85%;\n}\n\nstrong {\n  font-weight: bold;\n}\n\nem {\n  font-style: italic;\n}\n\ncite {\n  font-style: normal;\n}\n\n.muted {\n  color: #999999;\n}\n\na.muted:hover {\n  color: #808080;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\na.text-warning:hover {\n  color: #a47e3c;\n}\n\n.text-error {\n  color: #b94a48;\n}\n\na.text-error:hover {\n  color: #953b39;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\na.text-info:hover {\n  color: #2d6987;\n}\n\n.text-success {\n  color: #468847;\n}\n\na.text-success:hover {\n  color: #356635;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\n\nh1 {\n  font-size: 38.5px;\n}\n\nh2 {\n  font-size: 31.5px;\n}\n\nh3 {\n  font-size: 24.5px;\n}\n\nh4 {\n  font-size: 17.5px;\n}\n\nh5 {\n  font-size: 14px;\n}\n\nh6 {\n  font-size: 11.9px;\n}\n\nh1 small {\n  font-size: 24.5px;\n}\n\nh2 small {\n  font-size: 17.5px;\n}\n\nh3 small {\n  font-size: 14px;\n}\n\nh4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\n\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\n\nli {\n  line-height: 20px;\n}\n\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\n\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\n\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 20px;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 10px;\n}\n\n.dl-horizontal {\n  *zoom: 1;\n}\n\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.dl-horizontal:after {\n  clear: both;\n}\n\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  overflow: hidden;\n  clear: left;\n  text-align: right;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.dl-horizontal dd {\n  margin-left: 180px;\n}\n\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n  border-bottom: 1px solid #ffffff;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  margin-bottom: 0;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 25px;\n}\n\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\n\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  white-space: nowrap;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\nform {\n  margin: 0 0 20px;\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlegend small {\n  font-size: 15px;\n  color: #999999;\n}\n\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\n\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #555555;\n  vertical-align: middle;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\n\ntextarea {\n  height: auto;\n}\n\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;\n     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;\n       -o-transition: border linear 0.2s, box-shadow linear 0.2s;\n          transition: border linear 0.2s, box-shadow linear 0.2s;\n}\n\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  *margin-top: 0;\n  line-height: normal;\n}\n\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\n\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\n\nselect {\n  width: 220px;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.uneditable-input,\n.uneditable-textarea {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n}\n\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\n\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: #999999;\n}\n\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: #999999;\n}\n\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n\n.input-mini {\n  width: 60px;\n}\n\n.input-small {\n  width: 90px;\n}\n\n.input-medium {\n  width: 150px;\n}\n\n.input-large {\n  width: 210px;\n}\n\n.input-xlarge {\n  width: 270px;\n}\n\n.input-xxlarge {\n  width: 530px;\n}\n\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\n\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\n\ninput.span12,\ntextarea.span12,\n.uneditable-input.span12 {\n  width: 926px;\n}\n\ninput.span11,\ntextarea.span11,\n.uneditable-input.span11 {\n  width: 846px;\n}\n\ninput.span10,\ntextarea.span10,\n.uneditable-input.span10 {\n  width: 766px;\n}\n\ninput.span9,\ntextarea.span9,\n.uneditable-input.span9 {\n  width: 686px;\n}\n\ninput.span8,\ntextarea.span8,\n.uneditable-input.span8 {\n  width: 606px;\n}\n\ninput.span7,\ntextarea.span7,\n.uneditable-input.span7 {\n  width: 526px;\n}\n\ninput.span6,\ntextarea.span6,\n.uneditable-input.span6 {\n  width: 446px;\n}\n\ninput.span5,\ntextarea.span5,\n.uneditable-input.span5 {\n  width: 366px;\n}\n\ninput.span4,\ntextarea.span4,\n.uneditable-input.span4 {\n  width: 286px;\n}\n\ninput.span3,\ntextarea.span3,\n.uneditable-input.span3 {\n  width: 206px;\n}\n\ninput.span2,\ntextarea.span2,\n.uneditable-input.span2 {\n  width: 126px;\n}\n\ninput.span1,\ntextarea.span1,\n.uneditable-input.span1 {\n  width: 46px;\n}\n\n.controls-row {\n  *zoom: 1;\n}\n\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.controls-row:after {\n  clear: both;\n}\n\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\n\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\n\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\n\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n     -moz-box-shadow: 0 0 6px #f8b9b7;\n          box-shadow: 0 0 6px #f8b9b7;\n}\n\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.form-actions:after {\n  clear: both;\n}\n\n.help-block,\n.help-inline {\n  color: #595959;\n}\n\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  padding-left: 5px;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.input-append,\n.input-prepend {\n  margin-bottom: 5px;\n  font-size: 0;\n  white-space: nowrap;\n}\n\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu {\n  font-size: 14px;\n}\n\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n}\n\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\n\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n/* Allow for input prepend/append in search forms */\n\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n     -moz-border-radius: 14px 0 0 14px;\n          border-radius: 14px 0 0 14px;\n}\n\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n     -moz-border-radius: 0 14px 14px 0;\n          border-radius: 0 14px 14px 0;\n}\n\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n     -moz-border-radius: 0 14px 14px 0;\n          border-radius: 0 14px 14px 0;\n}\n\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n     -moz-border-radius: 14px 0 0 14px;\n          border-radius: 14px 0 0 14px;\n}\n\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  margin-bottom: 0;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n\n.control-group {\n  margin-bottom: 10px;\n}\n\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.form-horizontal .control-group:after {\n  clear: both;\n}\n\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table th {\n  font-weight: bold;\n}\n\n.table thead th {\n  vertical-align: bottom;\n}\n\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child {\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n}\n\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child {\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n}\n\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child {\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n          border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n}\n\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n          border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n}\n\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n}\n\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover tbody tr:hover td,\n.table-hover tbody tr:hover th {\n  background-color: #f5f5f5;\n}\n\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n\n.table tbody tr.success td {\n  background-color: #dff0d8;\n}\n\n.table tbody tr.error td {\n  background-color: #f2dede;\n}\n\n.table tbody tr.warning td {\n  background-color: #fcf8e3;\n}\n\n.table tbody tr.info td {\n  background-color: #d9edf7;\n}\n\n.table-hover tbody tr.success:hover td {\n  background-color: #d0e9c6;\n}\n\n.table-hover tbody tr.error:hover td {\n  background-color: #ebcccc;\n}\n\n.table-hover tbody tr.warning:hover td {\n  background-color: #faf2cc;\n}\n\n.table-hover tbody tr.info:hover td {\n  background-color: #c4e3f3;\n}\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  margin-top: 1px;\n  *margin-right: .3em;\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"../img/glyphicons-halflings.png\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n}\n\n/* White icons with optional class, or on hover/active states of certain elements */\n\n.icon-white,\n.nav-pills > .active > a > [class^=\"icon-\"],\n.nav-pills > .active > a > [class*=\" icon-\"],\n.nav-list > .active > a > [class^=\"icon-\"],\n.nav-list > .active > a > [class*=\" icon-\"],\n.navbar-inverse .nav > .active > a > [class^=\"icon-\"],\n.navbar-inverse .nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"],\n.dropdown-submenu:hover > a > [class^=\"icon-\"],\n.dropdown-submenu:hover > a > [class*=\" icon-\"] {\n  background-image: url(\"../img/glyphicons-halflings-white.png\");\n}\n\n.icon-glass {\n  background-position: 0      0;\n}\n\n.icon-music {\n  background-position: -24px 0;\n}\n\n.icon-search {\n  background-position: -48px 0;\n}\n\n.icon-envelope {\n  background-position: -72px 0;\n}\n\n.icon-heart {\n  background-position: -96px 0;\n}\n\n.icon-star {\n  background-position: -120px 0;\n}\n\n.icon-star-empty {\n  background-position: -144px 0;\n}\n\n.icon-user {\n  background-position: -168px 0;\n}\n\n.icon-film {\n  background-position: -192px 0;\n}\n\n.icon-th-large {\n  background-position: -216px 0;\n}\n\n.icon-th {\n  background-position: -240px 0;\n}\n\n.icon-th-list {\n  background-position: -264px 0;\n}\n\n.icon-ok {\n  background-position: -288px 0;\n}\n\n.icon-remove {\n  background-position: -312px 0;\n}\n\n.icon-zoom-in {\n  background-position: -336px 0;\n}\n\n.icon-zoom-out {\n  background-position: -360px 0;\n}\n\n.icon-off {\n  background-position: -384px 0;\n}\n\n.icon-signal {\n  background-position: -408px 0;\n}\n\n.icon-cog {\n  background-position: -432px 0;\n}\n\n.icon-trash {\n  background-position: -456px 0;\n}\n\n.icon-home {\n  background-position: 0 -24px;\n}\n\n.icon-file {\n  background-position: -24px -24px;\n}\n\n.icon-time {\n  background-position: -48px -24px;\n}\n\n.icon-road {\n  background-position: -72px -24px;\n}\n\n.icon-download-alt {\n  background-position: -96px -24px;\n}\n\n.icon-download {\n  background-position: -120px -24px;\n}\n\n.icon-upload {\n  background-position: -144px -24px;\n}\n\n.icon-inbox {\n  background-position: -168px -24px;\n}\n\n.icon-play-circle {\n  background-position: -192px -24px;\n}\n\n.icon-repeat {\n  background-position: -216px -24px;\n}\n\n.icon-refresh {\n  background-position: -240px -24px;\n}\n\n.icon-list-alt {\n  background-position: -264px -24px;\n}\n\n.icon-lock {\n  background-position: -287px -24px;\n}\n\n.icon-flag {\n  background-position: -312px -24px;\n}\n\n.icon-headphones {\n  background-position: -336px -24px;\n}\n\n.icon-volume-off {\n  background-position: -360px -24px;\n}\n\n.icon-volume-down {\n  background-position: -384px -24px;\n}\n\n.icon-volume-up {\n  background-position: -408px -24px;\n}\n\n.icon-qrcode {\n  background-position: -432px -24px;\n}\n\n.icon-barcode {\n  background-position: -456px -24px;\n}\n\n.icon-tag {\n  background-position: 0 -48px;\n}\n\n.icon-tags {\n  background-position: -25px -48px;\n}\n\n.icon-book {\n  background-position: -48px -48px;\n}\n\n.icon-bookmark {\n  background-position: -72px -48px;\n}\n\n.icon-print {\n  background-position: -96px -48px;\n}\n\n.icon-camera {\n  background-position: -120px -48px;\n}\n\n.icon-font {\n  background-position: -144px -48px;\n}\n\n.icon-bold {\n  background-position: -167px -48px;\n}\n\n.icon-italic {\n  background-position: -192px -48px;\n}\n\n.icon-text-height {\n  background-position: -216px -48px;\n}\n\n.icon-text-width {\n  background-position: -240px -48px;\n}\n\n.icon-align-left {\n  background-position: -264px -48px;\n}\n\n.icon-align-center {\n  background-position: -288px -48px;\n}\n\n.icon-align-right {\n  background-position: -312px -48px;\n}\n\n.icon-align-justify {\n  background-position: -336px -48px;\n}\n\n.icon-list {\n  background-position: -360px -48px;\n}\n\n.icon-indent-left {\n  background-position: -384px -48px;\n}\n\n.icon-indent-right {\n  background-position: -408px -48px;\n}\n\n.icon-facetime-video {\n  background-position: -432px -48px;\n}\n\n.icon-picture {\n  background-position: -456px -48px;\n}\n\n.icon-pencil {\n  background-position: 0 -72px;\n}\n\n.icon-map-marker {\n  background-position: -24px -72px;\n}\n\n.icon-adjust {\n  background-position: -48px -72px;\n}\n\n.icon-tint {\n  background-position: -72px -72px;\n}\n\n.icon-edit {\n  background-position: -96px -72px;\n}\n\n.icon-share {\n  background-position: -120px -72px;\n}\n\n.icon-check {\n  background-position: -144px -72px;\n}\n\n.icon-move {\n  background-position: -168px -72px;\n}\n\n.icon-step-backward {\n  background-position: -192px -72px;\n}\n\n.icon-fast-backward {\n  background-position: -216px -72px;\n}\n\n.icon-backward {\n  background-position: -240px -72px;\n}\n\n.icon-play {\n  background-position: -264px -72px;\n}\n\n.icon-pause {\n  background-position: -288px -72px;\n}\n\n.icon-stop {\n  background-position: -312px -72px;\n}\n\n.icon-forward {\n  background-position: -336px -72px;\n}\n\n.icon-fast-forward {\n  background-position: -360px -72px;\n}\n\n.icon-step-forward {\n  background-position: -384px -72px;\n}\n\n.icon-eject {\n  background-position: -408px -72px;\n}\n\n.icon-chevron-left {\n  background-position: -432px -72px;\n}\n\n.icon-chevron-right {\n  background-position: -456px -72px;\n}\n\n.icon-plus-sign {\n  background-position: 0 -96px;\n}\n\n.icon-minus-sign {\n  background-position: -24px -96px;\n}\n\n.icon-remove-sign {\n  background-position: -48px -96px;\n}\n\n.icon-ok-sign {\n  background-position: -72px -96px;\n}\n\n.icon-question-sign {\n  background-position: -96px -96px;\n}\n\n.icon-info-sign {\n  background-position: -120px -96px;\n}\n\n.icon-screenshot {\n  background-position: -144px -96px;\n}\n\n.icon-remove-circle {\n  background-position: -168px -96px;\n}\n\n.icon-ok-circle {\n  background-position: -192px -96px;\n}\n\n.icon-ban-circle {\n  background-position: -216px -96px;\n}\n\n.icon-arrow-left {\n  background-position: -240px -96px;\n}\n\n.icon-arrow-right {\n  background-position: -264px -96px;\n}\n\n.icon-arrow-up {\n  background-position: -289px -96px;\n}\n\n.icon-arrow-down {\n  background-position: -312px -96px;\n}\n\n.icon-share-alt {\n  background-position: -336px -96px;\n}\n\n.icon-resize-full {\n  background-position: -360px -96px;\n}\n\n.icon-resize-small {\n  background-position: -384px -96px;\n}\n\n.icon-plus {\n  background-position: -408px -96px;\n}\n\n.icon-minus {\n  background-position: -433px -96px;\n}\n\n.icon-asterisk {\n  background-position: -456px -96px;\n}\n\n.icon-exclamation-sign {\n  background-position: 0 -120px;\n}\n\n.icon-gift {\n  background-position: -24px -120px;\n}\n\n.icon-leaf {\n  background-position: -48px -120px;\n}\n\n.icon-fire {\n  background-position: -72px -120px;\n}\n\n.icon-eye-open {\n  background-position: -96px -120px;\n}\n\n.icon-eye-close {\n  background-position: -120px -120px;\n}\n\n.icon-warning-sign {\n  background-position: -144px -120px;\n}\n\n.icon-plane {\n  background-position: -168px -120px;\n}\n\n.icon-calendar {\n  background-position: -192px -120px;\n}\n\n.icon-random {\n  width: 16px;\n  background-position: -216px -120px;\n}\n\n.icon-comment {\n  background-position: -240px -120px;\n}\n\n.icon-magnet {\n  background-position: -264px -120px;\n}\n\n.icon-chevron-up {\n  background-position: -288px -120px;\n}\n\n.icon-chevron-down {\n  background-position: -313px -119px;\n}\n\n.icon-retweet {\n  background-position: -336px -120px;\n}\n\n.icon-shopping-cart {\n  background-position: -360px -120px;\n}\n\n.icon-folder-close {\n  background-position: -384px -120px;\n}\n\n.icon-folder-open {\n  width: 16px;\n  background-position: -408px -120px;\n}\n\n.icon-resize-vertical {\n  background-position: -432px -119px;\n}\n\n.icon-resize-horizontal {\n  background-position: -456px -118px;\n}\n\n.icon-hdd {\n  background-position: 0 -144px;\n}\n\n.icon-bullhorn {\n  background-position: -24px -144px;\n}\n\n.icon-bell {\n  background-position: -48px -144px;\n}\n\n.icon-certificate {\n  background-position: -72px -144px;\n}\n\n.icon-thumbs-up {\n  background-position: -96px -144px;\n}\n\n.icon-thumbs-down {\n  background-position: -120px -144px;\n}\n\n.icon-hand-right {\n  background-position: -144px -144px;\n}\n\n.icon-hand-left {\n  background-position: -168px -144px;\n}\n\n.icon-hand-up {\n  background-position: -192px -144px;\n}\n\n.icon-hand-down {\n  background-position: -216px -144px;\n}\n\n.icon-circle-arrow-right {\n  background-position: -240px -144px;\n}\n\n.icon-circle-arrow-left {\n  background-position: -264px -144px;\n}\n\n.icon-circle-arrow-up {\n  background-position: -288px -144px;\n}\n\n.icon-circle-arrow-down {\n  background-position: -312px -144px;\n}\n\n.icon-globe {\n  background-position: -336px -144px;\n}\n\n.icon-wrench {\n  background-position: -360px -144px;\n}\n\n.icon-tasks {\n  background-position: -384px -144px;\n}\n\n.icon-filter {\n  background-position: -408px -144px;\n}\n\n.icon-briefcase {\n  background-position: -432px -144px;\n}\n\n.icon-fullscreen {\n  background-position: -456px -144px;\n}\n\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n\n.dropdown-menu li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu li > a:hover,\n.dropdown-menu li > a:focus,\n.dropdown-submenu:hover > a {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n\n.dropdown-menu .active > a,\n.dropdown-menu .active > a:hover {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  outline: 0;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n\n.dropdown-menu .disabled > a,\n.dropdown-menu .disabled > a:hover {\n  color: #999999;\n}\n\n.dropdown-menu .disabled > a:hover {\n  text-decoration: none;\n  cursor: default;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open {\n  *z-index: 1000;\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n.dropdown-submenu {\n  position: relative;\n}\n\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n     -moz-border-radius: 0 6px 6px 6px;\n          border-radius: 0 6px 6px 6px;\n}\n\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n     -moz-border-radius: 5px 5px 5px 0;\n          border-radius: 5px 5px 5px 0;\n}\n\n.dropdown-submenu > a:after {\n  display: block;\n  float: right;\n  width: 0;\n  height: 0;\n  margin-top: 5px;\n  margin-right: -10px;\n  border-color: transparent;\n  border-left-color: #cccccc;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  content: \" \";\n}\n\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n\n.dropdown-submenu.pull-left {\n  float: none;\n}\n\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n     -moz-border-radius: 6px 0 6px 6px;\n          border-radius: 6px 0 6px 6px;\n}\n\n.dropdown .dropdown-menu .nav-header {\n  padding-right: 20px;\n  padding-left: 20px;\n}\n\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n     -moz-transition: opacity 0.15s linear;\n       -o-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n     -moz-transition: height 0.35s ease;\n       -o-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n.collapse.in {\n  height: auto;\n}\n\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.btn {\n  display: inline-block;\n  *display: inline;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  *margin-left: .3em;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  text-align: center;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  vertical-align: middle;\n  cursor: pointer;\n  background-color: #f5f5f5;\n  *background-color: #e6e6e6;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  border: 1px solid #bbbbbb;\n  *border: 0;\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  border-bottom-color: #a2a2a2;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  *zoom: 1;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn:hover,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n\n.btn:first-child {\n  *margin-left: 0;\n}\n\n.btn:hover {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n     -moz-transition: background-position 0.1s linear;\n       -o-transition: background-position 0.1s linear;\n          transition: background-position 0.1s linear;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n     -moz-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n\n.btn-mini {\n  padding: 0 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.btn {\n  border-color: #c5c5c5;\n  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);\n}\n\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #006dcc;\n  *background-color: #0044cc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #003399 \\9;\n}\n\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  *background-color: #f89406;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  *background-color: #bd362f;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #5bb75b;\n  *background-color: #51a351;\n  background-image: -moz-linear-gradient(top, #62c462, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n  background-image: -o-linear-gradient(top, #62c462, #51a351);\n  background-image: linear-gradient(to bottom, #62c462, #51a351);\n  background-repeat: repeat-x;\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-success:hover,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  *background-color: #2f96b4;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-info:hover,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #363636;\n  *background-color: #222222;\n  background-image: -moz-linear-gradient(top, #444444, #222222);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));\n  background-image: -webkit-linear-gradient(top, #444444, #222222);\n  background-image: -o-linear-gradient(top, #444444, #222222);\n  background-image: linear-gradient(to bottom, #444444, #222222);\n  background-repeat: repeat-x;\n  border-color: #222222 #222222 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-inverse:hover,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #222222;\n  *background-color: #151515;\n}\n\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #080808 \\9;\n}\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\n\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\n\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n     -moz-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link {\n  color: #0088cc;\n  cursor: pointer;\n  border-color: transparent;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-link:hover {\n  color: #005580;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  *margin-left: .3em;\n  font-size: 0;\n  white-space: nowrap;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.btn-group:first-child {\n  *margin-left: 0;\n}\n\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-toolbar {\n  margin-top: 10px;\n  margin-bottom: 10px;\n  font-size: 0;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-bottom-left-radius: 6px;\n          border-bottom-left-radius: 6px;\n  -webkit-border-top-left-radius: 6px;\n          border-top-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  -moz-border-radius-topleft: 6px;\n}\n\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 6px;\n          border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n          border-bottom-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  -moz-border-radius-bottomright: 6px;\n}\n\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  *padding-top: 5px;\n  padding-right: 8px;\n  *padding-bottom: 5px;\n  padding-left: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn-group > .btn-mini + .dropdown-toggle {\n  *padding-top: 2px;\n  padding-right: 5px;\n  *padding-bottom: 2px;\n  padding-left: 5px;\n}\n\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n\n.btn-group > .btn-large + .dropdown-toggle {\n  *padding-top: 7px;\n  padding-right: 12px;\n  *padding-bottom: 7px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #0044cc;\n}\n\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #222222;\n}\n\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n\n.btn-mini .caret,\n.btn-small .caret,\n.btn-large .caret {\n  margin-top: 6px;\n}\n\n.btn-large .caret {\n  border-top-width: 5px;\n  border-right-width: 5px;\n  border-left-width: 5px;\n}\n\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-group-vertical > .btn + .btn {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 4px 4px 0 0;\n     -moz-border-radius: 4px 4px 0 0;\n          border-radius: 4px 4px 0 0;\n}\n\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 4px 4px;\n     -moz-border-radius: 0 0 4px 4px;\n          border-radius: 0 0 4px 4px;\n}\n\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 6px 6px 0 0;\n     -moz-border-radius: 6px 6px 0 0;\n          border-radius: 6px 6px 0 0;\n}\n\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n}\n\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n\n.alert h4 {\n  margin: 0;\n}\n\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success h4 {\n  color: #468847;\n}\n\n.alert-danger,\n.alert-error {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info h4 {\n  color: #3a87ad;\n}\n\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n\n.alert-block p + p {\n  margin-top: 5px;\n}\n\n.nav {\n  margin-bottom: 20px;\n  margin-left: 0;\n  list-style: none;\n}\n\n.nav > li > a {\n  display: block;\n}\n\n.nav > li > a:hover {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav > .pull-right {\n  float: right;\n}\n\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #999999;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n\n.nav-list {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-bottom: 0;\n}\n\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-right: -15px;\n  margin-left: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n\n.nav-list > .active > a,\n.nav-list > .active > a:hover {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #0088cc;\n}\n\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n     -moz-border-radius: 4px 4px 0 0;\n          border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n     -moz-border-radius: 5px;\n          border-radius: 5px;\n}\n\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover {\n  color: #ffffff;\n  background-color: #0088cc;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  -moz-border-radius-bottomleft: 4px;\n}\n\n.nav-tabs.nav-stacked > li > a:hover {\n  z-index: 2;\n  border-color: #ddd;\n}\n\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n}\n\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.nav .dropdown-toggle .caret {\n  margin-top: 6px;\n  border-top-color: #0088cc;\n  border-bottom-color: #0088cc;\n}\n\n.nav .dropdown-toggle:hover .caret {\n  border-top-color: #005580;\n  border-bottom-color: #005580;\n}\n\n/* move down carets for tabs */\n\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.nav > .dropdown.active > a:hover {\n  cursor: pointer;\n}\n\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover {\n  color: #ffffff;\n  background-color: #999999;\n  border-color: #999999;\n}\n\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n\n.tabs-stacked .open > a:hover {\n  border-color: #999999;\n}\n\n.tabbable {\n  *zoom: 1;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content {\n  overflow: auto;\n}\n\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n     -moz-border-radius: 0 0 4px 4px;\n          border-radius: 0 0 4px 4px;\n}\n\n.tabs-below > .nav-tabs > li > a:hover {\n  border-top-color: #ddd;\n  border-bottom-color: transparent;\n}\n\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover {\n  border-color: transparent #ddd #ddd #ddd;\n}\n\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.tabs-left > .nav-tabs > li > a:hover {\n  border-color: #eeeeee #dddddd #eeeeee #eeeeee;\n}\n\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.tabs-right > .nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #eeeeee #dddddd;\n}\n\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n\n.nav > .disabled > a {\n  color: #999999;\n}\n\n.nav > .disabled > a:hover {\n  text-decoration: none;\n  cursor: default;\n  background-color: transparent;\n}\n\n.navbar {\n  *position: relative;\n  *z-index: 2;\n  margin-bottom: 20px;\n  overflow: visible;\n}\n\n.navbar-inner {\n  min-height: 40px;\n  padding-right: 20px;\n  padding-left: 20px;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n  background-repeat: repeat-x;\n  border: 1px solid #d4d4d4;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n  *zoom: 1;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n}\n\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.navbar-inner:after {\n  clear: both;\n}\n\n.navbar .container {\n  width: auto;\n}\n\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n\n.navbar .brand {\n  display: block;\n  float: left;\n  padding: 10px 20px 10px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: #777777;\n  text-shadow: 0 1px 0 #ffffff;\n}\n\n.navbar .brand:hover {\n  text-decoration: none;\n}\n\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 40px;\n  color: #777777;\n}\n\n.navbar-link {\n  color: #777777;\n}\n\n.navbar-link:hover {\n  color: #333333;\n}\n\n.navbar .divider-vertical {\n  height: 40px;\n  margin: 0 9px;\n  border-right: 1px solid #ffffff;\n  border-left: 1px solid #f2f2f2;\n}\n\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 5px;\n}\n\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn {\n  margin-top: 0;\n}\n\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.navbar-form:after {\n  clear: both;\n}\n\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 5px;\n}\n\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 5px;\n  margin-bottom: 0;\n}\n\n.navbar-search .search-query {\n  padding: 4px 14px;\n  margin-bottom: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-right: 0;\n  padding-left: 0;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n\n.navbar-fixed-top {\n  top: 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n}\n\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n\n.navbar .nav > li {\n  float: left;\n}\n\n.navbar .nav > li > a {\n  float: none;\n  padding: 10px 15px 10px;\n  color: #777777;\n  text-decoration: none;\n  text-shadow: 0 1px 0 #ffffff;\n}\n\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  color: #333333;\n  text-decoration: none;\n  background-color: transparent;\n}\n\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #555555;\n  text-decoration: none;\n  background-color: #e5e5e5;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-right: 5px;\n  margin-left: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ededed;\n  *background-color: #e5e5e5;\n  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));\n  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);\n  background-repeat: repeat-x;\n  border-color: #e5e5e5 #e5e5e5 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n}\n\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #e5e5e5;\n  *background-color: #d9d9d9;\n}\n\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\n\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n     -moz-border-radius: 1px;\n          border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n\n.navbar .nav > li > .dropdown-menu:before {\n  position: absolute;\n  top: -7px;\n  left: 9px;\n  display: inline-block;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-left: 7px solid transparent;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  content: '';\n}\n\n.navbar .nav > li > .dropdown-menu:after {\n  position: absolute;\n  top: -6px;\n  left: 10px;\n  display: inline-block;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  border-left: 6px solid transparent;\n  content: '';\n}\n\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  top: auto;\n  bottom: -7px;\n  border-top: 7px solid #ccc;\n  border-bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\n\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  top: auto;\n  bottom: -6px;\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n}\n\n.navbar .nav li.dropdown > a:hover .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #555555;\n  background-color: #e5e5e5;\n}\n\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  right: 12px;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  right: 13px;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  right: 100%;\n  left: auto;\n  margin-right: -1px;\n  margin-left: 0;\n  -webkit-border-radius: 6px 0 6px 6px;\n     -moz-border-radius: 6px 0 6px 6px;\n          border-radius: 6px 0 6px 6px;\n}\n\n.navbar-inverse .navbar-inner {\n  background-color: #1b1b1b;\n  background-image: -moz-linear-gradient(top, #222222, #111111);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));\n  background-image: -webkit-linear-gradient(top, #222222, #111111);\n  background-image: -o-linear-gradient(top, #222222, #111111);\n  background-image: linear-gradient(to bottom, #222222, #111111);\n  background-repeat: repeat-x;\n  border-color: #252525;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);\n}\n\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #999999;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover {\n  color: #ffffff;\n}\n\n.navbar-inverse .brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #111111;\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.navbar-inverse .divider-vertical {\n  border-right-color: #222222;\n  border-left-color: #111111;\n}\n\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n  background-color: #111111;\n}\n\n.navbar-inverse .nav li.dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #515151;\n  border-color: #111111;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n  -webkit-transition: none;\n     -moz-transition: none;\n       -o-transition: none;\n          transition: none;\n}\n\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  outline: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n}\n\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e0e0e;\n  *background-color: #040404;\n  background-image: -moz-linear-gradient(top, #151515, #040404);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));\n  background-image: -webkit-linear-gradient(top, #151515, #040404);\n  background-image: -o-linear-gradient(top, #151515, #040404);\n  background-image: linear-gradient(to bottom, #151515, #040404);\n  background-repeat: repeat-x;\n  border-color: #040404 #040404 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #040404;\n  *background-color: #000000;\n}\n\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  text-shadow: 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  margin: 20px 0;\n}\n\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  margin-bottom: 0;\n  margin-left: 0;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  *zoom: 1;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.pagination ul > li {\n  display: inline;\n}\n\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n\n.pagination ul > li > a:hover,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: #999999;\n  cursor: default;\n}\n\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover {\n  color: #999999;\n  cursor: default;\n  background-color: transparent;\n}\n\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.pagination-centered {\n  text-align: center;\n}\n\n.pagination-right {\n  text-align: right;\n}\n\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-bottom-left-radius: 6px;\n          border-bottom-left-radius: 6px;\n  -webkit-border-top-left-radius: 6px;\n          border-top-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  -moz-border-radius-topleft: 6px;\n}\n\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 6px;\n          border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n          border-bottom-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  -moz-border-radius-bottomright: 6px;\n}\n\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-bottom-left-radius: 3px;\n          border-bottom-left-radius: 3px;\n  -webkit-border-top-left-radius: 3px;\n          border-top-left-radius: 3px;\n  -moz-border-radius-bottomleft: 3px;\n  -moz-border-radius-topleft: 3px;\n}\n\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 3px;\n          border-top-right-radius: 3px;\n  -webkit-border-bottom-right-radius: 3px;\n          border-bottom-right-radius: 3px;\n  -moz-border-radius-topright: 3px;\n  -moz-border-radius-bottomright: 3px;\n}\n\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 0 6px;\n  font-size: 10.5px;\n}\n\n.pager {\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n  *zoom: 1;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n.pager li > a:hover {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > span {\n  color: #999999;\n  cursor: default;\n  background-color: #fff;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding-box;\n          background-clip: padding-box;\n}\n\n.modal.fade {\n  top: -25%;\n  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;\n     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;\n       -o-transition: opacity 0.3s linear, top 0.3s ease-out;\n          transition: opacity 0.3s linear, top 0.3s ease-out;\n}\n\n.modal.fade.in {\n  top: 10%;\n}\n\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n\n.modal-header .close {\n  margin-top: 2px;\n}\n\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n\n.modal-body {\n  position: relative;\n  max-height: 400px;\n  padding: 15px;\n  overflow-y: auto;\n}\n\n.modal-form {\n  margin-bottom: 0;\n}\n\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n  *zoom: 1;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n     -moz-box-shadow: inset 0 1px 0 #ffffff;\n          box-shadow: inset 0 1px 0 #ffffff;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  padding: 5px;\n  font-size: 11px;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n\n.tooltip.top {\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  width: 236px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n     -moz-border-radius: 5px 5px 0 0;\n          border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n}\n\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.thumbnails:after {\n  clear: both;\n}\n\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n     -moz-transition: all 0.2s ease-in-out;\n       -o-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\na.thumbnail:hover {\n  border-color: #0088cc;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #555555;\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media .pull-left {\n  margin-right: 10px;\n}\n\n.media .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n}\n\n.label {\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.badge {\n  padding-right: 9px;\n  padding-left: 9px;\n  -webkit-border-radius: 9px;\n     -moz-border-radius: 9px;\n          border-radius: 9px;\n}\n\n.label:empty,\n.badge:empty {\n  display: none;\n}\n\na.label:hover,\na.badge:hover {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress .bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n     -moz-transition: width 0.6s ease;\n       -o-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n}\n\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n     -moz-background-size: 40px 40px;\n       -o-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.accordion {\n  margin-bottom: 20px;\n}\n\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.accordion-heading {\n  border-bottom: 0;\n}\n\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n\n.accordion-toggle {\n  cursor: pointer;\n}\n\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n     -moz-transition: 0.6s ease-in-out left;\n       -o-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img {\n  display: block;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #222222;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n     -moz-border-radius: 23px;\n          border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.right {\n  right: 15px;\n  left: auto;\n}\n\n.carousel-control:hover {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n\n.carousel-caption h4,\n.carousel-caption p {\n  line-height: 20px;\n  color: #ffffff;\n}\n\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n\n.carousel-caption p {\n  margin-bottom: 0;\n}\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  letter-spacing: -1px;\n  color: inherit;\n}\n\n.hero-unit li {\n  line-height: 30px;\n}\n\n.pull-right {\n  float: right;\n}\n\n.pull-left {\n  float: left;\n}\n\n.hide {\n  display: none;\n}\n\n.show {\n  display: block;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "selfblog/static/bootstrap/css/docs.css",
    "content": "/* Add additional stylesheets below\n-------------------------------------------------- */\n/*\n  Bootstrap's documentation styles\n  Special styles for presenting Bootstrap's documentation and examples\n*/\n\n\n\n/* Body and structure\n-------------------------------------------------- */\n\nbody {\n  position: relative;\n  padding-top: 40px;\n}\n\n/* Code in headings */\nh3 code {\n  font-size: 14px;\n  font-weight: normal;\n}\n\n\n\n/* Tweak navbar brand link to be super sleek\n-------------------------------------------------- */\n\nbody > .navbar {\n  font-size: 13px;\n}\n\n/* Change the docs' brand */\nbody > .navbar .brand {\n  padding-right: 0;\n  padding-left: 0;\n  margin-left: 20px;\n  float: right;\n  font-weight: bold;\n  color: #000;\n  text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125);\n  -webkit-transition: all .2s linear;\n     -moz-transition: all .2s linear;\n          transition: all .2s linear;\n}\nbody > .navbar .brand:hover {\n  text-decoration: none;\n  text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.4);\n}\n\n\n/* Sections\n-------------------------------------------------- */\n\n/* padding for in-page bookmarks and fixed navbar */\nsection {\n  padding-top: 30px;\n}\nsection > .page-header,\nsection > .lead {\n  color: #5a5a5a;\n}\nsection > ul li {\n  margin-bottom: 5px;\n}\n\n/* Separators (hr) */\n.bs-docs-separator {\n  margin: 40px 0 39px;\n}\n\n/* Faded out hr */\nhr.soften {\n  height: 1px;\n  margin: 70px 0;\n  background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));\n  background-image:    -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));\n  background-image:     -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));\n  background-image:      -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));\n  border: 0;\n}\n\n\n\n/* Jumbotrons\n-------------------------------------------------- */\n\n/* Base class\n------------------------- */\n.jumbotron {\n  position: relative;\n  padding: 40px 0;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 3px rgba(0,0,0,.4), 0 0 30px rgba(0,0,0,.075);\n  background: #020031; /* Old browsers */\n  background: -moz-linear-gradient(45deg,  #020031 0%, #6d3353 100%); /* FF3.6+ */\n  background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#020031), color-stop(100%,#6d3353)); /* Chrome,Safari4+ */\n  background: -webkit-linear-gradient(45deg,  #020031 0%,#6d3353 100%); /* Chrome10+,Safari5.1+ */\n  background: -o-linear-gradient(45deg,  #020031 0%,#6d3353 100%); /* Opera 11.10+ */\n  background: -ms-linear-gradient(45deg,  #020031 0%,#6d3353 100%); /* IE10+ */\n  background: linear-gradient(45deg,  #020031 0%,#6d3353 100%); /* W3C */\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#020031', endColorstr='#6d3353',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */\n  -webkit-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2);\n     -moz-box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2);\n          box-shadow: inset 0 3px 7px rgba(0,0,0,.2), inset 0 -3px 7px rgba(0,0,0,.2);\n}\n.jumbotron h1 {\n  font-size: 80px;\n  font-weight: bold;\n  letter-spacing: -1px;\n  line-height: 1;\n}\n.jumbotron p {\n  font-size: 24px;\n  font-weight: 300;\n  line-height: 1.25;\n  margin-bottom: 30px;\n}\n\n/* Link styles (used on .masthead-links as well) */\n.jumbotron a {\n  color: #fff;\n  color: rgba(255,255,255,.5);\n  -webkit-transition: all .2s ease-in-out;\n     -moz-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.jumbotron a:hover {\n  color: #fff;\n  text-shadow: 0 0 10px rgba(255,255,255,.25);\n}\n\n/* Download button */\n.masthead .btn {\n  padding: 19px 24px;\n  font-size: 24px;\n  font-weight: 200;\n  color: #fff; /* redeclare to override the `.jumbotron a` */\n  border: 0;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n     -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n          box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n  -webkit-transition: none;\n     -moz-transition: none;\n          transition: none;\n}\n.masthead .btn:hover {\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n     -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n          box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 5px rgba(0,0,0,.25);\n}\n.masthead .btn:active {\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1);\n     -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1);\n          box-shadow: inset 0 2px 4px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.1);\n}\n\n\n/* Pattern overlay\n------------------------- */\n.jumbotron .container {\n  position: relative;\n  z-index: 2;\n}\n.jumbotron:after {\n  content: '';\n  display: block;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background: url(../img/bs-docs-masthead-pattern.png) repeat center center;\n  opacity: .4;\n}\n@media\nonly screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (   min--moz-device-pixel-ratio: 2),\nonly screen and (     -o-min-device-pixel-ratio: 2/1) {\n\n  .jumbotron:after {\n    background-size: 150px 150px;\n  }\n\n}\n\n/* Masthead (docs home)\n------------------------- */\n.masthead {\n  padding: 70px 0 80px;\n  margin-bottom: 0;\n  color: #fff;\n}\n.masthead h1 {\n  font-size: 120px;\n  line-height: 1;\n  letter-spacing: -2px;\n}\n.masthead p {\n  font-size: 40px;\n  font-weight: 200;\n  line-height: 1.25;\n}\n\n/* Textual links in masthead */\n.masthead-links {\n  margin: 0;\n  list-style: none;\n}\n.masthead-links li {\n  display: inline;\n  padding: 0 10px;\n  color: rgba(255,255,255,.25);\n}\n\n/* Social proof buttons from GitHub & Twitter */\n.bs-docs-social {\n  padding: 15px 0;\n  text-align: center;\n  background-color: #f5f5f5;\n  border-top: 1px solid #fff;\n  border-bottom: 1px solid #ddd;\n}\n\n/* Quick links on Home */\n.bs-docs-social-buttons {\n  margin-left: 0;\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.bs-docs-social-buttons li {\n  display: inline-block;\n  padding: 5px 8px;\n  line-height: 1;\n  *display: inline;\n  *zoom: 1;\n}\n\n/* Subhead (other pages)\n------------------------- */\n.subhead {\n  text-align: left;\n  border-bottom: 1px solid #ddd;\n}\n.subhead h1 {\n  font-size: 60px;\n}\n.subhead p {\n  margin-bottom: 20px;\n}\n.subhead .navbar {\n  display: none;\n}\n\n\n\n/* Marketing section of Overview\n-------------------------------------------------- */\n\n.marketing {\n  text-align: center;\n  color: #5a5a5a;\n}\n.marketing h1 {\n  margin: 60px 0 10px;\n  font-size: 60px;\n  font-weight: 200;\n  line-height: 1;\n  letter-spacing: -1px;\n}\n.marketing h2 {\n  font-weight: 200;\n  margin-bottom: 5px;\n}\n.marketing p {\n  font-size: 16px;\n  line-height: 1.5;\n}\n.marketing .marketing-byline {\n  margin-bottom: 40px;\n  font-size: 20px;\n  font-weight: 300;\n  line-height: 1.25;\n  color: #999;\n}\n.marketing-img {\n  display: block;\n  margin: 0 auto 30px;\n  max-height: 145px;\n}\n\n\n\n/* Footer\n-------------------------------------------------- */\n\n.footer {\n  text-align: center;\n  padding: 30px 0;\n  margin-top: 70px;\n  border-top: 1px solid #e5e5e5;\n  background-color: #f5f5f5;\n}\n.footer p {\n  margin-bottom: 0;\n  color: #777;\n}\n.footer-links {\n  margin: 10px 0;\n}\n.footer-links li {\n  display: inline;\n  padding: 0 2px;\n}\n.footer-links li:first-child {\n  padding-left: 0;\n}\n\n\n\n/* Special grid styles\n-------------------------------------------------- */\n\n.show-grid {\n  margin-top: 10px;\n  margin-bottom: 20px;\n}\n.show-grid [class*=\"span\"] {\n  background-color: #eee;\n  text-align: center;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  min-height: 40px;\n  line-height: 40px;\n}\n.show-grid [class*=\"span\"]:hover {\n  background-color: #ddd;\n}\n.show-grid .show-grid {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.show-grid .show-grid [class*=\"span\"] {\n  margin-top: 5px;\n}\n.show-grid [class*=\"span\"] [class*=\"span\"] {\n  background-color: #ccc;\n}\n.show-grid [class*=\"span\"] [class*=\"span\"] [class*=\"span\"] {\n  background-color: #999;\n}\n\n\n\n/* Mini layout previews\n-------------------------------------------------- */\n.mini-layout {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075);\n     -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075);\n          box-shadow: 0 1px 2px rgba(0,0,0,.075);\n}\n.mini-layout,\n.mini-layout .mini-layout-body,\n.mini-layout.fluid .mini-layout-sidebar {\n  height: 300px;\n}\n.mini-layout {\n  margin-bottom: 20px;\n  padding: 9px;\n}\n.mini-layout div {\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n.mini-layout .mini-layout-body {\n  background-color: #dceaf4;\n  margin: 0 auto;\n  width: 70%;\n}\n.mini-layout.fluid .mini-layout-sidebar,\n.mini-layout.fluid .mini-layout-header,\n.mini-layout.fluid .mini-layout-body {\n  float: left;\n}\n.mini-layout.fluid .mini-layout-sidebar {\n  background-color: #bbd8e9;\n  width: 20%;\n}\n.mini-layout.fluid .mini-layout-body {\n  width: 77.5%;\n  margin-left: 2.5%;\n}\n\n\n\n/* Download page\n-------------------------------------------------- */\n\n.download .page-header {\n  margin-top: 36px;\n}\n.page-header .toggle-all {\n  margin-top: 5px;\n}\n\n/* Space out h3s when following a section */\n.download h3 {\n  margin-bottom: 5px;\n}\n.download-builder input + h3,\n.download-builder .checkbox + h3 {\n  margin-top: 9px;\n}\n\n/* Fields for variables */\n.download-builder input[type=text] {\n  margin-bottom: 9px;\n  font-family: Menlo, Monaco, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #d14;\n}\n.download-builder input[type=text]:focus {\n  background-color: #fff;\n}\n\n/* Custom, larger checkbox labels */\n.download .checkbox {\n  padding: 6px 10px 6px 25px;\n  font-size: 13px;\n  line-height: 18px;\n  color: #555;\n  background-color: #f9f9f9;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  cursor: pointer;\n}\n.download .checkbox:hover {\n  color: #333;\n  background-color: #f5f5f5;\n}\n.download .checkbox small {\n  font-size: 12px;\n  color: #777;\n}\n\n/* Variables section */\n#variables label {\n  margin-bottom: 0;\n}\n\n/* Giant download button */\n.download-btn {\n  margin: 36px 0 108px;\n}\n#download p,\n#download h4 {\n  max-width: 50%;\n  margin: 0 auto;\n  color: #999;\n  text-align: center;\n}\n#download h4 {\n  margin-bottom: 0;\n}\n#download p {\n  margin-bottom: 18px;\n}\n.download-btn .btn {\n  display: block;\n  width: auto;\n  padding: 19px 24px;\n  margin-bottom: 27px;\n  font-size: 30px;\n  line-height: 1;\n  text-align: center;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n\n\n/* Misc\n-------------------------------------------------- */\n\n/* Make tables spaced out a bit more */\nh2 + table,\nh3 + table,\nh4 + table,\nh2 + .row {\n  margin-top: 5px;\n}\n\n/* Example sites showcase */\n.example-sites {\n  xmargin-left: 20px;\n}\n.example-sites img {\n  max-width: 100%;\n  margin: 0 auto;\n}\n\n.scrollspy-example {\n  height: 200px;\n  overflow: auto;\n  position: relative;\n}\n\n\n/* Fake the :focus state to demo it */\n.focused {\n  border-color: rgba(82,168,236,.8);\n  -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);\n     -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);\n          box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);\n  outline: 0;\n}\n\n/* For input sizes, make them display block */\n.docs-input-sizes select,\n.docs-input-sizes input[type=text] {\n  display: block;\n  margin-bottom: 9px;\n}\n\n/* Icons\n------------------------- */\n.the-icons {\n  margin-left: 0;\n  list-style: none;\n}\n.the-icons li {\n  float: left;\n  width: 25%;\n  line-height: 25px;\n}\n.the-icons i:hover {\n  background-color: rgba(255,0,0,.25);\n}\n\n/* Example page\n------------------------- */\n.bootstrap-examples h4 {\n  margin: 10px 0 5px;\n}\n.bootstrap-examples p {\n  font-size: 13px;\n  line-height: 18px;\n}\n.bootstrap-examples .thumbnail {\n  margin-bottom: 9px;\n  background-color: #fff;\n}\n\n\n\n/* Bootstrap code examples\n-------------------------------------------------- */\n\n/* Base class */\n.bs-docs-example {\n  position: relative;\n  margin: 15px 0;\n  padding: 39px 19px 14px;\n  *padding-top: 19px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n/* Echo out a label for the example */\n.bs-docs-example:after {\n  content: \"Example\";\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  background-color: #f5f5f5;\n  border: 1px solid #ddd;\n  color: #9da0a4;\n  -webkit-border-radius: 4px 0 4px 0;\n     -moz-border-radius: 4px 0 4px 0;\n          border-radius: 4px 0 4px 0;\n}\n\n/* Remove spacing between an example and it's code */\n.bs-docs-example + .prettyprint {\n  margin-top: -20px;\n  padding-top: 15px;\n}\n\n/* Tweak examples\n------------------------- */\n.bs-docs-example > p:last-child {\n  margin-bottom: 0;\n}\n.bs-docs-example .table,\n.bs-docs-example .progress,\n.bs-docs-example .well,\n.bs-docs-example .alert,\n.bs-docs-example .hero-unit,\n.bs-docs-example .pagination,\n.bs-docs-example .navbar,\n.bs-docs-example > .nav,\n.bs-docs-example blockquote {\n  margin-bottom: 5px;\n}\n.bs-docs-example .pagination {\n  margin-top: 0;\n}\n.bs-navbar-top-example,\n.bs-navbar-bottom-example {\n  z-index: 1;\n  padding: 0;\n  height: 90px;\n  overflow: hidden; /* cut the drop shadows off */\n}\n.bs-navbar-top-example .navbar-fixed-top,\n.bs-navbar-bottom-example .navbar-fixed-bottom {\n  margin-left: 0;\n  margin-right: 0;\n}\n.bs-navbar-top-example {\n  -webkit-border-radius: 0 0 4px 4px;\n     -moz-border-radius: 0 0 4px 4px;\n          border-radius: 0 0 4px 4px;\n}\n.bs-navbar-top-example:after {\n  top: auto;\n  bottom: -1px;\n  -webkit-border-radius: 0 4px 0 4px;\n     -moz-border-radius: 0 4px 0 4px;\n          border-radius: 0 4px 0 4px;\n}\n.bs-navbar-bottom-example {\n  -webkit-border-radius: 4px 4px 0 0;\n     -moz-border-radius: 4px 4px 0 0;\n          border-radius: 4px 4px 0 0;\n}\n.bs-navbar-bottom-example .navbar {\n  margin-bottom: 0;\n}\nform.bs-docs-example {\n  padding-bottom: 19px;\n}\n\n/* Images */\n.bs-docs-example-images img {\n  margin: 10px;\n  display: inline-block;\n}\n\n/* Tooltips */\n.bs-docs-tooltip-examples {\n  text-align: center;\n  margin: 0 0 10px;\n  list-style: none;\n}\n.bs-docs-tooltip-examples li {\n  display: inline;\n  padding: 0 10px;\n}\n\n/* Popovers */\n.bs-docs-example-popover {\n  padding-bottom: 24px;\n  background-color: #f9f9f9;\n}\n.bs-docs-example-popover .popover {\n  position: relative;\n  display: block;\n  float: left;\n  width: 260px;\n  margin: 20px;\n}\n\n/* Dropdowns */\n.bs-docs-example-submenus {\n  min-height: 180px;\n}\n.bs-docs-example-submenus > .pull-left + .pull-left {\n  margin-left: 20px;\n}\n.bs-docs-example-submenus .dropup > .dropdown-menu,\n.bs-docs-example-submenus .dropdown > .dropdown-menu {\n  display: block;\n  position: static;\n  margin-bottom: 5px;\n  *width: 180px;\n}\n\n\n\n/* Responsive docs\n-------------------------------------------------- */\n\n/* Utility classes table\n------------------------- */\n.responsive-utilities th small {\n  display: block;\n  font-weight: normal;\n  color: #999;\n}\n.responsive-utilities tbody th {\n  font-weight: normal;\n}\n.responsive-utilities td {\n  text-align: center;\n}\n.responsive-utilities td.is-visible {\n  color: #468847;\n  background-color: #dff0d8 !important;\n}\n.responsive-utilities td.is-hidden {\n  color: #ccc;\n  background-color: #f9f9f9 !important;\n}\n\n/* Responsive tests\n------------------------- */\n.responsive-utilities-test {\n  margin-top: 5px;\n  margin-left: 0;\n  list-style: none;\n  overflow: hidden; /* clear floats */\n}\n.responsive-utilities-test li {\n  position: relative;\n  float: left;\n  width: 25%;\n  height: 43px;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 43px;\n  color: #999;\n  text-align: center;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n.responsive-utilities-test li + li {\n  margin-left: 10px;\n}\n.responsive-utilities-test span {\n  position: absolute;\n  top:    -1px;\n  left:   -1px;\n  right:  -1px;\n  bottom: -1px;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n.responsive-utilities-test span {\n  color: #468847;\n  background-color: #dff0d8;\n  border: 1px solid #d6e9c6;\n}\n\n\n\n/* Sidenav for Docs\n-------------------------------------------------- */\n\n.bs-docs-sidenav {\n  width: 228px;\n  margin: 30px 0 0;\n  padding: 0;\n  background-color: #fff;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.065);\n     -moz-box-shadow: 0 1px 4px rgba(0,0,0,.065);\n          box-shadow: 0 1px 4px rgba(0,0,0,.065);\n}\n.bs-docs-sidenav > li > a {\n  display: block;\n  width: 190px \\9;\n  margin: 0 0 -1px;\n  padding: 8px 14px;\n  border: 1px solid #e5e5e5;\n}\n.bs-docs-sidenav > li:first-child > a {\n  -webkit-border-radius: 6px 6px 0 0;\n     -moz-border-radius: 6px 6px 0 0;\n          border-radius: 6px 6px 0 0;\n}\n.bs-docs-sidenav > li:last-child > a {\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n}\n.bs-docs-sidenav > .active > a {\n  position: relative;\n  z-index: 2;\n  padding: 9px 15px;\n  border: 0;\n  text-shadow: 0 1px 0 rgba(0,0,0,.15);\n  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);\n     -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);\n          box-shadow: inset 1px 0 0 rgba(0,0,0,.1), inset -1px 0 0 rgba(0,0,0,.1);\n}\n/* Chevrons */\n.bs-docs-sidenav .icon-chevron-right {\n  float: right;\n  margin-top: 2px;\n  margin-right: -6px;\n  opacity: .25;\n}\n.bs-docs-sidenav > li > a:hover {\n  background-color: #f5f5f5;\n}\n.bs-docs-sidenav a:hover .icon-chevron-right {\n  opacity: .5;\n}\n.bs-docs-sidenav .active .icon-chevron-right,\n.bs-docs-sidenav .active a:hover .icon-chevron-right {\n  background-image: url(../img/glyphicons-halflings-white.png);\n  opacity: 1;\n}\n.bs-docs-sidenav.affix {\n  top: 40px;\n}\n.bs-docs-sidenav.affix-bottom {\n  position: absolute;\n  top: auto;\n  bottom: 270px;\n}\n\n\n\n\n/* Responsive\n-------------------------------------------------- */\n\n/* Desktop large\n------------------------- */\n@media (min-width: 1200px) {\n  .bs-docs-container {\n    max-width: 970px;\n  }\n  .bs-docs-sidenav {\n    width: 258px;\n  }\n  .bs-docs-sidenav > li > a {\n    width: 230px \\9; /* Override the previous IE8-9 hack */\n  }\n}\n\n/* Desktop\n------------------------- */\n@media (max-width: 980px) {\n  /* Unfloat brand */\n  body > .navbar-fixed-top .brand {\n    float: left;\n    margin-left: 0;\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n\n  /* Inline-block quick links for more spacing */\n  .quick-links li {\n    display: inline-block;\n    margin: 5px;\n  }\n\n  /* When affixed, space properly */\n  .bs-docs-sidenav {\n    top: 0;\n    width: 218px;\n    margin-top: 30px;\n    margin-right: 0;\n  }\n}\n\n/* Tablet to desktop\n------------------------- */\n@media (min-width: 768px) and (max-width: 979px) {\n  /* Remove any padding from the body */\n  body {\n    padding-top: 0;\n  }\n  /* Widen masthead and social buttons to fill body padding */\n  .jumbotron {\n    margin-top: -20px; /* Offset bottom margin on .navbar */\n  }\n  /* Adjust sidenav width */\n  .bs-docs-sidenav {\n    width: 166px;\n    margin-top: 20px;\n  }\n  .bs-docs-sidenav.affix {\n    top: 0;\n  }\n}\n\n/* Tablet\n------------------------- */\n@media (max-width: 767px) {\n  /* Remove any padding from the body */\n  body {\n    padding-top: 0;\n  }\n\n  /* Widen masthead and social buttons to fill body padding */\n  .jumbotron {\n    padding: 40px 20px;\n    margin-top:   -20px; /* Offset bottom margin on .navbar */\n    margin-right: -20px;\n    margin-left:  -20px;\n  }\n  .masthead h1 {\n    font-size: 90px;\n  }\n  .masthead p,\n  .masthead .btn {\n    font-size: 24px;\n  }\n  .marketing .span4 {\n    margin-bottom: 40px;\n  }\n  .bs-docs-social {\n    margin: 0 -20px;\n  }\n\n  /* Space out the show-grid examples */\n  .show-grid [class*=\"span\"] {\n    margin-bottom: 5px;\n  }\n\n  /* Sidenav */\n  .bs-docs-sidenav {\n    width: auto;\n    margin-bottom: 20px;\n  }\n  .bs-docs-sidenav.affix {\n    position: static;\n    width: auto;\n    top: 0;\n  }\n\n  /* Unfloat the back to top link in footer */\n  .footer {\n    margin-left: -20px;\n    margin-right: -20px;\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .footer p {\n    margin-bottom: 9px;\n  }\n}\n\n/* Landscape phones\n------------------------- */\n@media (max-width: 480px) {\n  /* Remove padding above jumbotron */\n  body {\n    padding-top: 0;\n  }\n\n  /* Change up some type stuff */\n  h2 small {\n    display: block;\n  }\n\n  /* Downsize the jumbotrons */\n  .jumbotron h1 {\n    font-size: 45px;\n  }\n  .jumbotron p,\n  .jumbotron .btn {\n    font-size: 18px;\n  }\n  .jumbotron .btn {\n    display: block;\n    margin: 0 auto;\n  }\n\n  /* center align subhead text like the masthead */\n  .subhead h1,\n  .subhead p {\n    text-align: center;\n  }\n\n  /* Marketing on home */\n  .marketing h1 {\n    font-size: 30px;\n  }\n  .marketing-byline {\n    font-size: 18px;\n  }\n\n  /* center example sites */\n  .example-sites {\n    margin-left: 0;\n  }\n  .example-sites > li {\n    float: none;\n    display: block;\n    max-width: 280px;\n    margin: 0 auto 18px;\n    text-align: center;\n  }\n  .example-sites .thumbnail > img {\n    max-width: 270px;\n  }\n\n  /* Do our best to make tables work in narrow viewports */\n  table code {\n    white-space: normal;\n    word-wrap: break-word;\n    word-break: break-all;\n  }\n\n  /* Examples: dropdowns */\n  .bs-docs-example-submenus > .pull-left {\n    float: none;\n    clear: both;\n  }\n  .bs-docs-example-submenus > .pull-left,\n  .bs-docs-example-submenus > .pull-left + .pull-left {\n    margin-left: 0;\n  }\n  .bs-docs-example-submenus p {\n    margin-bottom: 0;\n  }\n  .bs-docs-example-submenus .dropup > .dropdown-menu,\n  .bs-docs-example-submenus .dropdown > .dropdown-menu {\n    margin-bottom: 10px;\n    float: none;\n    max-width: 180px;\n  }\n\n  /* Examples: modal */\n  .modal-example .modal {\n    position: relative;\n    top: auto;\n    right: auto;\n    bottom: auto;\n    left: auto;\n  }\n\n  /* Tighten up footer */\n  .footer {\n    padding-top: 20px;\n    padding-bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "selfblog/static/bootstrap/css/prettify.css",
    "content": ".com { color: #93a1a1; }\n.lit { color: #195f91; }\n.pun, .opn, .clo { color: #93a1a1; }\n.fun { color: #dc322f; }\n.str, .atv { color: #D14; }\n.kwd, .prettyprint .tag { color: #1e347b; }\n.typ, .atn, .dec, .var { color: teal; }\n.pln { color: #48484c; }\n\n.prettyprint {\n  padding: 8px;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n}\n.prettyprint.linenums {\n  -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n     -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n          box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;\n}\n\n/* Specify class=linenums on a pre to get line numbering */\nol.linenums {\n  margin: 0 0 0 33px; /* IE indents via margin-left */\n}\nol.linenums li {\n  padding-left: 12px;\n  color: #bebec5;\n  line-height: 20px;\n  text-shadow: 0 1px 0 #fff;\n}"
  },
  {
    "path": "selfblog/static/bootstrap/js/bootstrap-dropdown.js",
    "content": "/* ============================================================\n * bootstrap-dropdown.js v2.3.1\n * http://twitter.github.com/bootstrap/javascript.html#dropdowns\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) {\n        if (e.which == 27) $parent.find(toggle).focus()\n        return $this.click()\n      }\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = selector && $(selector)\n\n    if (!$parent || !$parent.length) $parent = $this.parent()\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api', clearMenus)\n    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.dropdown-menu', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n"
  },
  {
    "path": "selfblog/static/bootstrap/js/bootstrap.js",
    "content": "/* ===================================================\n * bootstrap-transition.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#transitions\n * ===================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function () {\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-alert.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#alerts\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* ALERT CLASS DEFINITION\n  * ====================== */\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n    , Alert = function (el) {\n        $(el).on('click', dismiss, this.close)\n      }\n\n  Alert.prototype.close = function (e) {\n    var $this = $(this)\n      , selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n\n    e && e.preventDefault()\n\n    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())\n\n    $parent.trigger(e = $.Event('close'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent\n        .trigger('closed')\n        .remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent.on($.support.transition.end, removeElement) :\n      removeElement()\n  }\n\n\n /* ALERT PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('alert')\n      if (!data) $this.data('alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n /* ALERT NO CONFLICT\n  * ================= */\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n /* ALERT DATA-API\n  * ============== */\n\n  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);/* ============================================================\n * bootstrap-button.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#buttons\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* BUTTON PUBLIC CLASS DEFINITION\n  * ============================== */\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.button.defaults, options)\n  }\n\n  Button.prototype.setState = function (state) {\n    var d = 'disabled'\n      , $el = this.$element\n      , data = $el.data()\n      , val = $el.is('input') ? 'val' : 'html'\n\n    state = state + 'Text'\n    data.resetText || $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d)\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons-radio\"]')\n\n    $parent && $parent\n      .find('.active')\n      .removeClass('active')\n\n    this.$element.toggleClass('active')\n  }\n\n\n /* BUTTON PLUGIN DEFINITION\n  * ======================== */\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('button')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('button', (data = new Button(this, options)))\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.defaults = {\n    loadingText: 'loading...'\n  }\n\n  $.fn.button.Constructor = Button\n\n\n /* BUTTON NO CONFLICT\n  * ================== */\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n /* BUTTON DATA-API\n  * =============== */\n\n  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-carousel.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#carousel\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* CAROUSEL CLASS DEFINITION\n  * ========================= */\n\n  var Carousel = function (element, options) {\n    this.$element = $(element)\n    this.options = options\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.prototype = {\n\n    cycle: function (e) {\n      if (!e) this.paused = false\n      this.options.interval\n        && !this.paused\n        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n      return this\n    }\n\n  , to: function (pos) {\n      var $active = this.$element.find('.item.active')\n        , children = $active.parent().children()\n        , activePos = children.index($active)\n        , that = this\n\n      if (pos > (children.length - 1) || pos < 0) return\n\n      if (this.sliding) {\n        return this.$element.one('slid', function () {\n          that.to(pos)\n        })\n      }\n\n      if (activePos == pos) {\n        return this.pause().cycle()\n      }\n\n      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))\n    }\n\n  , pause: function (e) {\n      if (!e) this.paused = true\n      if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n        this.$element.trigger($.support.transition.end)\n        this.cycle()\n      }\n      clearInterval(this.interval)\n      this.interval = null\n      return this\n    }\n\n  , next: function () {\n      if (this.sliding) return\n      return this.slide('next')\n    }\n\n  , prev: function () {\n      if (this.sliding) return\n      return this.slide('prev')\n    }\n\n  , slide: function (type, next) {\n      var $active = this.$element.find('.item.active')\n        , $next = next || $active[type]()\n        , isCycling = this.interval\n        , direction = type == 'next' ? 'left' : 'right'\n        , fallback  = type == 'next' ? 'first' : 'last'\n        , that = this\n        , e\n\n      this.sliding = true\n\n      isCycling && this.pause()\n\n      $next = $next.length ? $next : this.$element.find('.item')[fallback]()\n\n      e = $.Event('slide', {\n        relatedTarget: $next[0]\n      })\n\n      if ($next.hasClass('active')) return\n\n      if ($.support.transition && this.$element.hasClass('slide')) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $next.addClass(type)\n        $next[0].offsetWidth // force reflow\n        $active.addClass(direction)\n        $next.addClass(direction)\n        this.$element.one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n      } else {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $active.removeClass('active')\n        $next.addClass('active')\n        this.sliding = false\n        this.$element.trigger('slid')\n      }\n\n      isCycling && this.cycle()\n\n      return this\n    }\n\n  }\n\n\n /* CAROUSEL PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('carousel')\n        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)\n        , action = typeof option == 'string' ? option : options.slide\n      if (!data) $this.data('carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.cycle()\n    })\n  }\n\n  $.fn.carousel.defaults = {\n    interval: 5000\n  , pause: 'hover'\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n /* CAROUSEL NO CONFLICT\n  * ==================== */\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n /* CAROUSEL DATA-API\n  * ================= */\n\n  $(document).on('click.carousel.data-api', '[data-slide]', function (e) {\n    var $this = $(this), href\n      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      , options = $.extend({}, $target.data(), $this.data())\n    $target.carousel(options)\n    e.preventDefault()\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-collapse.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#collapse\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* COLLAPSE PUBLIC CLASS DEFINITION\n  * ================================ */\n\n  var Collapse = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.collapse.defaults, options)\n\n    if (this.options.parent) {\n      this.$parent = $(this.options.parent)\n    }\n\n    this.options.toggle && this.toggle()\n  }\n\n  Collapse.prototype = {\n\n    constructor: Collapse\n\n  , dimension: function () {\n      var hasWidth = this.$element.hasClass('width')\n      return hasWidth ? 'width' : 'height'\n    }\n\n  , show: function () {\n      var dimension\n        , scroll\n        , actives\n        , hasData\n\n      if (this.transitioning) return\n\n      dimension = this.dimension()\n      scroll = $.camelCase(['scroll', dimension].join('-'))\n      actives = this.$parent && this.$parent.find('> .accordion-group > .in')\n\n      if (actives && actives.length) {\n        hasData = actives.data('collapse')\n        if (hasData && hasData.transitioning) return\n        actives.collapse('hide')\n        hasData || actives.data('collapse', null)\n      }\n\n      this.$element[dimension](0)\n      this.transition('addClass', $.Event('show'), 'shown')\n      $.support.transition && this.$element[dimension](this.$element[0][scroll])\n    }\n\n  , hide: function () {\n      var dimension\n      if (this.transitioning) return\n      dimension = this.dimension()\n      this.reset(this.$element[dimension]())\n      this.transition('removeClass', $.Event('hide'), 'hidden')\n      this.$element[dimension](0)\n    }\n\n  , reset: function (size) {\n      var dimension = this.dimension()\n\n      this.$element\n        .removeClass('collapse')\n        [dimension](size || 'auto')\n        [0].offsetWidth\n\n      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')\n\n      return this\n    }\n\n  , transition: function (method, startEvent, completeEvent) {\n      var that = this\n        , complete = function () {\n            if (startEvent.type == 'show') that.reset()\n            that.transitioning = 0\n            that.$element.trigger(completeEvent)\n          }\n\n      this.$element.trigger(startEvent)\n\n      if (startEvent.isDefaultPrevented()) return\n\n      this.transitioning = 1\n\n      this.$element[method]('in')\n\n      $.support.transition && this.$element.hasClass('collapse') ?\n        this.$element.one($.support.transition.end, complete) :\n        complete()\n    }\n\n  , toggle: function () {\n      this[this.$element.hasClass('in') ? 'hide' : 'show']()\n    }\n\n  }\n\n\n /* COLLAPSE PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('collapse')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.defaults = {\n    toggle: true\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n /* COLLAPSE NO CONFLICT\n  * ==================== */\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n /* COLLAPSE DATA-API\n  * ================= */\n\n  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this = $(this), href\n      , target = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n      , option = $(target).data('collapse') ? 'toggle' : $this.data()\n    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    $(target).collapse(option)\n  })\n\n}(window.jQuery);/* ============================================================\n * bootstrap-dropdown.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#dropdowns\n * ============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n    $parent.length || ($parent = $this.parent())\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)\n    .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);/* =========================================================\n * bootstrap-modal.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :\n            that.$element.focus().trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function (that) {\n        this.$element\n          .hide()\n          .trigger('hidden')\n\n        this.backdrop()\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          this.$backdrop.click(\n            this.options.backdrop == 'static' ?\n              $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n          )\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :\n            this.removeBackdrop()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL NO CONFLICT\n  * ================= */\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function () {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-tooltip.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      if (this.options.trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (this.options.trigger != 'manual') {\n        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'\n        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'\n        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , inside\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n\n      if (this.hasContent() && this.enabled) {\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        inside = /in/.test(placement)\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n          .insertAfter(this.$element)\n\n        pos = this.getPosition(inside)\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (inside ? placement.split(' ')[1] : placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n        }\n\n        $tip\n          .offset(tp)\n          .addClass(placement)\n          .addClass('in')\n      }\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function (inside) {\n      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {\n        width: this.$element[0].offsetWidth\n      , height: this.$element[0].offsetHeight\n      })\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n      self[self.tip().hasClass('in') ? 'hide' : 'show']()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover'\n  , title: ''\n  , delay: 0\n  , html: false\n  }\n\n\n /* TOOLTIP NO CONFLICT\n  * =================== */\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);/* ===========================================================\n * bootstrap-popover.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#popovers\n * ===========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* POPOVER PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n\n  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js\n     ========================================== */\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {\n\n    constructor: Popover\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n        , content = this.getContent()\n\n      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n      $tip.removeClass('fade top bottom left right in')\n    }\n\n  , hasContent: function () {\n      return this.getTitle() || this.getContent()\n    }\n\n  , getContent: function () {\n      var content\n        , $e = this.$element\n        , o = this.options\n\n      content = $e.attr('data-content')\n        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)\n\n      return content\n    }\n\n  , tip: function () {\n      if (!this.$tip) {\n        this.$tip = $(this.options.template)\n      }\n      return this.$tip\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  })\n\n\n /* POPOVER PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('popover')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><div class=\"popover-inner\"><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div></div>'\n  })\n\n\n /* POPOVER NO CONFLICT\n  * =================== */\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);/* =============================================================\n * bootstrap-scrollspy.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#scrollspy\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* SCROLLSPY CLASS DEFINITION\n  * ========================== */\n\n  function ScrollSpy(element, options) {\n    var process = $.proxy(this.process, this)\n      , $element = $(element).is('body') ? $(window) : $(element)\n      , href\n    this.options = $.extend({}, $.fn.scrollspy.defaults, options)\n    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)\n    this.selector = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.$body = $('body')\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.prototype = {\n\n      constructor: ScrollSpy\n\n    , refresh: function () {\n        var self = this\n          , $targets\n\n        this.offsets = $([])\n        this.targets = $([])\n\n        $targets = this.$body\n          .find(this.selector)\n          .map(function () {\n            var $el = $(this)\n              , href = $el.data('target') || $el.attr('href')\n              , $href = /^#\\w/.test(href) && $(href)\n            return ( $href\n              && $href.length\n              && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null\n          })\n          .sort(function (a, b) { return a[0] - b[0] })\n          .each(function () {\n            self.offsets.push(this[0])\n            self.targets.push(this[1])\n          })\n      }\n\n    , process: function () {\n        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n          , maxScroll = scrollHeight - this.$scrollElement.height()\n          , offsets = this.offsets\n          , targets = this.targets\n          , activeTarget = this.activeTarget\n          , i\n\n        if (scrollTop >= maxScroll) {\n          return activeTarget != (i = targets.last()[0])\n            && this.activate ( i )\n        }\n\n        for (i = offsets.length; i--;) {\n          activeTarget != targets[i]\n            && scrollTop >= offsets[i]\n            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n            && this.activate( targets[i] )\n        }\n      }\n\n    , activate: function (target) {\n        var active\n          , selector\n\n        this.activeTarget = target\n\n        $(this.selector)\n          .parent('.active')\n          .removeClass('active')\n\n        selector = this.selector\n          + '[data-target=\"' + target + '\"],'\n          + this.selector + '[href=\"' + target + '\"]'\n\n        active = $(selector)\n          .parent('li')\n          .addClass('active')\n\n        if (active.parent('.dropdown-menu').length)  {\n          active = active.closest('li.dropdown').addClass('active')\n        }\n\n        active.trigger('activate')\n      }\n\n  }\n\n\n /* SCROLLSPY PLUGIN DEFINITION\n  * =========================== */\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('scrollspy')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n  $.fn.scrollspy.defaults = {\n    offset: 10\n  }\n\n\n /* SCROLLSPY NO CONFLICT\n  * ===================== */\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n /* SCROLLSPY DATA-API\n  * ================== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);/* ========================================================\n * bootstrap-tab.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#tabs\n * ========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB NO CONFLICT\n  * =============== */\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-typeahead.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#typeahead\n * =============================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n      var val = this.$menu.find('.active').attr('data-value')\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n        , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n  , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      })\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n    }\n\n  , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup()\n      }\n\n      e.stopPropagation()\n      e.preventDefault()\n  }\n\n  , blur: function (e) {\n      var that = this\n      setTimeout(function () { that.hide() }, 150)\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n    }\n\n  , mouseenter: function (e) {\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /* TYPEAHEAD NO CONFLICT\n  * =================== */\n\n  $.fn.typeahead.noConflict = function () {\n    $.fn.typeahead = old\n    return this\n  }\n\n\n /* TYPEAHEAD DATA-API\n  * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    e.preventDefault()\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n/* ==========================================================\n * bootstrap-affix.js v2.2.2\n * http://twitter.github.com/bootstrap/javascript.html#affix\n * ==========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX NO CONFLICT\n  * ================= */\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);"
  },
  {
    "path": "selfblog/utils/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/utils/cache.py",
    "content": "#coding:utf-8\nimport logging\nimport md5\ntry:\n    from collections import OrderedDict\nexcept ImportError:\n    from ordereddict import OrderedDict\n\nfrom time import time\nfrom django.core.cache import get_cache\n\nlogger = logging.getLogger(__name__)\n\ntry:\n    cache = get_cache('memcache')\nexcept ImportError as e:\n    logger.warn(u'加载memcache时出错:[%s], 改为内存缓存', e)\n    cache = get_cache('default')\n\n\ndef cache_decorator(expiration=3*60):\n\n    def wrapper(func):\n        def news(*args, **kwargs):\n            unique_str = repr((func, args, kwargs))\n            m = md5.new(unique_str)\n            key = m.hexdigest()\n            value = cache.get(key)\n            if value:\n                return value\n            else:\n                value = func(*args, **kwargs)\n                cache.set(key, value, expiration)\n                return value\n        return news\n    return wrapper\n\n\n#copy from https://github.com/the5fire/Python-LRU-cache\nclass LRUCacheDict(object):\n    def __init__(self, max_size=1024, expiration=15*60):\n        self.max_size = max_size\n        self.expiration = expiration\n\n        self.__values = {}\n        self.__expire_times = OrderedDict()\n        self.__access_times = OrderedDict()\n\n    def items(self):\n        return self.__values.items()\n\n    def values(self):\n        return self.__values.values()\n\n    def size(self):\n        return len(self.__values)\n\n    def clear(self):\n        self.__values.clear()\n        self.__expire_times.clear()\n        self.__access_times.clear()\n\n    def has_key(self, key):\n        return key in self.__values\n\n    def __setitem__(self, key, value):\n        t = int(time())\n        self.__delete__(key)\n        self.__values[key] = value\n        self.__access_times[key] = t\n        self.__expire_times[key] = t + self.expiration\n        self.cleanup()\n\n    def __getitem__(self, key):\n        t = int(time())\n        del self.__access_times[key]\n        self.__access_times[key] = t\n        self.cleanup()\n        return self.__values[key]\n\n    def __delete__(self, key):\n        if self.__values.has_key(key):\n            del self.__values[key]\n            del self.__expire_times[key]\n            del self.__access_times[key]\n\n    def cleanup(self):\n        if self.expiration is None:\n            return None\n        t = int(time())\n        #Delete expired\n        for k in self.__expire_times.iterkeys():\n            if self.__expire_times[k] < t:\n                self.__delete__(k)\n            else:\n                break\n\n        #If we have more than self.max_size items, delete the oldest\n        while (len(self.__values) > self.max_size):\n            for k in self.__access_times.iterkeys():\n                self.__delete__(k)\n                break\n"
  },
  {
    "path": "selfblog/utils/markup.py",
    "content": "#coding:utf-8\nfrom django import template\nfrom django.conf import settings\nfrom django.utils.safestring import mark_safe\nfrom django.utils.encoding import force_bytes, force_text\n\n\ndef restructuredtext(value):\n    import warnings\n    warnings.warn('The restructuredtext filter has been deprecated',\n                  category=DeprecationWarning)\n    try:\n        from docutils.core import publish_parts\n    except ImportError:\n        if settings.DEBUG:\n            raise template.TemplateSyntaxError(\"Error in 'restructuredtext' filter: The Python docutils library isn't installed.\")\n        return force_text(value)\n    else:\n        docutils_settings = getattr(settings, \"RESTRUCTUREDTEXT_FILTER_SETTINGS\", {})\n        parts = publish_parts(source=force_bytes(value), writer_name=\"html4css1\", settings_overrides=docutils_settings)\n        return mark_safe(force_text(parts[\"fragment\"]))\n"
  },
  {
    "path": "selfblog/utils/profiler.py",
    "content": "#coding:utf-8\nfrom django.db import connection\nfrom pprint import pprint as pp\nimport time\n\n\ndef print_queries(func):\n    def wrapper(*args, **kwargs):\n        start = time.time()\n        result = func(*args, **kwargs)\n        print 'the function[%s] cast you [%s]s' % (func.__name__, (time.time() - start))\n        pp(connection.queries)\n        return result\n    return wrapper\n"
  },
  {
    "path": "selfblog/weixin/__init__.py",
    "content": ""
  },
  {
    "path": "selfblog/weixin/adminx.py",
    "content": "#coding:utf-8\nfrom __future__ import unicode_literals\n\nimport json\nimport urllib2\n\nimport requests\nimport xadmin\nfrom django.conf import settings\n\nfrom .models import Menu, ResponseMessage, Message, Event\n\nweixin_menu = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s'\nget_access_token = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (settings.WEIXIN_APPID, settings.WEIXIN_APPSECRET)  # noqa\n\n\nclass MenuAdmin(object):\n    list_display = ('id', 'success', 'content', 'created_time')\n    save_on_top = True\n    access_token = None\n\n    def save_model(self, request, obj, form, change):\n        try:\n            if self.set_menu(obj):\n                obj.success = True\n        except Exception as e:\n            obj.response_data = str(e)\n        obj.save()\n\n    def set_menu(self, obj):\n        # 调用微信设置菜单接口\n        if not self.access_token:\n            self.get_access_token()\n\n        content = obj.content.encode('utf-8')\n        f = requests.post(weixin_menu % self.access_token, data=content)\n        data = json.loads(f.content)\n        if data['errcode'] == 0:\n            return True\n        elif data['errcode'] == 42001:\n            self.get_access_token()\n            return self.set_menu(content)\n        else:\n            obj.response_data = data\n\n    def get_access_token(self):\n        content = urllib2.urlopen(get_access_token).read()\n        data = json.loads(content)\n        self.access_token = data['access_token']\n\n\nxadmin.site.register(Menu, MenuAdmin)\n\n\nclass ResponseMessageAdmin(object):\n    list_display = ('id', 'event', 'content', 'created_time')\n    save_on_top = True\n\nxadmin.site.register(ResponseMessage, ResponseMessageAdmin)\n\n\nclass MessageAdmin(object):\n    list_display = ('id', 'to', 'from_user', 'msg_id', 'content', 'response_content', 'created_time')\n    save_on_top = True\n\n    def content(self, obj):\n        data = json.loads(obj.body)\n        return data['content']\n    content.short_description = '内容'\n    content.allow_tags = True\n\n\nxadmin.site.register(Message, MessageAdmin)\n\n\nclass EventAdmin(object):\n    list_display = ('id', 'to', 'from_user', 'event', 'body', 'created_time')\n    save_on_top = True\n\nxadmin.site.register(Event, EventAdmin)\n"
  },
  {
    "path": "selfblog/weixin/models.py",
    "content": "#coding:utf-8\nfrom __future__ import unicode_literals\n\nfrom django.db import models\n\n# ref:http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF\n\nEVENT_ITEMS = (\n    ('normal', '普通'),\n    ('subscribe', '订阅'),\n    ('unsubscribe', '退订'),\n    ('client', 'CLICK'),\n    ('view', 'VIEW'),\n    ('scan', 'SCAN'),\n)\n\n\nclass Menu(models.Model):\n    \"\"\" 菜单\n    \"\"\"\n    content = models.TextField()\n\n    response_data = models.TextField(blank=True)\n\n    success = models.BooleanField(default=False)\n    available = models.BooleanField(default=True)\n\n    created_time = models.DateTimeField('创建时间', auto_now_add=True)\n\n    def __unicode__(self):\n        return self.content[:10]\n\n    class Meta:\n        verbose_name_plural = verbose_name = '菜单'\n\n\nclass ResponseMessage(models.Model):\n    \"\"\" 根据事件要返回的消息设置\n        \n    如: 用户订阅后发送使用说明\n    \"\"\"\n    event = models.CharField(max_length=50, choices=EVENT_ITEMS, verbose_name=\"事件\")\n    content = models.TextField()\n\n    created_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n\n    def __unicode__(self):\n        return self.event\n\n    class Meta:\n        verbose_name_plural = verbose_name = '响应消息'\n\n\nclass Message(models.Model):\n    \"\"\" 用户发过来的普通消息\n    \"\"\"\n    to = models.CharField(max_length=100, verbose_name=\"接受者\")\n    from_user = models.CharField(max_length=100, verbose_name=\"发送者\")\n    msg_created_time = models.IntegerField(verbose_name=\"消息时间\")\n    msg_id = models.IntegerField(verbose_name=\"MsgId\")\n\n    body = models.TextField()\n    response_content = models.TextField()\n\n    created_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n\n    class Meta:\n        verbose_name_plural = verbose_name = '用户消息'\n\n\nclass Event(models.Model):\n    \"\"\" 事件消息 \"\"\"\n    to = models.CharField(max_length=100, verbose_name=\"接受者\")\n    from_user = models.CharField(max_length=100, verbose_name=\"发送者\")\n    msg_created_time = models.IntegerField(verbose_name=\"消息时间\")\n\n    event = models.CharField(max_length=50, choices=EVENT_ITEMS, verbose_name=\"事件\")\n    body = models.TextField()\n\n    created_time = models.DateTimeField(u'创建时间', auto_now_add=True)\n\n    def __unicode__(self):\n        return self.event\n\n    class Meta:\n        verbose_name_plural = verbose_name = '接受到的事件'\n"
  },
  {
    "path": "selfblog/weixin/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "selfblog/weixin/urls.py",
    "content": "#coding:utf-8\nfrom django.conf.urls import patterns, url\n\nfrom .views import interface\n\nurlpatterns = patterns(\n    '',\n    url(r'interface/$', interface, name='interface'),\n)\n"
  },
  {
    "path": "selfblog/weixin/views.py",
    "content": "#coding:utf-8\nfrom __future__ import unicode_literals\n\nimport logging\nimport time\nimport json\nimport hashlib\ntry:\n    import xml.etree.cElementTree as ET\nexcept ImportError:\n    import xml.etree.ElementTree as ET\n\nfrom django.http import HttpResponse\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom .models import Message, ResponseMessage, Event\n\nTOKEN = 'your token'\n\nlogger = logging.getLogger(__name__)\n\n\n@csrf_exempt\ndef interface(request):\n    if not request.GET and not request.body:\n        return HttpResponse()\n\n    status, result = check_sign(request)\n    if request.method == 'GET':\n        return HttpResponse(result)\n    else:\n        if status:\n            return dispatch_event(request)\n        else:\n            logger.warning('sign fail!', **request.GET)\n            return HttpResponse('')\n\n\ndef check_sign(request):\n    \"\"\" 认证接口\n\n    加密/校验流程如下：\n    1. 将token、timestamp、nonce三个参数进行字典序排序\n    2. 将三个参数字符串拼接成一个字符串进行sha1加密\n    3. 开发者获得加密后的字符串可与signature对比，标识该请求来源于微信\n    \"\"\"\n    signature = request.GET.get('signature')\n\n    timestamp = request.GET.get('timestamp')\n    nonce = request.GET.get('nonce')\n    echostr = request.GET.get('echostr')\n\n    source = ''.join(sorted([timestamp, nonce, TOKEN]))\n    sign = hashlib.sha1(source).hexdigest()\n\n    status = False\n    result = ''\n    if sign == signature:\n        status = True\n        result = echostr\n\n    return status, result\n\n\ndef dispatch_event(request):\n    \"\"\" 事件分发函数，根据post数据中的event\n    \"\"\"\n    xml = request.body\n    root = ET.fromstring(xml)\n    params = {elem.tag.lower(): elem.text for elem in root}\n\n    try:\n        handler_name = '%s_handler' % params['event'].lower()\n        handler = globals()[handler_name]\n    except KeyError:\n        handler = default_handler\n\n    result = handler(params)\n\n    if not result:\n        return HttpResponse('')\n\n    user_extend = {\n        'ToUserName': params['fromusername'],\n        'FromUserName': params['tousername'],\n        'CreateTime': int(time.time()),\n    }\n    result.update(user_extend)\n    # 组合为xml\n    content = build_xml(result)\n    return HttpResponse(content)\n\n\ndef default_handler(params):\n    \"\"\" 非Event接口，回应用户发来的消息 \"\"\"\n    event_type = 'normal'\n    return_content = None\n    try:\n        content = params['content']\n    except KeyError:\n        logger.error('[weixin] default_handler error', **params)\n    else:\n        # 获取操作类型：搜索 python招聘\n        if ' ' in content:\n            operate, content = content.split(' ', 1)\n        else:\n            operate = ''\n\n        if operate in ('搜索', 'search'):\n            return_content = '未搜索到相关内容'\n\n    if not return_content:\n        rm = ResponseMessage.objects.filter(event=event_type).latest('id')\n        return_content = rm.content\n\n    result = {\n        'MsgType': 'text',\n        'Content': return_content,\n    }\n\n    message = Message()\n    message.to = params['tousername']\n    message.from_user = params['fromusername']\n    message.msg_created_time = int(params['createtime'])\n    message.msg_id = int(params['msgid'])\n    message.body = json.dumps(params)\n\n    message.response_content = return_content\n    message.save()\n\n    return result\n\n\ndef subscribe_handler(params):\n    \"\"\" 处理订阅事件 \"\"\"\n    event_type = 'subscribe'\n    save_event(params, event_type)\n\n    rm = ResponseMessage.objects.filter(event=event_type).latest('id')\n    result = {\n        'MsgType': 'text',\n        'Content': rm.content\n    }\n    return result\n\n\ndef unsubscribe_handler(params):\n    event_type = 'unsubscribe'\n    save_event(params, event_type)\n\n\ndef scan_hanlder(params):\n    \"\"\" 用户已关注时的事件推送 \"\"\"\n    event_type = 'unsubscribe'\n    save_event(params, event_type)\n\n\ndef save_event(params, event_type):\n    event = Event()\n    event.event = event_type\n    event.to = params['tousername']\n    event.from_user = params['fromusername']\n    event.msg_created_time = int(params['createtime'])\n    event.body = json.dumps(params)\n    event.save()\n\n\ndef click_handler(params):\n    \"\"\" 点击菜单拉取消息时的事件推送 \"\"\"\n    event_type = 'click'\n    save_event(params, event_type)\n    # TODO: 需要进一步处理\n\n\ndef view_handler(params):\n    \"\"\" 点击菜单跳转链接时的事件推送 \"\"\"\n    event_type = 'view'\n    save_event(params, event_type)\n    # TODO: 需要进一步处理\n\n\ndef build_xml(data):\n    sequence = []\n    if isinstance(data, dict):\n        for key, value in data.items():\n            if isinstance(value, (str, unicode)):\n                sequence.append(\"<%(key)s><![CDATA[%(value)s]]></%(key)s>\" % locals())\n            elif isinstance(value, (list, dict)):\n                value = build_xml(value)\n                sequence.append(\"<%(key)s>%(value)s</%(key)s>\" % locals())\n            else:\n                sequence.append(\"<%(key)s>%(value)s</%(key)s>\" % locals())\n\n    elif isinstance(data, list):\n        for item in data:\n            if isinstance(item, (list, dict)):\n                sequence.append(\"<item>%s</item>\" % build_xml(item))\n            elif isinstance(value, (str, unicode)):\n                sequence.append(\"<item><![CDATA[%s]]></item>\" % item)\n            else:\n                sequence.append(\"<item>%s</item>\" % item)\n    body = \"\".join(sequence)\n    return '<xml>%s</xml>' % body\n"
  }
]