##// END OF EJS Templates
Merge branch 'master' of https://github.com/abakan/ipython
Ahmet Bakan -
r10598:235caf66 merge
parent child Browse files
Show More
@@ -0,0 +1,157 b''
1 /*
2
3 Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
4 Adapted from GitHub theme
5
6 */
7
8 pre code {
9 display: block;
10 padding: 0.5em;
11 }
12
13 .highlight-base,
14 pre code,
15 pre .subst,
16 pre .tag .title,
17 pre .lisp .title,
18 pre .clojure .built_in,
19 pre .nginx .title {
20 color: black;
21 }
22
23 .highlight-string,
24 pre .string,
25 pre .constant,
26 pre .parent,
27 pre .tag .value,
28 pre .rules .value,
29 pre .rules .value .number,
30 pre .preprocessor,
31 pre .ruby .symbol,
32 pre .ruby .symbol .string,
33 pre .aggregate,
34 pre .template_tag,
35 pre .django .variable,
36 pre .smalltalk .class,
37 pre .addition,
38 pre .flow,
39 pre .stream,
40 pre .bash .variable,
41 pre .apache .tag,
42 pre .apache .cbracket,
43 pre .tex .command,
44 pre .tex .special,
45 pre .erlang_repl .function_or_atom,
46 pre .markdown .header {
47 color: #BA2121;
48 }
49
50 .highlight-comment,
51 pre .comment,
52 pre .annotation,
53 pre .template_comment,
54 pre .diff .header,
55 pre .chunk,
56 pre .markdown .blockquote {
57 color: #408080;
58 font-style: italic;
59 }
60
61 .highlight-number,
62 pre .number,
63 pre .date,
64 pre .regexp,
65 pre .literal,
66 pre .smalltalk .symbol,
67 pre .smalltalk .char,
68 pre .go .constant,
69 pre .change,
70 pre .markdown .bullet,
71 pre .markdown .link_url {
72 color: #080;
73 }
74
75 pre .label,
76 pre .javadoc,
77 pre .ruby .string,
78 pre .decorator,
79 pre .filter .argument,
80 pre .localvars,
81 pre .array,
82 pre .attr_selector,
83 pre .important,
84 pre .pseudo,
85 pre .pi,
86 pre .doctype,
87 pre .deletion,
88 pre .envvar,
89 pre .shebang,
90 pre .apache .sqbracket,
91 pre .nginx .built_in,
92 pre .tex .formula,
93 pre .erlang_repl .reserved,
94 pre .prompt,
95 pre .markdown .link_label,
96 pre .vhdl .attribute,
97 pre .clojure .attribute,
98 pre .coffeescript .property {
99 color: #88F
100 }
101
102 .highlight-keyword,
103 pre .keyword,
104 pre .id,
105 pre .phpdoc,
106 pre .aggregate,
107 pre .css .tag,
108 pre .javadoctag,
109 pre .phpdoc,
110 pre .yardoctag,
111 pre .smalltalk .class,
112 pre .winutils,
113 pre .bash .variable,
114 pre .apache .tag,
115 pre .go .typename,
116 pre .tex .command,
117 pre .markdown .strong,
118 pre .request,
119 pre .status {
120 color: #008000;
121 font-weight: bold;
122 }
123
124 .highlight-builtin,
125 pre .built_in {
126 color: #008000;
127 }
128
129 pre .markdown .emphasis {
130 font-style: italic;
131 }
132
133 pre .nginx .built_in {
134 font-weight: normal;
135 }
136
137 pre .coffeescript .javascript,
138 pre .javascript .xml,
139 pre .tex .formula,
140 pre .xml .javascript,
141 pre .xml .vbscript,
142 pre .xml .css,
143 pre .xml .cdata {
144 opacity: 0.5;
145 }
146
147 /* apply the same style to codemirror */
148
149 .cm-s-ipython span.cm-variable { .highlight-base()}
150 .cm-s-ipython span.cm-keyword { .highlight-keyword() }
151 .cm-s-ipython span.cm-number { .highlight-number() }
152 .cm-s-ipython span.cm-comment { .highlight-comment() }
153 .cm-s-ipython span.cm-string { .highlight-string()}
154 .cm-s-ipython span.cm-builtin { .highlight-builtin() }
155 .cm-s-ipython span.cm-error { color: #f00; }
156 .cm-s-ipython span.cm-operator {color: #AA22FF; font-weight: bold;}
157 .cm-s-ipython span.cm-meta {color: #AA22FF;}
@@ -1,3 +1,3 b''
1 [submodule "components"]
1 [submodule "components"]
2 path = IPython/frontend/html/notebook/static/components
2 path = IPython/frontend/html/notebook/static/components
3 url = git://github.com/ipython/ipython-components.git
3 url = https://github.com/ipython/ipython-components.git
@@ -1,334 +1,343 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 An application for IPython.
3 An application for IPython.
4
4
5 All top-level applications should use the classes in this module for
5 All top-level applications should use the classes in this module for
6 handling configuration and creating componenets.
6 handling configuration and creating componenets.
7
7
8 The job of an :class:`Application` is to create the master configuration
8 The job of an :class:`Application` is to create the master configuration
9 object and then create the configurable objects, passing the config to them.
9 object and then create the configurable objects, passing the config to them.
10
10
11 Authors:
11 Authors:
12
12
13 * Brian Granger
13 * Brian Granger
14 * Fernando Perez
14 * Fernando Perez
15 * Min RK
15 * Min RK
16
16
17 """
17 """
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Copyright (C) 2008-2011 The IPython Development Team
20 # Copyright (C) 2008-2011 The IPython Development Team
21 #
21 #
22 # Distributed under the terms of the BSD License. The full license is in
22 # Distributed under the terms of the BSD License. The full license is in
23 # the file COPYING, distributed as part of this software.
23 # the file COPYING, distributed as part of this software.
24 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Imports
27 # Imports
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30 import atexit
30 import atexit
31 import glob
31 import glob
32 import logging
32 import logging
33 import os
33 import os
34 import shutil
34 import shutil
35 import sys
35 import sys
36
36
37 from IPython.config.application import Application, catch_config_error
37 from IPython.config.application import Application, catch_config_error
38 from IPython.config.loader import ConfigFileNotFound
38 from IPython.config.loader import ConfigFileNotFound
39 from IPython.core import release, crashhandler
39 from IPython.core import release, crashhandler
40 from IPython.core.profiledir import ProfileDir, ProfileDirError
40 from IPython.core.profiledir import ProfileDir, ProfileDirError
41 from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
41 from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
42 from IPython.utils.traitlets import List, Unicode, Type, Bool, Dict
42 from IPython.utils.traitlets import List, Unicode, Type, Bool, Dict
43
43
44 #-----------------------------------------------------------------------------
44 #-----------------------------------------------------------------------------
45 # Classes and functions
45 # Classes and functions
46 #-----------------------------------------------------------------------------
46 #-----------------------------------------------------------------------------
47
47
48
48
49 #-----------------------------------------------------------------------------
49 #-----------------------------------------------------------------------------
50 # Base Application Class
50 # Base Application Class
51 #-----------------------------------------------------------------------------
51 #-----------------------------------------------------------------------------
52
52
53 # aliases and flags
53 # aliases and flags
54
54
55 base_aliases = {
55 base_aliases = {
56 'profile' : 'BaseIPythonApplication.profile',
56 'profile' : 'BaseIPythonApplication.profile',
57 'ipython-dir' : 'BaseIPythonApplication.ipython_dir',
57 'ipython-dir' : 'BaseIPythonApplication.ipython_dir',
58 'log-level' : 'Application.log_level',
58 'log-level' : 'Application.log_level',
59 }
59 }
60
60
61 base_flags = dict(
61 base_flags = dict(
62 debug = ({'Application' : {'log_level' : logging.DEBUG}},
62 debug = ({'Application' : {'log_level' : logging.DEBUG}},
63 "set log level to logging.DEBUG (maximize logging output)"),
63 "set log level to logging.DEBUG (maximize logging output)"),
64 quiet = ({'Application' : {'log_level' : logging.CRITICAL}},
64 quiet = ({'Application' : {'log_level' : logging.CRITICAL}},
65 "set log level to logging.CRITICAL (minimize logging output)"),
65 "set log level to logging.CRITICAL (minimize logging output)"),
66 init = ({'BaseIPythonApplication' : {
66 init = ({'BaseIPythonApplication' : {
67 'copy_config_files' : True,
67 'copy_config_files' : True,
68 'auto_create' : True}
68 'auto_create' : True}
69 }, """Initialize profile with default config files. This is equivalent
69 }, """Initialize profile with default config files. This is equivalent
70 to running `ipython profile create <profile>` prior to startup.
70 to running `ipython profile create <profile>` prior to startup.
71 """)
71 """)
72 )
72 )
73
73
74
74
75 class BaseIPythonApplication(Application):
75 class BaseIPythonApplication(Application):
76
76
77 name = Unicode(u'ipython')
77 name = Unicode(u'ipython')
78 description = Unicode(u'IPython: an enhanced interactive Python shell.')
78 description = Unicode(u'IPython: an enhanced interactive Python shell.')
79 version = Unicode(release.version)
79 version = Unicode(release.version)
80
80
81 aliases = Dict(base_aliases)
81 aliases = Dict(base_aliases)
82 flags = Dict(base_flags)
82 flags = Dict(base_flags)
83 classes = List([ProfileDir])
83 classes = List([ProfileDir])
84
84
85 # Track whether the config_file has changed,
85 # Track whether the config_file has changed,
86 # because some logic happens only if we aren't using the default.
86 # because some logic happens only if we aren't using the default.
87 config_file_specified = Bool(False)
87 config_file_specified = Bool(False)
88
88
89 config_file_name = Unicode(u'ipython_config.py')
89 config_file_name = Unicode(u'ipython_config.py')
90 def _config_file_name_default(self):
90 def _config_file_name_default(self):
91 return self.name.replace('-','_') + u'_config.py'
91 return self.name.replace('-','_') + u'_config.py'
92 def _config_file_name_changed(self, name, old, new):
92 def _config_file_name_changed(self, name, old, new):
93 if new != old:
93 if new != old:
94 self.config_file_specified = True
94 self.config_file_specified = True
95
95
96 # The directory that contains IPython's builtin profiles.
96 # The directory that contains IPython's builtin profiles.
97 builtin_profile_dir = Unicode(
97 builtin_profile_dir = Unicode(
98 os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default')
98 os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default')
99 )
99 )
100
100
101 config_file_paths = List(Unicode)
101 config_file_paths = List(Unicode)
102 def _config_file_paths_default(self):
102 def _config_file_paths_default(self):
103 return [os.getcwdu()]
103 return [os.getcwdu()]
104
104
105 profile = Unicode(u'default', config=True,
105 profile = Unicode(u'default', config=True,
106 help="""The IPython profile to use."""
106 help="""The IPython profile to use."""
107 )
107 )
108
108
109 def _profile_changed(self, name, old, new):
109 def _profile_changed(self, name, old, new):
110 self.builtin_profile_dir = os.path.join(
110 self.builtin_profile_dir = os.path.join(
111 get_ipython_package_dir(), u'config', u'profile', new
111 get_ipython_package_dir(), u'config', u'profile', new
112 )
112 )
113
113
114 ipython_dir = Unicode(get_ipython_dir(), config=True,
114 ipython_dir = Unicode(get_ipython_dir(), config=True,
115 help="""
115 help="""
116 The name of the IPython directory. This directory is used for logging
116 The name of the IPython directory. This directory is used for logging
117 configuration (through profiles), history storage, etc. The default
117 configuration (through profiles), history storage, etc. The default
118 is usually $HOME/.ipython. This options can also be specified through
118 is usually $HOME/.ipython. This options can also be specified through
119 the environment variable IPYTHONDIR.
119 the environment variable IPYTHONDIR.
120 """
120 """
121 )
121 )
122
122
123 overwrite = Bool(False, config=True,
123 overwrite = Bool(False, config=True,
124 help="""Whether to overwrite existing config files when copying""")
124 help="""Whether to overwrite existing config files when copying""")
125 auto_create = Bool(False, config=True,
125 auto_create = Bool(False, config=True,
126 help="""Whether to create profile dir if it doesn't exist""")
126 help="""Whether to create profile dir if it doesn't exist""")
127
127
128 config_files = List(Unicode)
128 config_files = List(Unicode)
129 def _config_files_default(self):
129 def _config_files_default(self):
130 return [u'ipython_config.py']
130 return [u'ipython_config.py']
131
131
132 copy_config_files = Bool(False, config=True,
132 copy_config_files = Bool(False, config=True,
133 help="""Whether to install the default config files into the profile dir.
133 help="""Whether to install the default config files into the profile dir.
134 If a new profile is being created, and IPython contains config files for that
134 If a new profile is being created, and IPython contains config files for that
135 profile, then they will be staged into the new directory. Otherwise,
135 profile, then they will be staged into the new directory. Otherwise,
136 default config files will be automatically generated.
136 default config files will be automatically generated.
137 """)
137 """)
138
138
139 verbose_crash = Bool(False, config=True,
139 verbose_crash = Bool(False, config=True,
140 help="""Create a massive crash report when IPython encounters what may be an
140 help="""Create a massive crash report when IPython encounters what may be an
141 internal error. The default is to append a short message to the
141 internal error. The default is to append a short message to the
142 usual traceback""")
142 usual traceback""")
143
143
144 # The class to use as the crash handler.
144 # The class to use as the crash handler.
145 crash_handler_class = Type(crashhandler.CrashHandler)
145 crash_handler_class = Type(crashhandler.CrashHandler)
146
146
147 @catch_config_error
147 def __init__(self, **kwargs):
148 def __init__(self, **kwargs):
148 super(BaseIPythonApplication, self).__init__(**kwargs)
149 super(BaseIPythonApplication, self).__init__(**kwargs)
150 # ensure current working directory exists
151 try:
152 directory = os.getcwdu()
153 except:
154 # raise exception
155 self.log.error("Current working directory doesn't exist.")
156 raise
157
149 # ensure even default IPYTHONDIR exists
158 # ensure even default IPYTHONDIR exists
150 if not os.path.exists(self.ipython_dir):
159 if not os.path.exists(self.ipython_dir):
151 self._ipython_dir_changed('ipython_dir', self.ipython_dir, self.ipython_dir)
160 self._ipython_dir_changed('ipython_dir', self.ipython_dir, self.ipython_dir)
152
161
153 #-------------------------------------------------------------------------
162 #-------------------------------------------------------------------------
154 # Various stages of Application creation
163 # Various stages of Application creation
155 #-------------------------------------------------------------------------
164 #-------------------------------------------------------------------------
156
165
157 def init_crash_handler(self):
166 def init_crash_handler(self):
158 """Create a crash handler, typically setting sys.excepthook to it."""
167 """Create a crash handler, typically setting sys.excepthook to it."""
159 self.crash_handler = self.crash_handler_class(self)
168 self.crash_handler = self.crash_handler_class(self)
160 sys.excepthook = self.excepthook
169 sys.excepthook = self.excepthook
161 def unset_crashhandler():
170 def unset_crashhandler():
162 sys.excepthook = sys.__excepthook__
171 sys.excepthook = sys.__excepthook__
163 atexit.register(unset_crashhandler)
172 atexit.register(unset_crashhandler)
164
173
165 def excepthook(self, etype, evalue, tb):
174 def excepthook(self, etype, evalue, tb):
166 """this is sys.excepthook after init_crashhandler
175 """this is sys.excepthook after init_crashhandler
167
176
168 set self.verbose_crash=True to use our full crashhandler, instead of
177 set self.verbose_crash=True to use our full crashhandler, instead of
169 a regular traceback with a short message (crash_handler_lite)
178 a regular traceback with a short message (crash_handler_lite)
170 """
179 """
171
180
172 if self.verbose_crash:
181 if self.verbose_crash:
173 return self.crash_handler(etype, evalue, tb)
182 return self.crash_handler(etype, evalue, tb)
174 else:
183 else:
175 return crashhandler.crash_handler_lite(etype, evalue, tb)
184 return crashhandler.crash_handler_lite(etype, evalue, tb)
176
185
177 def _ipython_dir_changed(self, name, old, new):
186 def _ipython_dir_changed(self, name, old, new):
178 if old in sys.path:
187 if old in sys.path:
179 sys.path.remove(old)
188 sys.path.remove(old)
180 sys.path.append(os.path.abspath(new))
189 sys.path.append(os.path.abspath(new))
181 if not os.path.isdir(new):
190 if not os.path.isdir(new):
182 os.makedirs(new, mode=0o777)
191 os.makedirs(new, mode=0o777)
183 readme = os.path.join(new, 'README')
192 readme = os.path.join(new, 'README')
184 if not os.path.exists(readme):
193 if not os.path.exists(readme):
185 path = os.path.join(get_ipython_package_dir(), u'config', u'profile')
194 path = os.path.join(get_ipython_package_dir(), u'config', u'profile')
186 shutil.copy(os.path.join(path, 'README'), readme)
195 shutil.copy(os.path.join(path, 'README'), readme)
187 self.log.debug("IPYTHONDIR set to: %s" % new)
196 self.log.debug("IPYTHONDIR set to: %s" % new)
188
197
189 def load_config_file(self, suppress_errors=True):
198 def load_config_file(self, suppress_errors=True):
190 """Load the config file.
199 """Load the config file.
191
200
192 By default, errors in loading config are handled, and a warning
201 By default, errors in loading config are handled, and a warning
193 printed on screen. For testing, the suppress_errors option is set
202 printed on screen. For testing, the suppress_errors option is set
194 to False, so errors will make tests fail.
203 to False, so errors will make tests fail.
195 """
204 """
196 self.log.debug("Searching path %s for config files", self.config_file_paths)
205 self.log.debug("Searching path %s for config files", self.config_file_paths)
197 base_config = 'ipython_config.py'
206 base_config = 'ipython_config.py'
198 self.log.debug("Attempting to load config file: %s" %
207 self.log.debug("Attempting to load config file: %s" %
199 base_config)
208 base_config)
200 try:
209 try:
201 Application.load_config_file(
210 Application.load_config_file(
202 self,
211 self,
203 base_config,
212 base_config,
204 path=self.config_file_paths
213 path=self.config_file_paths
205 )
214 )
206 except ConfigFileNotFound:
215 except ConfigFileNotFound:
207 # ignore errors loading parent
216 # ignore errors loading parent
208 self.log.debug("Config file %s not found", base_config)
217 self.log.debug("Config file %s not found", base_config)
209 pass
218 pass
210 if self.config_file_name == base_config:
219 if self.config_file_name == base_config:
211 # don't load secondary config
220 # don't load secondary config
212 return
221 return
213 self.log.debug("Attempting to load config file: %s" %
222 self.log.debug("Attempting to load config file: %s" %
214 self.config_file_name)
223 self.config_file_name)
215 try:
224 try:
216 Application.load_config_file(
225 Application.load_config_file(
217 self,
226 self,
218 self.config_file_name,
227 self.config_file_name,
219 path=self.config_file_paths
228 path=self.config_file_paths
220 )
229 )
221 except ConfigFileNotFound:
230 except ConfigFileNotFound:
222 # Only warn if the default config file was NOT being used.
231 # Only warn if the default config file was NOT being used.
223 if self.config_file_specified:
232 if self.config_file_specified:
224 msg = self.log.warn
233 msg = self.log.warn
225 else:
234 else:
226 msg = self.log.debug
235 msg = self.log.debug
227 msg("Config file not found, skipping: %s", self.config_file_name)
236 msg("Config file not found, skipping: %s", self.config_file_name)
228 except:
237 except:
229 # For testing purposes.
238 # For testing purposes.
230 if not suppress_errors:
239 if not suppress_errors:
231 raise
240 raise
232 self.log.warn("Error loading config file: %s" %
241 self.log.warn("Error loading config file: %s" %
233 self.config_file_name, exc_info=True)
242 self.config_file_name, exc_info=True)
234
243
235 def init_profile_dir(self):
244 def init_profile_dir(self):
236 """initialize the profile dir"""
245 """initialize the profile dir"""
237 try:
246 try:
238 # location explicitly specified:
247 # location explicitly specified:
239 location = self.config.ProfileDir.location
248 location = self.config.ProfileDir.location
240 except AttributeError:
249 except AttributeError:
241 # location not specified, find by profile name
250 # location not specified, find by profile name
242 try:
251 try:
243 p = ProfileDir.find_profile_dir_by_name(self.ipython_dir, self.profile, self.config)
252 p = ProfileDir.find_profile_dir_by_name(self.ipython_dir, self.profile, self.config)
244 except ProfileDirError:
253 except ProfileDirError:
245 # not found, maybe create it (always create default profile)
254 # not found, maybe create it (always create default profile)
246 if self.auto_create or self.profile == 'default':
255 if self.auto_create or self.profile == 'default':
247 try:
256 try:
248 p = ProfileDir.create_profile_dir_by_name(self.ipython_dir, self.profile, self.config)
257 p = ProfileDir.create_profile_dir_by_name(self.ipython_dir, self.profile, self.config)
249 except ProfileDirError:
258 except ProfileDirError:
250 self.log.fatal("Could not create profile: %r"%self.profile)
259 self.log.fatal("Could not create profile: %r"%self.profile)
251 self.exit(1)
260 self.exit(1)
252 else:
261 else:
253 self.log.info("Created profile dir: %r"%p.location)
262 self.log.info("Created profile dir: %r"%p.location)
254 else:
263 else:
255 self.log.fatal("Profile %r not found."%self.profile)
264 self.log.fatal("Profile %r not found."%self.profile)
256 self.exit(1)
265 self.exit(1)
257 else:
266 else:
258 self.log.info("Using existing profile dir: %r"%p.location)
267 self.log.info("Using existing profile dir: %r"%p.location)
259 else:
268 else:
260 # location is fully specified
269 # location is fully specified
261 try:
270 try:
262 p = ProfileDir.find_profile_dir(location, self.config)
271 p = ProfileDir.find_profile_dir(location, self.config)
263 except ProfileDirError:
272 except ProfileDirError:
264 # not found, maybe create it
273 # not found, maybe create it
265 if self.auto_create:
274 if self.auto_create:
266 try:
275 try:
267 p = ProfileDir.create_profile_dir(location, self.config)
276 p = ProfileDir.create_profile_dir(location, self.config)
268 except ProfileDirError:
277 except ProfileDirError:
269 self.log.fatal("Could not create profile directory: %r"%location)
278 self.log.fatal("Could not create profile directory: %r"%location)
270 self.exit(1)
279 self.exit(1)
271 else:
280 else:
272 self.log.info("Creating new profile dir: %r"%location)
281 self.log.info("Creating new profile dir: %r"%location)
273 else:
282 else:
274 self.log.fatal("Profile directory %r not found."%location)
283 self.log.fatal("Profile directory %r not found."%location)
275 self.exit(1)
284 self.exit(1)
276 else:
285 else:
277 self.log.info("Using existing profile dir: %r"%location)
286 self.log.info("Using existing profile dir: %r"%location)
278
287
279 self.profile_dir = p
288 self.profile_dir = p
280 self.config_file_paths.append(p.location)
289 self.config_file_paths.append(p.location)
281
290
282 def init_config_files(self):
291 def init_config_files(self):
283 """[optionally] copy default config files into profile dir."""
292 """[optionally] copy default config files into profile dir."""
284 # copy config files
293 # copy config files
285 path = self.builtin_profile_dir
294 path = self.builtin_profile_dir
286 if self.copy_config_files:
295 if self.copy_config_files:
287 src = self.profile
296 src = self.profile
288
297
289 cfg = self.config_file_name
298 cfg = self.config_file_name
290 if path and os.path.exists(os.path.join(path, cfg)):
299 if path and os.path.exists(os.path.join(path, cfg)):
291 self.log.warn("Staging %r from %s into %r [overwrite=%s]"%(
300 self.log.warn("Staging %r from %s into %r [overwrite=%s]"%(
292 cfg, src, self.profile_dir.location, self.overwrite)
301 cfg, src, self.profile_dir.location, self.overwrite)
293 )
302 )
294 self.profile_dir.copy_config_file(cfg, path=path, overwrite=self.overwrite)
303 self.profile_dir.copy_config_file(cfg, path=path, overwrite=self.overwrite)
295 else:
304 else:
296 self.stage_default_config_file()
305 self.stage_default_config_file()
297 else:
306 else:
298 # Still stage *bundled* config files, but not generated ones
307 # Still stage *bundled* config files, but not generated ones
299 # This is necessary for `ipython profile=sympy` to load the profile
308 # This is necessary for `ipython profile=sympy` to load the profile
300 # on the first go
309 # on the first go
301 files = glob.glob(os.path.join(path, '*.py'))
310 files = glob.glob(os.path.join(path, '*.py'))
302 for fullpath in files:
311 for fullpath in files:
303 cfg = os.path.basename(fullpath)
312 cfg = os.path.basename(fullpath)
304 if self.profile_dir.copy_config_file(cfg, path=path, overwrite=False):
313 if self.profile_dir.copy_config_file(cfg, path=path, overwrite=False):
305 # file was copied
314 # file was copied
306 self.log.warn("Staging bundled %s from %s into %r"%(
315 self.log.warn("Staging bundled %s from %s into %r"%(
307 cfg, self.profile, self.profile_dir.location)
316 cfg, self.profile, self.profile_dir.location)
308 )
317 )
309
318
310
319
311 def stage_default_config_file(self):
320 def stage_default_config_file(self):
312 """auto generate default config file, and stage it into the profile."""
321 """auto generate default config file, and stage it into the profile."""
313 s = self.generate_config_file()
322 s = self.generate_config_file()
314 fname = os.path.join(self.profile_dir.location, self.config_file_name)
323 fname = os.path.join(self.profile_dir.location, self.config_file_name)
315 if self.overwrite or not os.path.exists(fname):
324 if self.overwrite or not os.path.exists(fname):
316 self.log.warn("Generating default config file: %r"%(fname))
325 self.log.warn("Generating default config file: %r"%(fname))
317 with open(fname, 'w') as f:
326 with open(fname, 'w') as f:
318 f.write(s)
327 f.write(s)
319
328
320 @catch_config_error
329 @catch_config_error
321 def initialize(self, argv=None):
330 def initialize(self, argv=None):
322 # don't hook up crash handler before parsing command-line
331 # don't hook up crash handler before parsing command-line
323 self.parse_command_line(argv)
332 self.parse_command_line(argv)
324 self.init_crash_handler()
333 self.init_crash_handler()
325 if self.subapp is not None:
334 if self.subapp is not None:
326 # stop here if subapp is taking over
335 # stop here if subapp is taking over
327 return
336 return
328 cl_config = self.config
337 cl_config = self.config
329 self.init_profile_dir()
338 self.init_profile_dir()
330 self.init_config_files()
339 self.init_config_files()
331 self.load_config_file()
340 self.load_config_file()
332 # enforce cl-opts override configfile opts:
341 # enforce cl-opts override configfile opts:
333 self.update_config(cl_config)
342 self.update_config(cl_config)
334
343
@@ -1,1118 +1,1177 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Implementation of execution-related magic functions.
2 """Implementation of execution-related magic functions.
3 """
3 """
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (c) 2012 The IPython Development Team.
5 # Copyright (c) 2012 The IPython Development Team.
6 #
6 #
7 # Distributed under the terms of the Modified BSD License.
7 # Distributed under the terms of the Modified BSD License.
8 #
8 #
9 # The full license is in the file COPYING.txt, distributed with this software.
9 # The full license is in the file COPYING.txt, distributed with this software.
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11
11
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Imports
13 # Imports
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 # Stdlib
16 # Stdlib
17 import __builtin__ as builtin_mod
17 import __builtin__ as builtin_mod
18 import ast
18 import ast
19 import bdb
19 import bdb
20 import os
20 import os
21 import sys
21 import sys
22 import time
22 import time
23 from StringIO import StringIO
23 from StringIO import StringIO
24
24
25 # cProfile was added in Python2.5
25 # cProfile was added in Python2.5
26 try:
26 try:
27 import cProfile as profile
27 import cProfile as profile
28 import pstats
28 import pstats
29 except ImportError:
29 except ImportError:
30 # profile isn't bundled by default in Debian for license reasons
30 # profile isn't bundled by default in Debian for license reasons
31 try:
31 try:
32 import profile, pstats
32 import profile, pstats
33 except ImportError:
33 except ImportError:
34 profile = pstats = None
34 profile = pstats = None
35
35
36 # Our own packages
36 # Our own packages
37 from IPython.core import debugger, oinspect
37 from IPython.core import debugger, oinspect
38 from IPython.core import magic_arguments
38 from IPython.core import magic_arguments
39 from IPython.core import page
39 from IPython.core import page
40 from IPython.core.error import UsageError
40 from IPython.core.error import UsageError
41 from IPython.core.macro import Macro
41 from IPython.core.macro import Macro
42 from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
42 from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic,
43 line_cell_magic, on_off, needs_local_scope)
43 line_cell_magic, on_off, needs_local_scope)
44 from IPython.testing.skipdoctest import skip_doctest
44 from IPython.testing.skipdoctest import skip_doctest
45 from IPython.utils import py3compat
45 from IPython.utils import py3compat
46 from IPython.utils.contexts import preserve_keys
46 from IPython.utils.contexts import preserve_keys
47 from IPython.utils.io import capture_output
47 from IPython.utils.io import capture_output
48 from IPython.utils.ipstruct import Struct
48 from IPython.utils.ipstruct import Struct
49 from IPython.utils.module_paths import find_mod
49 from IPython.utils.module_paths import find_mod
50 from IPython.utils.path import get_py_filename, unquote_filename, shellglob
50 from IPython.utils.path import get_py_filename, unquote_filename, shellglob
51 from IPython.utils.timing import clock, clock2
51 from IPython.utils.timing import clock, clock2
52 from IPython.utils.warn import warn, error
52 from IPython.utils.warn import warn, error
53
53
54
54
55 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
56 # Magic implementation classes
56 # Magic implementation classes
57 #-----------------------------------------------------------------------------
57 #-----------------------------------------------------------------------------
58
58
59 @magics_class
59 @magics_class
60 class ExecutionMagics(Magics):
60 class ExecutionMagics(Magics):
61 """Magics related to code execution, debugging, profiling, etc.
61 """Magics related to code execution, debugging, profiling, etc.
62
62
63 """
63 """
64
64
65 def __init__(self, shell):
65 def __init__(self, shell):
66 super(ExecutionMagics, self).__init__(shell)
66 super(ExecutionMagics, self).__init__(shell)
67 if profile is None:
67 if profile is None:
68 self.prun = self.profile_missing_notice
68 self.prun = self.profile_missing_notice
69 # Default execution function used to actually run user code.
69 # Default execution function used to actually run user code.
70 self.default_runner = None
70 self.default_runner = None
71
71
72 def profile_missing_notice(self, *args, **kwargs):
72 def profile_missing_notice(self, *args, **kwargs):
73 error("""\
73 error("""\
74 The profile module could not be found. It has been removed from the standard
74 The profile module could not be found. It has been removed from the standard
75 python packages because of its non-free license. To use profiling, install the
75 python packages because of its non-free license. To use profiling, install the
76 python-profiler package from non-free.""")
76 python-profiler package from non-free.""")
77
77
78 @skip_doctest
78 @skip_doctest
79 @line_cell_magic
79 @line_cell_magic
80 def prun(self, parameter_s='', cell=None, user_mode=True,
80 def prun(self, parameter_s='', cell=None):
81 opts=None,arg_lst=None,prog_ns=None):
82
81
83 """Run a statement through the python code profiler.
82 """Run a statement through the python code profiler.
84
83
85 Usage, in line mode:
84 Usage, in line mode:
86 %prun [options] statement
85 %prun [options] statement
87
86
88 Usage, in cell mode:
87 Usage, in cell mode:
89 %%prun [options] [statement]
88 %%prun [options] [statement]
90 code...
89 code...
91 code...
90 code...
92
91
93 In cell mode, the additional code lines are appended to the (possibly
92 In cell mode, the additional code lines are appended to the (possibly
94 empty) statement in the first line. Cell mode allows you to easily
93 empty) statement in the first line. Cell mode allows you to easily
95 profile multiline blocks without having to put them in a separate
94 profile multiline blocks without having to put them in a separate
96 function.
95 function.
97
96
98 The given statement (which doesn't require quote marks) is run via the
97 The given statement (which doesn't require quote marks) is run via the
99 python profiler in a manner similar to the profile.run() function.
98 python profiler in a manner similar to the profile.run() function.
100 Namespaces are internally managed to work correctly; profile.run
99 Namespaces are internally managed to work correctly; profile.run
101 cannot be used in IPython because it makes certain assumptions about
100 cannot be used in IPython because it makes certain assumptions about
102 namespaces which do not hold under IPython.
101 namespaces which do not hold under IPython.
103
102
104 Options:
103 Options:
105
104
106 -l <limit>: you can place restrictions on what or how much of the
105 -l <limit>: you can place restrictions on what or how much of the
107 profile gets printed. The limit value can be:
106 profile gets printed. The limit value can be:
108
107
109 * A string: only information for function names containing this string
108 * A string: only information for function names containing this string
110 is printed.
109 is printed.
111
110
112 * An integer: only these many lines are printed.
111 * An integer: only these many lines are printed.
113
112
114 * A float (between 0 and 1): this fraction of the report is printed
113 * A float (between 0 and 1): this fraction of the report is printed
115 (for example, use a limit of 0.4 to see the topmost 40% only).
114 (for example, use a limit of 0.4 to see the topmost 40% only).
116
115
117 You can combine several limits with repeated use of the option. For
116 You can combine several limits with repeated use of the option. For
118 example, '-l __init__ -l 5' will print only the topmost 5 lines of
117 example, '-l __init__ -l 5' will print only the topmost 5 lines of
119 information about class constructors.
118 information about class constructors.
120
119
121 -r: return the pstats.Stats object generated by the profiling. This
120 -r: return the pstats.Stats object generated by the profiling. This
122 object has all the information about the profile in it, and you can
121 object has all the information about the profile in it, and you can
123 later use it for further analysis or in other functions.
122 later use it for further analysis or in other functions.
124
123
125 -s <key>: sort profile by given key. You can provide more than one key
124 -s <key>: sort profile by given key. You can provide more than one key
126 by using the option several times: '-s key1 -s key2 -s key3...'. The
125 by using the option several times: '-s key1 -s key2 -s key3...'. The
127 default sorting key is 'time'.
126 default sorting key is 'time'.
128
127
129 The following is copied verbatim from the profile documentation
128 The following is copied verbatim from the profile documentation
130 referenced below:
129 referenced below:
131
130
132 When more than one key is provided, additional keys are used as
131 When more than one key is provided, additional keys are used as
133 secondary criteria when the there is equality in all keys selected
132 secondary criteria when the there is equality in all keys selected
134 before them.
133 before them.
135
134
136 Abbreviations can be used for any key names, as long as the
135 Abbreviations can be used for any key names, as long as the
137 abbreviation is unambiguous. The following are the keys currently
136 abbreviation is unambiguous. The following are the keys currently
138 defined:
137 defined:
139
138
140 Valid Arg Meaning
139 Valid Arg Meaning
141 "calls" call count
140 "calls" call count
142 "cumulative" cumulative time
141 "cumulative" cumulative time
143 "file" file name
142 "file" file name
144 "module" file name
143 "module" file name
145 "pcalls" primitive call count
144 "pcalls" primitive call count
146 "line" line number
145 "line" line number
147 "name" function name
146 "name" function name
148 "nfl" name/file/line
147 "nfl" name/file/line
149 "stdname" standard name
148 "stdname" standard name
150 "time" internal time
149 "time" internal time
151
150
152 Note that all sorts on statistics are in descending order (placing
151 Note that all sorts on statistics are in descending order (placing
153 most time consuming items first), where as name, file, and line number
152 most time consuming items first), where as name, file, and line number
154 searches are in ascending order (i.e., alphabetical). The subtle
153 searches are in ascending order (i.e., alphabetical). The subtle
155 distinction between "nfl" and "stdname" is that the standard name is a
154 distinction between "nfl" and "stdname" is that the standard name is a
156 sort of the name as printed, which means that the embedded line
155 sort of the name as printed, which means that the embedded line
157 numbers get compared in an odd way. For example, lines 3, 20, and 40
156 numbers get compared in an odd way. For example, lines 3, 20, and 40
158 would (if the file names were the same) appear in the string order
157 would (if the file names were the same) appear in the string order
159 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
158 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
160 line numbers. In fact, sort_stats("nfl") is the same as
159 line numbers. In fact, sort_stats("nfl") is the same as
161 sort_stats("name", "file", "line").
160 sort_stats("name", "file", "line").
162
161
163 -T <filename>: save profile results as shown on screen to a text
162 -T <filename>: save profile results as shown on screen to a text
164 file. The profile is still shown on screen.
163 file. The profile is still shown on screen.
165
164
166 -D <filename>: save (via dump_stats) profile statistics to given
165 -D <filename>: save (via dump_stats) profile statistics to given
167 filename. This data is in a format understood by the pstats module, and
166 filename. This data is in a format understood by the pstats module, and
168 is generated by a call to the dump_stats() method of profile
167 is generated by a call to the dump_stats() method of profile
169 objects. The profile is still shown on screen.
168 objects. The profile is still shown on screen.
170
169
171 -q: suppress output to the pager. Best used with -T and/or -D above.
170 -q: suppress output to the pager. Best used with -T and/or -D above.
172
171
173 If you want to run complete programs under the profiler's control, use
172 If you want to run complete programs under the profiler's control, use
174 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
173 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
175 contains profiler specific options as described here.
174 contains profiler specific options as described here.
176
175
177 You can read the complete documentation for the profile module with::
176 You can read the complete documentation for the profile module with::
178
177
179 In [1]: import profile; profile.help()
178 In [1]: import profile; profile.help()
180 """
179 """
181
182 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
183
184 if user_mode: # regular user call
185 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:q',
180 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
186 list_all=True, posix=False)
181 list_all=True, posix=False)
187 namespace = self.shell.user_ns
188 if cell is not None:
182 if cell is not None:
189 arg_str += '\n' + cell
183 arg_str += '\n' + cell
190 else: # called to run a program by %run -p
184 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
191 try:
192 filename = get_py_filename(arg_lst[0])
193 except IOError as e:
194 try:
195 msg = str(e)
196 except UnicodeError:
197 msg = e.message
198 error(msg)
199 return
200
185
201 arg_str = 'execfile(filename,prog_ns)'
186 def _run_with_profiler(self, code, opts, namespace):
202 namespace = {
187 """
203 'execfile': self.shell.safe_execfile,
188 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
204 'prog_ns': prog_ns,
189
205 'filename': filename
190 Parameters
206 }
191 ----------
192 code : str
193 Code to be executed.
194 opts : Struct
195 Options parsed by `self.parse_options`.
196 namespace : dict
197 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
207
198
208 opts.merge(opts_def)
199 """
200
201 # Fill default values for unspecified options:
202 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
209
203
210 prof = profile.Profile()
204 prof = profile.Profile()
211 try:
205 try:
212 prof = prof.runctx(arg_str,namespace,namespace)
206 prof = prof.runctx(code, namespace, namespace)
213 sys_exit = ''
207 sys_exit = ''
214 except SystemExit:
208 except SystemExit:
215 sys_exit = """*** SystemExit exception caught in code being profiled."""
209 sys_exit = """*** SystemExit exception caught in code being profiled."""
216
210
217 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
211 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
218
212
219 lims = opts.l
213 lims = opts.l
220 if lims:
214 if lims:
221 lims = [] # rebuild lims with ints/floats/strings
215 lims = [] # rebuild lims with ints/floats/strings
222 for lim in opts.l:
216 for lim in opts.l:
223 try:
217 try:
224 lims.append(int(lim))
218 lims.append(int(lim))
225 except ValueError:
219 except ValueError:
226 try:
220 try:
227 lims.append(float(lim))
221 lims.append(float(lim))
228 except ValueError:
222 except ValueError:
229 lims.append(lim)
223 lims.append(lim)
230
224
231 # Trap output.
225 # Trap output.
232 stdout_trap = StringIO()
226 stdout_trap = StringIO()
233 stats_stream = stats.stream
227 stats_stream = stats.stream
234 try:
228 try:
235 stats.stream = stdout_trap
229 stats.stream = stdout_trap
236 stats.print_stats(*lims)
230 stats.print_stats(*lims)
237 finally:
231 finally:
238 stats.stream = stats_stream
232 stats.stream = stats_stream
239
233
240 output = stdout_trap.getvalue()
234 output = stdout_trap.getvalue()
241 output = output.rstrip()
235 output = output.rstrip()
242
236
243 if 'q' not in opts:
237 if 'q' not in opts:
244 page.page(output)
238 page.page(output)
245 print sys_exit,
239 print sys_exit,
246
240
247 dump_file = opts.D[0]
241 dump_file = opts.D[0]
248 text_file = opts.T[0]
242 text_file = opts.T[0]
249 if dump_file:
243 if dump_file:
250 dump_file = unquote_filename(dump_file)
244 dump_file = unquote_filename(dump_file)
251 prof.dump_stats(dump_file)
245 prof.dump_stats(dump_file)
252 print '\n*** Profile stats marshalled to file',\
246 print '\n*** Profile stats marshalled to file',\
253 repr(dump_file)+'.',sys_exit
247 repr(dump_file)+'.',sys_exit
254 if text_file:
248 if text_file:
255 text_file = unquote_filename(text_file)
249 text_file = unquote_filename(text_file)
256 pfile = open(text_file,'w')
250 pfile = open(text_file,'w')
257 pfile.write(output)
251 pfile.write(output)
258 pfile.close()
252 pfile.close()
259 print '\n*** Profile printout saved to text file',\
253 print '\n*** Profile printout saved to text file',\
260 repr(text_file)+'.',sys_exit
254 repr(text_file)+'.',sys_exit
261
255
262 if 'r' in opts:
256 if 'r' in opts:
263 return stats
257 return stats
264 else:
258 else:
265 return None
259 return None
266
260
267 @line_magic
261 @line_magic
268 def pdb(self, parameter_s=''):
262 def pdb(self, parameter_s=''):
269 """Control the automatic calling of the pdb interactive debugger.
263 """Control the automatic calling of the pdb interactive debugger.
270
264
271 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
265 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
272 argument it works as a toggle.
266 argument it works as a toggle.
273
267
274 When an exception is triggered, IPython can optionally call the
268 When an exception is triggered, IPython can optionally call the
275 interactive pdb debugger after the traceback printout. %pdb toggles
269 interactive pdb debugger after the traceback printout. %pdb toggles
276 this feature on and off.
270 this feature on and off.
277
271
278 The initial state of this feature is set in your configuration
272 The initial state of this feature is set in your configuration
279 file (the option is ``InteractiveShell.pdb``).
273 file (the option is ``InteractiveShell.pdb``).
280
274
281 If you want to just activate the debugger AFTER an exception has fired,
275 If you want to just activate the debugger AFTER an exception has fired,
282 without having to type '%pdb on' and rerunning your code, you can use
276 without having to type '%pdb on' and rerunning your code, you can use
283 the %debug magic."""
277 the %debug magic."""
284
278
285 par = parameter_s.strip().lower()
279 par = parameter_s.strip().lower()
286
280
287 if par:
281 if par:
288 try:
282 try:
289 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
283 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
290 except KeyError:
284 except KeyError:
291 print ('Incorrect argument. Use on/1, off/0, '
285 print ('Incorrect argument. Use on/1, off/0, '
292 'or nothing for a toggle.')
286 'or nothing for a toggle.')
293 return
287 return
294 else:
288 else:
295 # toggle
289 # toggle
296 new_pdb = not self.shell.call_pdb
290 new_pdb = not self.shell.call_pdb
297
291
298 # set on the shell
292 # set on the shell
299 self.shell.call_pdb = new_pdb
293 self.shell.call_pdb = new_pdb
300 print 'Automatic pdb calling has been turned',on_off(new_pdb)
294 print 'Automatic pdb calling has been turned',on_off(new_pdb)
301
295
302 @line_magic
296 @line_magic
303 def debug(self, parameter_s=''):
297 def debug(self, parameter_s=''):
304 """Activate the interactive debugger in post-mortem mode.
298 """Activate the interactive debugger in post-mortem mode.
305
299
306 If an exception has just occurred, this lets you inspect its stack
300 If an exception has just occurred, this lets you inspect its stack
307 frames interactively. Note that this will always work only on the last
301 frames interactively. Note that this will always work only on the last
308 traceback that occurred, so you must call this quickly after an
302 traceback that occurred, so you must call this quickly after an
309 exception that you wish to inspect has fired, because if another one
303 exception that you wish to inspect has fired, because if another one
310 occurs, it clobbers the previous one.
304 occurs, it clobbers the previous one.
311
305
312 If you want IPython to automatically do this on every exception, see
306 If you want IPython to automatically do this on every exception, see
313 the %pdb magic for more details.
307 the %pdb magic for more details.
314 """
308 """
315 self.shell.debugger(force=True)
309 self.shell.debugger(force=True)
316
310
317 @line_magic
311 @line_magic
318 def tb(self, s):
312 def tb(self, s):
319 """Print the last traceback with the currently active exception mode.
313 """Print the last traceback with the currently active exception mode.
320
314
321 See %xmode for changing exception reporting modes."""
315 See %xmode for changing exception reporting modes."""
322 self.shell.showtraceback()
316 self.shell.showtraceback()
323
317
324 @skip_doctest
318 @skip_doctest
325 @line_magic
319 @line_magic
326 def run(self, parameter_s='', runner=None,
320 def run(self, parameter_s='', runner=None,
327 file_finder=get_py_filename):
321 file_finder=get_py_filename):
328 """Run the named file inside IPython as a program.
322 """Run the named file inside IPython as a program.
329
323
330 Usage:\\
324 Usage:
331 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options] -G] file [args]
325 %run [-n -i -e -G]
326 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
327 ( -m mod | file ) [args]
332
328
333 Parameters after the filename are passed as command-line arguments to
329 Parameters after the filename are passed as command-line arguments to
334 the program (put in sys.argv). Then, control returns to IPython's
330 the program (put in sys.argv). Then, control returns to IPython's
335 prompt.
331 prompt.
336
332
337 This is similar to running at a system prompt:\\
333 This is similar to running at a system prompt:\\
338 $ python file args\\
334 $ python file args\\
339 but with the advantage of giving you IPython's tracebacks, and of
335 but with the advantage of giving you IPython's tracebacks, and of
340 loading all variables into your interactive namespace for further use
336 loading all variables into your interactive namespace for further use
341 (unless -p is used, see below).
337 (unless -p is used, see below).
342
338
343 The file is executed in a namespace initially consisting only of
339 The file is executed in a namespace initially consisting only of
344 __name__=='__main__' and sys.argv constructed as indicated. It thus
340 __name__=='__main__' and sys.argv constructed as indicated. It thus
345 sees its environment as if it were being run as a stand-alone program
341 sees its environment as if it were being run as a stand-alone program
346 (except for sharing global objects such as previously imported
342 (except for sharing global objects such as previously imported
347 modules). But after execution, the IPython interactive namespace gets
343 modules). But after execution, the IPython interactive namespace gets
348 updated with all variables defined in the program (except for __name__
344 updated with all variables defined in the program (except for __name__
349 and sys.argv). This allows for very convenient loading of code for
345 and sys.argv). This allows for very convenient loading of code for
350 interactive work, while giving each program a 'clean sheet' to run in.
346 interactive work, while giving each program a 'clean sheet' to run in.
351
347
352 Arguments are expanded using shell-like glob match. Patterns
348 Arguments are expanded using shell-like glob match. Patterns
353 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
349 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
354 tilde '~' will be expanded into user's home directory. Unlike
350 tilde '~' will be expanded into user's home directory. Unlike
355 real shells, quotation does not suppress expansions. Use
351 real shells, quotation does not suppress expansions. Use
356 *two* back slashes (e.g., '\\\\*') to suppress expansions.
352 *two* back slashes (e.g., '\\\\*') to suppress expansions.
357 To completely disable these expansions, you can use -G flag.
353 To completely disable these expansions, you can use -G flag.
358
354
359 Options:
355 Options:
360
356
361 -n: __name__ is NOT set to '__main__', but to the running file's name
357 -n: __name__ is NOT set to '__main__', but to the running file's name
362 without extension (as python does under import). This allows running
358 without extension (as python does under import). This allows running
363 scripts and reloading the definitions in them without calling code
359 scripts and reloading the definitions in them without calling code
364 protected by an ' if __name__ == "__main__" ' clause.
360 protected by an ' if __name__ == "__main__" ' clause.
365
361
366 -i: run the file in IPython's namespace instead of an empty one. This
362 -i: run the file in IPython's namespace instead of an empty one. This
367 is useful if you are experimenting with code written in a text editor
363 is useful if you are experimenting with code written in a text editor
368 which depends on variables defined interactively.
364 which depends on variables defined interactively.
369
365
370 -e: ignore sys.exit() calls or SystemExit exceptions in the script
366 -e: ignore sys.exit() calls or SystemExit exceptions in the script
371 being run. This is particularly useful if IPython is being used to
367 being run. This is particularly useful if IPython is being used to
372 run unittests, which always exit with a sys.exit() call. In such
368 run unittests, which always exit with a sys.exit() call. In such
373 cases you are interested in the output of the test results, not in
369 cases you are interested in the output of the test results, not in
374 seeing a traceback of the unittest module.
370 seeing a traceback of the unittest module.
375
371
376 -t: print timing information at the end of the run. IPython will give
372 -t: print timing information at the end of the run. IPython will give
377 you an estimated CPU time consumption for your script, which under
373 you an estimated CPU time consumption for your script, which under
378 Unix uses the resource module to avoid the wraparound problems of
374 Unix uses the resource module to avoid the wraparound problems of
379 time.clock(). Under Unix, an estimate of time spent on system tasks
375 time.clock(). Under Unix, an estimate of time spent on system tasks
380 is also given (for Windows platforms this is reported as 0.0).
376 is also given (for Windows platforms this is reported as 0.0).
381
377
382 If -t is given, an additional -N<N> option can be given, where <N>
378 If -t is given, an additional -N<N> option can be given, where <N>
383 must be an integer indicating how many times you want the script to
379 must be an integer indicating how many times you want the script to
384 run. The final timing report will include total and per run results.
380 run. The final timing report will include total and per run results.
385
381
386 For example (testing the script uniq_stable.py)::
382 For example (testing the script uniq_stable.py)::
387
383
388 In [1]: run -t uniq_stable
384 In [1]: run -t uniq_stable
389
385
390 IPython CPU timings (estimated):\\
386 IPython CPU timings (estimated):\\
391 User : 0.19597 s.\\
387 User : 0.19597 s.\\
392 System: 0.0 s.\\
388 System: 0.0 s.\\
393
389
394 In [2]: run -t -N5 uniq_stable
390 In [2]: run -t -N5 uniq_stable
395
391
396 IPython CPU timings (estimated):\\
392 IPython CPU timings (estimated):\\
397 Total runs performed: 5\\
393 Total runs performed: 5\\
398 Times : Total Per run\\
394 Times : Total Per run\\
399 User : 0.910862 s, 0.1821724 s.\\
395 User : 0.910862 s, 0.1821724 s.\\
400 System: 0.0 s, 0.0 s.
396 System: 0.0 s, 0.0 s.
401
397
402 -d: run your program under the control of pdb, the Python debugger.
398 -d: run your program under the control of pdb, the Python debugger.
403 This allows you to execute your program step by step, watch variables,
399 This allows you to execute your program step by step, watch variables,
404 etc. Internally, what IPython does is similar to calling:
400 etc. Internally, what IPython does is similar to calling:
405
401
406 pdb.run('execfile("YOURFILENAME")')
402 pdb.run('execfile("YOURFILENAME")')
407
403
408 with a breakpoint set on line 1 of your file. You can change the line
404 with a breakpoint set on line 1 of your file. You can change the line
409 number for this automatic breakpoint to be <N> by using the -bN option
405 number for this automatic breakpoint to be <N> by using the -bN option
410 (where N must be an integer). For example::
406 (where N must be an integer). For example::
411
407
412 %run -d -b40 myscript
408 %run -d -b40 myscript
413
409
414 will set the first breakpoint at line 40 in myscript.py. Note that
410 will set the first breakpoint at line 40 in myscript.py. Note that
415 the first breakpoint must be set on a line which actually does
411 the first breakpoint must be set on a line which actually does
416 something (not a comment or docstring) for it to stop execution.
412 something (not a comment or docstring) for it to stop execution.
417
413
418 Or you can specify a breakpoint in a different file::
414 Or you can specify a breakpoint in a different file::
419
415
420 %run -d -b myotherfile.py:20 myscript
416 %run -d -b myotherfile.py:20 myscript
421
417
422 When the pdb debugger starts, you will see a (Pdb) prompt. You must
418 When the pdb debugger starts, you will see a (Pdb) prompt. You must
423 first enter 'c' (without quotes) to start execution up to the first
419 first enter 'c' (without quotes) to start execution up to the first
424 breakpoint.
420 breakpoint.
425
421
426 Entering 'help' gives information about the use of the debugger. You
422 Entering 'help' gives information about the use of the debugger. You
427 can easily see pdb's full documentation with "import pdb;pdb.help()"
423 can easily see pdb's full documentation with "import pdb;pdb.help()"
428 at a prompt.
424 at a prompt.
429
425
430 -p: run program under the control of the Python profiler module (which
426 -p: run program under the control of the Python profiler module (which
431 prints a detailed report of execution times, function calls, etc).
427 prints a detailed report of execution times, function calls, etc).
432
428
433 You can pass other options after -p which affect the behavior of the
429 You can pass other options after -p which affect the behavior of the
434 profiler itself. See the docs for %prun for details.
430 profiler itself. See the docs for %prun for details.
435
431
436 In this mode, the program's variables do NOT propagate back to the
432 In this mode, the program's variables do NOT propagate back to the
437 IPython interactive namespace (because they remain in the namespace
433 IPython interactive namespace (because they remain in the namespace
438 where the profiler executes them).
434 where the profiler executes them).
439
435
440 Internally this triggers a call to %prun, see its documentation for
436 Internally this triggers a call to %prun, see its documentation for
441 details on the options available specifically for profiling.
437 details on the options available specifically for profiling.
442
438
443 There is one special usage for which the text above doesn't apply:
439 There is one special usage for which the text above doesn't apply:
444 if the filename ends with .ipy, the file is run as ipython script,
440 if the filename ends with .ipy, the file is run as ipython script,
445 just as if the commands were written on IPython prompt.
441 just as if the commands were written on IPython prompt.
446
442
447 -m: specify module name to load instead of script path. Similar to
443 -m: specify module name to load instead of script path. Similar to
448 the -m option for the python interpreter. Use this option last if you
444 the -m option for the python interpreter. Use this option last if you
449 want to combine with other %run options. Unlike the python interpreter
445 want to combine with other %run options. Unlike the python interpreter
450 only source modules are allowed no .pyc or .pyo files.
446 only source modules are allowed no .pyc or .pyo files.
451 For example::
447 For example::
452
448
453 %run -m example
449 %run -m example
454
450
455 will run the example module.
451 will run the example module.
456
452
457 -G: disable shell-like glob expansion of arguments.
453 -G: disable shell-like glob expansion of arguments.
458
454
459 """
455 """
460
456
461 # get arguments and set sys.argv for program to be run.
457 # get arguments and set sys.argv for program to be run.
462 opts, arg_lst = self.parse_options(parameter_s,
458 opts, arg_lst = self.parse_options(parameter_s,
463 'nidtN:b:pD:l:rs:T:em:G',
459 'nidtN:b:pD:l:rs:T:em:G',
464 mode='list', list_all=1)
460 mode='list', list_all=1)
465 if "m" in opts:
461 if "m" in opts:
466 modulename = opts["m"][0]
462 modulename = opts["m"][0]
467 modpath = find_mod(modulename)
463 modpath = find_mod(modulename)
468 if modpath is None:
464 if modpath is None:
469 warn('%r is not a valid modulename on sys.path'%modulename)
465 warn('%r is not a valid modulename on sys.path'%modulename)
470 return
466 return
471 arg_lst = [modpath] + arg_lst
467 arg_lst = [modpath] + arg_lst
472 try:
468 try:
473 filename = file_finder(arg_lst[0])
469 filename = file_finder(arg_lst[0])
474 except IndexError:
470 except IndexError:
475 warn('you must provide at least a filename.')
471 warn('you must provide at least a filename.')
476 print '\n%run:\n', oinspect.getdoc(self.run)
472 print '\n%run:\n', oinspect.getdoc(self.run)
477 return
473 return
478 except IOError as e:
474 except IOError as e:
479 try:
475 try:
480 msg = str(e)
476 msg = str(e)
481 except UnicodeError:
477 except UnicodeError:
482 msg = e.message
478 msg = e.message
483 error(msg)
479 error(msg)
484 return
480 return
485
481
486 if filename.lower().endswith('.ipy'):
482 if filename.lower().endswith('.ipy'):
487 with preserve_keys(self.shell.user_ns, '__file__'):
483 with preserve_keys(self.shell.user_ns, '__file__'):
488 self.shell.user_ns['__file__'] = filename
484 self.shell.user_ns['__file__'] = filename
489 self.shell.safe_execfile_ipy(filename)
485 self.shell.safe_execfile_ipy(filename)
490 return
486 return
491
487
492 # Control the response to exit() calls made by the script being run
488 # Control the response to exit() calls made by the script being run
493 exit_ignore = 'e' in opts
489 exit_ignore = 'e' in opts
494
490
495 # Make sure that the running script gets a proper sys.argv as if it
491 # Make sure that the running script gets a proper sys.argv as if it
496 # were run from a system shell.
492 # were run from a system shell.
497 save_argv = sys.argv # save it for later restoring
493 save_argv = sys.argv # save it for later restoring
498
494
499 if 'G' in opts:
495 if 'G' in opts:
500 args = arg_lst[1:]
496 args = arg_lst[1:]
501 else:
497 else:
502 # tilde and glob expansion
498 # tilde and glob expansion
503 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
499 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
504
500
505 sys.argv = [filename] + args # put in the proper filename
501 sys.argv = [filename] + args # put in the proper filename
506 # protect sys.argv from potential unicode strings on Python 2:
502 # protect sys.argv from potential unicode strings on Python 2:
507 if not py3compat.PY3:
503 if not py3compat.PY3:
508 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
504 sys.argv = [ py3compat.cast_bytes(a) for a in sys.argv ]
509
505
510 if 'i' in opts:
506 if 'i' in opts:
511 # Run in user's interactive namespace
507 # Run in user's interactive namespace
512 prog_ns = self.shell.user_ns
508 prog_ns = self.shell.user_ns
513 __name__save = self.shell.user_ns['__name__']
509 __name__save = self.shell.user_ns['__name__']
514 prog_ns['__name__'] = '__main__'
510 prog_ns['__name__'] = '__main__'
515 main_mod = self.shell.new_main_mod(prog_ns)
511 main_mod = self.shell.new_main_mod(prog_ns)
516 else:
512 else:
517 # Run in a fresh, empty namespace
513 # Run in a fresh, empty namespace
518 if 'n' in opts:
514 if 'n' in opts:
519 name = os.path.splitext(os.path.basename(filename))[0]
515 name = os.path.splitext(os.path.basename(filename))[0]
520 else:
516 else:
521 name = '__main__'
517 name = '__main__'
522
518
523 main_mod = self.shell.new_main_mod()
519 main_mod = self.shell.new_main_mod()
524 prog_ns = main_mod.__dict__
520 prog_ns = main_mod.__dict__
525 prog_ns['__name__'] = name
521 prog_ns['__name__'] = name
526
522
527 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
523 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
528 # set the __file__ global in the script's namespace
524 # set the __file__ global in the script's namespace
529 prog_ns['__file__'] = filename
525 prog_ns['__file__'] = filename
530
526
531 # pickle fix. See interactiveshell for an explanation. But we need to
527 # pickle fix. See interactiveshell for an explanation. But we need to
532 # make sure that, if we overwrite __main__, we replace it at the end
528 # make sure that, if we overwrite __main__, we replace it at the end
533 main_mod_name = prog_ns['__name__']
529 main_mod_name = prog_ns['__name__']
534
530
535 if main_mod_name == '__main__':
531 if main_mod_name == '__main__':
536 restore_main = sys.modules['__main__']
532 restore_main = sys.modules['__main__']
537 else:
533 else:
538 restore_main = False
534 restore_main = False
539
535
540 # This needs to be undone at the end to prevent holding references to
536 # This needs to be undone at the end to prevent holding references to
541 # every single object ever created.
537 # every single object ever created.
542 sys.modules[main_mod_name] = main_mod
538 sys.modules[main_mod_name] = main_mod
543
539
540 if 'p' in opts or 'd' in opts:
541 if 'm' in opts:
542 code = 'run_module(modulename, prog_ns)'
543 code_ns = {
544 'run_module': self.shell.safe_run_module,
545 'prog_ns': prog_ns,
546 'modulename': modulename,
547 }
548 else:
549 code = 'execfile(filename, prog_ns)'
550 code_ns = {
551 'execfile': self.shell.safe_execfile,
552 'prog_ns': prog_ns,
553 'filename': get_py_filename(filename),
554 }
555
544 try:
556 try:
545 stats = None
557 stats = None
546 with self.shell.readline_no_record:
558 with self.shell.readline_no_record:
547 if 'p' in opts:
559 if 'p' in opts:
548 stats = self.prun('', None, False, opts, arg_lst, prog_ns)
560 stats = self._run_with_profiler(code, opts, code_ns)
549 else:
561 else:
550 if 'd' in opts:
562 if 'd' in opts:
563 self._run_with_debugger(
564 code, code_ns, opts.get('b', ['1'])[0], filename)
565 else:
566 if 'm' in opts:
567 def run():
568 self.shell.safe_run_module(modulename, prog_ns)
569 else:
570 if runner is None:
571 runner = self.default_runner
572 if runner is None:
573 runner = self.shell.safe_execfile
574
575 def run():
576 runner(filename, prog_ns, prog_ns,
577 exit_ignore=exit_ignore)
578
579 if 't' in opts:
580 # timed execution
581 try:
582 nruns = int(opts['N'][0])
583 if nruns < 1:
584 error('Number of runs must be >=1')
585 return
586 except (KeyError):
587 nruns = 1
588 self._run_with_timing(run, nruns)
589 else:
590 # regular execution
591 run()
592
593 if 'i' in opts:
594 self.shell.user_ns['__name__'] = __name__save
595 else:
596 # The shell MUST hold a reference to prog_ns so after %run
597 # exits, the python deletion mechanism doesn't zero it out
598 # (leaving dangling references).
599 self.shell.cache_main_mod(prog_ns, filename)
600 # update IPython interactive namespace
601
602 # Some forms of read errors on the file may mean the
603 # __name__ key was never set; using pop we don't have to
604 # worry about a possible KeyError.
605 prog_ns.pop('__name__', None)
606
607 with preserve_keys(self.shell.user_ns, '__file__'):
608 self.shell.user_ns.update(prog_ns)
609 finally:
610 # It's a bit of a mystery why, but __builtins__ can change from
611 # being a module to becoming a dict missing some key data after
612 # %run. As best I can see, this is NOT something IPython is doing
613 # at all, and similar problems have been reported before:
614 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
615 # Since this seems to be done by the interpreter itself, the best
616 # we can do is to at least restore __builtins__ for the user on
617 # exit.
618 self.shell.user_ns['__builtins__'] = builtin_mod
619
620 # Ensure key global structures are restored
621 sys.argv = save_argv
622 if restore_main:
623 sys.modules['__main__'] = restore_main
624 else:
625 # Remove from sys.modules the reference to main_mod we'd
626 # added. Otherwise it will trap references to objects
627 # contained therein.
628 del sys.modules[main_mod_name]
629
630 return stats
631
632 def _run_with_debugger(self, code, code_ns, break_point, filename):
633 """
634 Run `code` in debugger with a break point.
635
636 Parameters
637 ----------
638 code : str
639 Code to execute.
640 code_ns : dict
641 A namespace in which `code` is executed.
642 break_point : str
643 Line number in the file specified by `filename` argument
644 or a string in the format ``file:line``. In the latter
645 case, `filename` is ignored.
646 See also :func:`.parse_breakpoint`.
647 filename : str
648 Path to the file in which break point is specified.
649
650 Raises
651 ------
652 UsageError
653 If no meaningful break point is given by `break_point` and
654 `filename`.
655
656 """
551 deb = debugger.Pdb(self.shell.colors)
657 deb = debugger.Pdb(self.shell.colors)
552 # reset Breakpoint state, which is moronically kept
658 # reset Breakpoint state, which is moronically kept
553 # in a class
659 # in a class
554 bdb.Breakpoint.next = 1
660 bdb.Breakpoint.next = 1
555 bdb.Breakpoint.bplist = {}
661 bdb.Breakpoint.bplist = {}
556 bdb.Breakpoint.bpbynumber = [None]
662 bdb.Breakpoint.bpbynumber = [None]
557 # Set an initial breakpoint to stop execution
663 # Set an initial breakpoint to stop execution
558 maxtries = 10
664 maxtries = 10
559 bp_file, bp_line = parse_breakpoint(opts.get('b', ['1'])[0], filename)
665 bp_file, bp_line = parse_breakpoint(break_point, filename)
560 checkline = deb.checkline(bp_file, bp_line)
666 checkline = deb.checkline(bp_file, bp_line)
561 if not checkline:
667 if not checkline:
562 for bp in range(bp_line + 1, bp_line + maxtries + 1):
668 for bp in range(bp_line + 1, bp_line + maxtries + 1):
563 if deb.checkline(bp_file, bp):
669 if deb.checkline(bp_file, bp):
564 break
670 break
565 else:
671 else:
566 msg = ("\nI failed to find a valid line to set "
672 msg = ("\nI failed to find a valid line to set "
567 "a breakpoint\n"
673 "a breakpoint\n"
568 "after trying up to line: %s.\n"
674 "after trying up to line: %s.\n"
569 "Please set a valid breakpoint manually "
675 "Please set a valid breakpoint manually "
570 "with the -b option." % bp)
676 "with the -b option." % bp)
571 error(msg)
677 raise UsageError(msg)
572 return
573 # if we find a good linenumber, set the breakpoint
678 # if we find a good linenumber, set the breakpoint
574 deb.do_break('%s:%s' % (bp_file, bp_line))
679 deb.do_break('%s:%s' % (bp_file, bp_line))
575
680
576 # Mimic Pdb._runscript(...)
681 # Mimic Pdb._runscript(...)
577 deb._wait_for_mainpyfile = True
682 deb._wait_for_mainpyfile = True
578 deb.mainpyfile = deb.canonic(filename)
683 deb.mainpyfile = deb.canonic(filename)
579
684
580 # Start file run
685 # Start file run
581 print "NOTE: Enter 'c' at the",
686 print "NOTE: Enter 'c' at the",
582 print "%s prompt to start your script." % deb.prompt
687 print "%s prompt to start your script." % deb.prompt
583 ns = {'execfile': py3compat.execfile, 'prog_ns': prog_ns}
584 try:
688 try:
585 #save filename so it can be used by methods on the deb object
689 #save filename so it can be used by methods on the deb object
586 deb._exec_filename = filename
690 deb._exec_filename = filename
587 deb.run('execfile("%s", prog_ns)' % filename, ns)
691 deb.run(code, code_ns)
588
692
589 except:
693 except:
590 etype, value, tb = sys.exc_info()
694 etype, value, tb = sys.exc_info()
591 # Skip three frames in the traceback: the %run one,
695 # Skip three frames in the traceback: the %run one,
592 # one inside bdb.py, and the command-line typed by the
696 # one inside bdb.py, and the command-line typed by the
593 # user (run by exec in pdb itself).
697 # user (run by exec in pdb itself).
594 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
698 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
595 else:
699
596 if runner is None:
700 @staticmethod
597 runner = self.default_runner
701 def _run_with_timing(run, nruns):
598 if runner is None:
702 """
599 runner = self.shell.safe_execfile
703 Run function `run` and print timing information.
600 if 't' in opts:
704
601 # timed execution
705 Parameters
602 try:
706 ----------
603 nruns = int(opts['N'][0])
707 run : callable
604 if nruns < 1:
708 Any callable object which takes no argument.
605 error('Number of runs must be >=1')
709 nruns : int
606 return
710 Number of times to execute `run`.
607 except (KeyError):
711
608 nruns = 1
712 """
609 twall0 = time.time()
713 twall0 = time.time()
610 if nruns == 1:
714 if nruns == 1:
611 t0 = clock2()
715 t0 = clock2()
612 runner(filename, prog_ns, prog_ns,
716 run()
613 exit_ignore=exit_ignore)
614 t1 = clock2()
717 t1 = clock2()
615 t_usr = t1[0] - t0[0]
718 t_usr = t1[0] - t0[0]
616 t_sys = t1[1] - t0[1]
719 t_sys = t1[1] - t0[1]
617 print "\nIPython CPU timings (estimated):"
720 print "\nIPython CPU timings (estimated):"
618 print " User : %10.2f s." % t_usr
721 print " User : %10.2f s." % t_usr
619 print " System : %10.2f s." % t_sys
722 print " System : %10.2f s." % t_sys
620 else:
723 else:
621 runs = range(nruns)
724 runs = range(nruns)
622 t0 = clock2()
725 t0 = clock2()
623 for nr in runs:
726 for nr in runs:
624 runner(filename, prog_ns, prog_ns,
727 run()
625 exit_ignore=exit_ignore)
626 t1 = clock2()
728 t1 = clock2()
627 t_usr = t1[0] - t0[0]
729 t_usr = t1[0] - t0[0]
628 t_sys = t1[1] - t0[1]
730 t_sys = t1[1] - t0[1]
629 print "\nIPython CPU timings (estimated):"
731 print "\nIPython CPU timings (estimated):"
630 print "Total runs performed:", nruns
732 print "Total runs performed:", nruns
631 print " Times : %10s %10s" % ('Total', 'Per run')
733 print " Times : %10s %10s" % ('Total', 'Per run')
632 print " User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns)
734 print " User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns)
633 print " System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns)
735 print " System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns)
634 twall1 = time.time()
736 twall1 = time.time()
635 print "Wall time: %10.2f s." % (twall1 - twall0)
737 print "Wall time: %10.2f s." % (twall1 - twall0)
636
738
637 else:
638 # regular execution
639 runner(filename, prog_ns, prog_ns, exit_ignore=exit_ignore)
640
641 if 'i' in opts:
642 self.shell.user_ns['__name__'] = __name__save
643 else:
644 # The shell MUST hold a reference to prog_ns so after %run
645 # exits, the python deletion mechanism doesn't zero it out
646 # (leaving dangling references).
647 self.shell.cache_main_mod(prog_ns, filename)
648 # update IPython interactive namespace
649
650 # Some forms of read errors on the file may mean the
651 # __name__ key was never set; using pop we don't have to
652 # worry about a possible KeyError.
653 prog_ns.pop('__name__', None)
654
655 with preserve_keys(self.shell.user_ns, '__file__'):
656 self.shell.user_ns.update(prog_ns)
657 finally:
658 # It's a bit of a mystery why, but __builtins__ can change from
659 # being a module to becoming a dict missing some key data after
660 # %run. As best I can see, this is NOT something IPython is doing
661 # at all, and similar problems have been reported before:
662 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
663 # Since this seems to be done by the interpreter itself, the best
664 # we can do is to at least restore __builtins__ for the user on
665 # exit.
666 self.shell.user_ns['__builtins__'] = builtin_mod
667
668 # Ensure key global structures are restored
669 sys.argv = save_argv
670 if restore_main:
671 sys.modules['__main__'] = restore_main
672 else:
673 # Remove from sys.modules the reference to main_mod we'd
674 # added. Otherwise it will trap references to objects
675 # contained therein.
676 del sys.modules[main_mod_name]
677
678 return stats
679
680 @skip_doctest
739 @skip_doctest
681 @line_cell_magic
740 @line_cell_magic
682 def timeit(self, line='', cell=None):
741 def timeit(self, line='', cell=None):
683 """Time execution of a Python statement or expression
742 """Time execution of a Python statement or expression
684
743
685 Usage, in line mode:
744 Usage, in line mode:
686 %timeit [-n<N> -r<R> [-t|-c]] statement
745 %timeit [-n<N> -r<R> [-t|-c]] statement
687 or in cell mode:
746 or in cell mode:
688 %%timeit [-n<N> -r<R> [-t|-c]] setup_code
747 %%timeit [-n<N> -r<R> [-t|-c]] setup_code
689 code
748 code
690 code...
749 code...
691
750
692 Time execution of a Python statement or expression using the timeit
751 Time execution of a Python statement or expression using the timeit
693 module. This function can be used both as a line and cell magic:
752 module. This function can be used both as a line and cell magic:
694
753
695 - In line mode you can time a single-line statement (though multiple
754 - In line mode you can time a single-line statement (though multiple
696 ones can be chained with using semicolons).
755 ones can be chained with using semicolons).
697
756
698 - In cell mode, the statement in the first line is used as setup code
757 - In cell mode, the statement in the first line is used as setup code
699 (executed but not timed) and the body of the cell is timed. The cell
758 (executed but not timed) and the body of the cell is timed. The cell
700 body has access to any variables created in the setup code.
759 body has access to any variables created in the setup code.
701
760
702 Options:
761 Options:
703 -n<N>: execute the given statement <N> times in a loop. If this value
762 -n<N>: execute the given statement <N> times in a loop. If this value
704 is not given, a fitting value is chosen.
763 is not given, a fitting value is chosen.
705
764
706 -r<R>: repeat the loop iteration <R> times and take the best result.
765 -r<R>: repeat the loop iteration <R> times and take the best result.
707 Default: 3
766 Default: 3
708
767
709 -t: use time.time to measure the time, which is the default on Unix.
768 -t: use time.time to measure the time, which is the default on Unix.
710 This function measures wall time.
769 This function measures wall time.
711
770
712 -c: use time.clock to measure the time, which is the default on
771 -c: use time.clock to measure the time, which is the default on
713 Windows and measures wall time. On Unix, resource.getrusage is used
772 Windows and measures wall time. On Unix, resource.getrusage is used
714 instead and returns the CPU user time.
773 instead and returns the CPU user time.
715
774
716 -p<P>: use a precision of <P> digits to display the timing result.
775 -p<P>: use a precision of <P> digits to display the timing result.
717 Default: 3
776 Default: 3
718
777
719
778
720 Examples
779 Examples
721 --------
780 --------
722 ::
781 ::
723
782
724 In [1]: %timeit pass
783 In [1]: %timeit pass
725 10000000 loops, best of 3: 53.3 ns per loop
784 10000000 loops, best of 3: 53.3 ns per loop
726
785
727 In [2]: u = None
786 In [2]: u = None
728
787
729 In [3]: %timeit u is None
788 In [3]: %timeit u is None
730 10000000 loops, best of 3: 184 ns per loop
789 10000000 loops, best of 3: 184 ns per loop
731
790
732 In [4]: %timeit -r 4 u == None
791 In [4]: %timeit -r 4 u == None
733 1000000 loops, best of 4: 242 ns per loop
792 1000000 loops, best of 4: 242 ns per loop
734
793
735 In [5]: import time
794 In [5]: import time
736
795
737 In [6]: %timeit -n1 time.sleep(2)
796 In [6]: %timeit -n1 time.sleep(2)
738 1 loops, best of 3: 2 s per loop
797 1 loops, best of 3: 2 s per loop
739
798
740
799
741 The times reported by %timeit will be slightly higher than those
800 The times reported by %timeit will be slightly higher than those
742 reported by the timeit.py script when variables are accessed. This is
801 reported by the timeit.py script when variables are accessed. This is
743 due to the fact that %timeit executes the statement in the namespace
802 due to the fact that %timeit executes the statement in the namespace
744 of the shell, compared with timeit.py, which uses a single setup
803 of the shell, compared with timeit.py, which uses a single setup
745 statement to import function or create variables. Generally, the bias
804 statement to import function or create variables. Generally, the bias
746 does not matter as long as results from timeit.py are not mixed with
805 does not matter as long as results from timeit.py are not mixed with
747 those from %timeit."""
806 those from %timeit."""
748
807
749 import timeit
808 import timeit
750
809
751 opts, stmt = self.parse_options(line,'n:r:tcp:',
810 opts, stmt = self.parse_options(line,'n:r:tcp:',
752 posix=False, strict=False)
811 posix=False, strict=False)
753 if stmt == "" and cell is None:
812 if stmt == "" and cell is None:
754 return
813 return
755
814
756 timefunc = timeit.default_timer
815 timefunc = timeit.default_timer
757 number = int(getattr(opts, "n", 0))
816 number = int(getattr(opts, "n", 0))
758 repeat = int(getattr(opts, "r", timeit.default_repeat))
817 repeat = int(getattr(opts, "r", timeit.default_repeat))
759 precision = int(getattr(opts, "p", 3))
818 precision = int(getattr(opts, "p", 3))
760 if hasattr(opts, "t"):
819 if hasattr(opts, "t"):
761 timefunc = time.time
820 timefunc = time.time
762 if hasattr(opts, "c"):
821 if hasattr(opts, "c"):
763 timefunc = clock
822 timefunc = clock
764
823
765 timer = timeit.Timer(timer=timefunc)
824 timer = timeit.Timer(timer=timefunc)
766 # this code has tight coupling to the inner workings of timeit.Timer,
825 # this code has tight coupling to the inner workings of timeit.Timer,
767 # but is there a better way to achieve that the code stmt has access
826 # but is there a better way to achieve that the code stmt has access
768 # to the shell namespace?
827 # to the shell namespace?
769 transform = self.shell.input_splitter.transform_cell
828 transform = self.shell.input_splitter.transform_cell
770
829
771 if cell is None:
830 if cell is None:
772 # called as line magic
831 # called as line magic
773 ast_setup = ast.parse("pass")
832 ast_setup = ast.parse("pass")
774 ast_stmt = ast.parse(transform(stmt))
833 ast_stmt = ast.parse(transform(stmt))
775 else:
834 else:
776 ast_setup = ast.parse(transform(stmt))
835 ast_setup = ast.parse(transform(stmt))
777 ast_stmt = ast.parse(transform(cell))
836 ast_stmt = ast.parse(transform(cell))
778
837
779 ast_setup = self.shell.transform_ast(ast_setup)
838 ast_setup = self.shell.transform_ast(ast_setup)
780 ast_stmt = self.shell.transform_ast(ast_stmt)
839 ast_stmt = self.shell.transform_ast(ast_stmt)
781
840
782 # This codestring is taken from timeit.template - we fill it in as an
841 # This codestring is taken from timeit.template - we fill it in as an
783 # AST, so that we can apply our AST transformations to the user code
842 # AST, so that we can apply our AST transformations to the user code
784 # without affecting the timing code.
843 # without affecting the timing code.
785 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
844 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
786 ' setup\n'
845 ' setup\n'
787 ' _t0 = _timer()\n'
846 ' _t0 = _timer()\n'
788 ' for _i in _it:\n'
847 ' for _i in _it:\n'
789 ' stmt\n'
848 ' stmt\n'
790 ' _t1 = _timer()\n'
849 ' _t1 = _timer()\n'
791 ' return _t1 - _t0\n')
850 ' return _t1 - _t0\n')
792
851
793 class TimeitTemplateFiller(ast.NodeTransformer):
852 class TimeitTemplateFiller(ast.NodeTransformer):
794 "This is quite tightly tied to the template definition above."
853 "This is quite tightly tied to the template definition above."
795 def visit_FunctionDef(self, node):
854 def visit_FunctionDef(self, node):
796 "Fill in the setup statement"
855 "Fill in the setup statement"
797 self.generic_visit(node)
856 self.generic_visit(node)
798 if node.name == "inner":
857 if node.name == "inner":
799 node.body[:1] = ast_setup.body
858 node.body[:1] = ast_setup.body
800
859
801 return node
860 return node
802
861
803 def visit_For(self, node):
862 def visit_For(self, node):
804 "Fill in the statement to be timed"
863 "Fill in the statement to be timed"
805 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
864 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
806 node.body = ast_stmt.body
865 node.body = ast_stmt.body
807 return node
866 return node
808
867
809 timeit_ast = TimeitTemplateFiller().visit(timeit_ast_template)
868 timeit_ast = TimeitTemplateFiller().visit(timeit_ast_template)
810 timeit_ast = ast.fix_missing_locations(timeit_ast)
869 timeit_ast = ast.fix_missing_locations(timeit_ast)
811
870
812 # Track compilation time so it can be reported if too long
871 # Track compilation time so it can be reported if too long
813 # Minimum time above which compilation time will be reported
872 # Minimum time above which compilation time will be reported
814 tc_min = 0.1
873 tc_min = 0.1
815
874
816 t0 = clock()
875 t0 = clock()
817 code = compile(timeit_ast, "<magic-timeit>", "exec")
876 code = compile(timeit_ast, "<magic-timeit>", "exec")
818 tc = clock()-t0
877 tc = clock()-t0
819
878
820 ns = {}
879 ns = {}
821 exec code in self.shell.user_ns, ns
880 exec code in self.shell.user_ns, ns
822 timer.inner = ns["inner"]
881 timer.inner = ns["inner"]
823
882
824 if number == 0:
883 if number == 0:
825 # determine number so that 0.2 <= total time < 2.0
884 # determine number so that 0.2 <= total time < 2.0
826 number = 1
885 number = 1
827 for i in range(1, 10):
886 for i in range(1, 10):
828 if timer.timeit(number) >= 0.2:
887 if timer.timeit(number) >= 0.2:
829 break
888 break
830 number *= 10
889 number *= 10
831
890
832 best = min(timer.repeat(repeat, number)) / number
891 best = min(timer.repeat(repeat, number)) / number
833
892
834 print u"%d loops, best of %d: %s per loop" % (number, repeat,
893 print u"%d loops, best of %d: %s per loop" % (number, repeat,
835 _format_time(best, precision))
894 _format_time(best, precision))
836 if tc > tc_min:
895 if tc > tc_min:
837 print "Compiler time: %.2f s" % tc
896 print "Compiler time: %.2f s" % tc
838
897
839 @skip_doctest
898 @skip_doctest
840 @needs_local_scope
899 @needs_local_scope
841 @line_cell_magic
900 @line_cell_magic
842 def time(self,line='', cell=None, local_ns=None):
901 def time(self,line='', cell=None, local_ns=None):
843 """Time execution of a Python statement or expression.
902 """Time execution of a Python statement or expression.
844
903
845 The CPU and wall clock times are printed, and the value of the
904 The CPU and wall clock times are printed, and the value of the
846 expression (if any) is returned. Note that under Win32, system time
905 expression (if any) is returned. Note that under Win32, system time
847 is always reported as 0, since it can not be measured.
906 is always reported as 0, since it can not be measured.
848
907
849 This function can be used both as a line and cell magic:
908 This function can be used both as a line and cell magic:
850
909
851 - In line mode you can time a single-line statement (though multiple
910 - In line mode you can time a single-line statement (though multiple
852 ones can be chained with using semicolons).
911 ones can be chained with using semicolons).
853
912
854 - In cell mode, you can time the cell body (a directly
913 - In cell mode, you can time the cell body (a directly
855 following statement raises an error).
914 following statement raises an error).
856
915
857 This function provides very basic timing functionality. Use the timeit
916 This function provides very basic timing functionality. Use the timeit
858 magic for more controll over the measurement.
917 magic for more controll over the measurement.
859
918
860 Examples
919 Examples
861 --------
920 --------
862 ::
921 ::
863
922
864 In [1]: %time 2**128
923 In [1]: %time 2**128
865 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
924 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
866 Wall time: 0.00
925 Wall time: 0.00
867 Out[1]: 340282366920938463463374607431768211456L
926 Out[1]: 340282366920938463463374607431768211456L
868
927
869 In [2]: n = 1000000
928 In [2]: n = 1000000
870
929
871 In [3]: %time sum(range(n))
930 In [3]: %time sum(range(n))
872 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
931 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
873 Wall time: 1.37
932 Wall time: 1.37
874 Out[3]: 499999500000L
933 Out[3]: 499999500000L
875
934
876 In [4]: %time print 'hello world'
935 In [4]: %time print 'hello world'
877 hello world
936 hello world
878 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
937 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
879 Wall time: 0.00
938 Wall time: 0.00
880
939
881 Note that the time needed by Python to compile the given expression
940 Note that the time needed by Python to compile the given expression
882 will be reported if it is more than 0.1s. In this example, the
941 will be reported if it is more than 0.1s. In this example, the
883 actual exponentiation is done by Python at compilation time, so while
942 actual exponentiation is done by Python at compilation time, so while
884 the expression can take a noticeable amount of time to compute, that
943 the expression can take a noticeable amount of time to compute, that
885 time is purely due to the compilation:
944 time is purely due to the compilation:
886
945
887 In [5]: %time 3**9999;
946 In [5]: %time 3**9999;
888 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
947 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
889 Wall time: 0.00 s
948 Wall time: 0.00 s
890
949
891 In [6]: %time 3**999999;
950 In [6]: %time 3**999999;
892 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
951 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
893 Wall time: 0.00 s
952 Wall time: 0.00 s
894 Compiler : 0.78 s
953 Compiler : 0.78 s
895 """
954 """
896
955
897 # fail immediately if the given expression can't be compiled
956 # fail immediately if the given expression can't be compiled
898
957
899 if line and cell:
958 if line and cell:
900 raise UsageError("Can't use statement directly after '%%time'!")
959 raise UsageError("Can't use statement directly after '%%time'!")
901
960
902 if cell:
961 if cell:
903 expr = self.shell.prefilter(cell,False)
962 expr = self.shell.prefilter(cell,False)
904 else:
963 else:
905 expr = self.shell.prefilter(line,False)
964 expr = self.shell.prefilter(line,False)
906
965
907 # Minimum time above which parse time will be reported
966 # Minimum time above which parse time will be reported
908 tp_min = 0.1
967 tp_min = 0.1
909
968
910 t0 = clock()
969 t0 = clock()
911 expr_ast = ast.parse(expr)
970 expr_ast = ast.parse(expr)
912 tp = clock()-t0
971 tp = clock()-t0
913
972
914 # Apply AST transformations
973 # Apply AST transformations
915 expr_ast = self.shell.transform_ast(expr_ast)
974 expr_ast = self.shell.transform_ast(expr_ast)
916
975
917 # Minimum time above which compilation time will be reported
976 # Minimum time above which compilation time will be reported
918 tc_min = 0.1
977 tc_min = 0.1
919
978
920 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
979 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
921 mode = 'eval'
980 mode = 'eval'
922 source = '<timed eval>'
981 source = '<timed eval>'
923 expr_ast = ast.Expression(expr_ast.body[0].value)
982 expr_ast = ast.Expression(expr_ast.body[0].value)
924 else:
983 else:
925 mode = 'exec'
984 mode = 'exec'
926 source = '<timed exec>'
985 source = '<timed exec>'
927 t0 = clock()
986 t0 = clock()
928 code = compile(expr_ast, source, mode)
987 code = compile(expr_ast, source, mode)
929 tc = clock()-t0
988 tc = clock()-t0
930
989
931 # skew measurement as little as possible
990 # skew measurement as little as possible
932 glob = self.shell.user_ns
991 glob = self.shell.user_ns
933 wtime = time.time
992 wtime = time.time
934 # time execution
993 # time execution
935 wall_st = wtime()
994 wall_st = wtime()
936 if mode=='eval':
995 if mode=='eval':
937 st = clock2()
996 st = clock2()
938 out = eval(code, glob, local_ns)
997 out = eval(code, glob, local_ns)
939 end = clock2()
998 end = clock2()
940 else:
999 else:
941 st = clock2()
1000 st = clock2()
942 exec code in glob, local_ns
1001 exec code in glob, local_ns
943 end = clock2()
1002 end = clock2()
944 out = None
1003 out = None
945 wall_end = wtime()
1004 wall_end = wtime()
946 # Compute actual times and report
1005 # Compute actual times and report
947 wall_time = wall_end-wall_st
1006 wall_time = wall_end-wall_st
948 cpu_user = end[0]-st[0]
1007 cpu_user = end[0]-st[0]
949 cpu_sys = end[1]-st[1]
1008 cpu_sys = end[1]-st[1]
950 cpu_tot = cpu_user+cpu_sys
1009 cpu_tot = cpu_user+cpu_sys
951 # On windows cpu_sys is always zero, so no new information to the next print
1010 # On windows cpu_sys is always zero, so no new information to the next print
952 if sys.platform != 'win32':
1011 if sys.platform != 'win32':
953 print "CPU times: user %s, sys: %s, total: %s" % \
1012 print "CPU times: user %s, sys: %s, total: %s" % \
954 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot))
1013 (_format_time(cpu_user),_format_time(cpu_sys),_format_time(cpu_tot))
955 print "Wall time: %s" % _format_time(wall_time)
1014 print "Wall time: %s" % _format_time(wall_time)
956 if tc > tc_min:
1015 if tc > tc_min:
957 print "Compiler : %s" % _format_time(tc)
1016 print "Compiler : %s" % _format_time(tc)
958 if tp > tp_min:
1017 if tp > tp_min:
959 print "Parser : %s" % _format_time(tp)
1018 print "Parser : %s" % _format_time(tp)
960 return out
1019 return out
961
1020
962 @skip_doctest
1021 @skip_doctest
963 @line_magic
1022 @line_magic
964 def macro(self, parameter_s=''):
1023 def macro(self, parameter_s=''):
965 """Define a macro for future re-execution. It accepts ranges of history,
1024 """Define a macro for future re-execution. It accepts ranges of history,
966 filenames or string objects.
1025 filenames or string objects.
967
1026
968 Usage:\\
1027 Usage:\\
969 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1028 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
970
1029
971 Options:
1030 Options:
972
1031
973 -r: use 'raw' input. By default, the 'processed' history is used,
1032 -r: use 'raw' input. By default, the 'processed' history is used,
974 so that magics are loaded in their transformed version to valid
1033 so that magics are loaded in their transformed version to valid
975 Python. If this option is given, the raw input as typed as the
1034 Python. If this option is given, the raw input as typed as the
976 command line is used instead.
1035 command line is used instead.
977
1036
978 This will define a global variable called `name` which is a string
1037 This will define a global variable called `name` which is a string
979 made of joining the slices and lines you specify (n1,n2,... numbers
1038 made of joining the slices and lines you specify (n1,n2,... numbers
980 above) from your input history into a single string. This variable
1039 above) from your input history into a single string. This variable
981 acts like an automatic function which re-executes those lines as if
1040 acts like an automatic function which re-executes those lines as if
982 you had typed them. You just type 'name' at the prompt and the code
1041 you had typed them. You just type 'name' at the prompt and the code
983 executes.
1042 executes.
984
1043
985 The syntax for indicating input ranges is described in %history.
1044 The syntax for indicating input ranges is described in %history.
986
1045
987 Note: as a 'hidden' feature, you can also use traditional python slice
1046 Note: as a 'hidden' feature, you can also use traditional python slice
988 notation, where N:M means numbers N through M-1.
1047 notation, where N:M means numbers N through M-1.
989
1048
990 For example, if your history contains (%hist prints it)::
1049 For example, if your history contains (%hist prints it)::
991
1050
992 44: x=1
1051 44: x=1
993 45: y=3
1052 45: y=3
994 46: z=x+y
1053 46: z=x+y
995 47: print x
1054 47: print x
996 48: a=5
1055 48: a=5
997 49: print 'x',x,'y',y
1056 49: print 'x',x,'y',y
998
1057
999 you can create a macro with lines 44 through 47 (included) and line 49
1058 you can create a macro with lines 44 through 47 (included) and line 49
1000 called my_macro with::
1059 called my_macro with::
1001
1060
1002 In [55]: %macro my_macro 44-47 49
1061 In [55]: %macro my_macro 44-47 49
1003
1062
1004 Now, typing `my_macro` (without quotes) will re-execute all this code
1063 Now, typing `my_macro` (without quotes) will re-execute all this code
1005 in one pass.
1064 in one pass.
1006
1065
1007 You don't need to give the line-numbers in order, and any given line
1066 You don't need to give the line-numbers in order, and any given line
1008 number can appear multiple times. You can assemble macros with any
1067 number can appear multiple times. You can assemble macros with any
1009 lines from your input history in any order.
1068 lines from your input history in any order.
1010
1069
1011 The macro is a simple object which holds its value in an attribute,
1070 The macro is a simple object which holds its value in an attribute,
1012 but IPython's display system checks for macros and executes them as
1071 but IPython's display system checks for macros and executes them as
1013 code instead of printing them when you type their name.
1072 code instead of printing them when you type their name.
1014
1073
1015 You can view a macro's contents by explicitly printing it with::
1074 You can view a macro's contents by explicitly printing it with::
1016
1075
1017 print macro_name
1076 print macro_name
1018
1077
1019 """
1078 """
1020 opts,args = self.parse_options(parameter_s,'r',mode='list')
1079 opts,args = self.parse_options(parameter_s,'r',mode='list')
1021 if not args: # List existing macros
1080 if not args: # List existing macros
1022 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
1081 return sorted(k for k,v in self.shell.user_ns.iteritems() if\
1023 isinstance(v, Macro))
1082 isinstance(v, Macro))
1024 if len(args) == 1:
1083 if len(args) == 1:
1025 raise UsageError(
1084 raise UsageError(
1026 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1085 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1027 name, codefrom = args[0], " ".join(args[1:])
1086 name, codefrom = args[0], " ".join(args[1:])
1028
1087
1029 #print 'rng',ranges # dbg
1088 #print 'rng',ranges # dbg
1030 try:
1089 try:
1031 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1090 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1032 except (ValueError, TypeError) as e:
1091 except (ValueError, TypeError) as e:
1033 print e.args[0]
1092 print e.args[0]
1034 return
1093 return
1035 macro = Macro(lines)
1094 macro = Macro(lines)
1036 self.shell.define_macro(name, macro)
1095 self.shell.define_macro(name, macro)
1037 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1096 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
1038 print '=== Macro contents: ==='
1097 print '=== Macro contents: ==='
1039 print macro,
1098 print macro,
1040
1099
1041 @magic_arguments.magic_arguments()
1100 @magic_arguments.magic_arguments()
1042 @magic_arguments.argument('output', type=str, default='', nargs='?',
1101 @magic_arguments.argument('output', type=str, default='', nargs='?',
1043 help="""The name of the variable in which to store output.
1102 help="""The name of the variable in which to store output.
1044 This is a utils.io.CapturedIO object with stdout/err attributes
1103 This is a utils.io.CapturedIO object with stdout/err attributes
1045 for the text of the captured output.
1104 for the text of the captured output.
1046
1105
1047 CapturedOutput also has a show() method for displaying the output,
1106 CapturedOutput also has a show() method for displaying the output,
1048 and __call__ as well, so you can use that to quickly display the
1107 and __call__ as well, so you can use that to quickly display the
1049 output.
1108 output.
1050
1109
1051 If unspecified, captured output is discarded.
1110 If unspecified, captured output is discarded.
1052 """
1111 """
1053 )
1112 )
1054 @magic_arguments.argument('--no-stderr', action="store_true",
1113 @magic_arguments.argument('--no-stderr', action="store_true",
1055 help="""Don't capture stderr."""
1114 help="""Don't capture stderr."""
1056 )
1115 )
1057 @magic_arguments.argument('--no-stdout', action="store_true",
1116 @magic_arguments.argument('--no-stdout', action="store_true",
1058 help="""Don't capture stdout."""
1117 help="""Don't capture stdout."""
1059 )
1118 )
1060 @cell_magic
1119 @cell_magic
1061 def capture(self, line, cell):
1120 def capture(self, line, cell):
1062 """run the cell, capturing stdout/err"""
1121 """run the cell, capturing stdout/err"""
1063 args = magic_arguments.parse_argstring(self.capture, line)
1122 args = magic_arguments.parse_argstring(self.capture, line)
1064 out = not args.no_stdout
1123 out = not args.no_stdout
1065 err = not args.no_stderr
1124 err = not args.no_stderr
1066 with capture_output(out, err) as io:
1125 with capture_output(out, err) as io:
1067 self.shell.run_cell(cell)
1126 self.shell.run_cell(cell)
1068 if args.output:
1127 if args.output:
1069 self.shell.user_ns[args.output] = io
1128 self.shell.user_ns[args.output] = io
1070
1129
1071 def parse_breakpoint(text, current_file):
1130 def parse_breakpoint(text, current_file):
1072 '''Returns (file, line) for file:line and (current_file, line) for line'''
1131 '''Returns (file, line) for file:line and (current_file, line) for line'''
1073 colon = text.find(':')
1132 colon = text.find(':')
1074 if colon == -1:
1133 if colon == -1:
1075 return current_file, int(text)
1134 return current_file, int(text)
1076 else:
1135 else:
1077 return text[:colon], int(text[colon+1:])
1136 return text[:colon], int(text[colon+1:])
1078
1137
1079 def _format_time(timespan, precision=3):
1138 def _format_time(timespan, precision=3):
1080 """Formats the timespan in a human readable form"""
1139 """Formats the timespan in a human readable form"""
1081 import math
1140 import math
1082
1141
1083 if timespan >= 60.0:
1142 if timespan >= 60.0:
1084 # we have more than a minute, format that in a human readable form
1143 # we have more than a minute, format that in a human readable form
1085 # Idea from http://snipplr.com/view/5713/
1144 # Idea from http://snipplr.com/view/5713/
1086 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1145 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1087 time = []
1146 time = []
1088 leftover = timespan
1147 leftover = timespan
1089 for suffix, length in parts:
1148 for suffix, length in parts:
1090 value = int(leftover / length)
1149 value = int(leftover / length)
1091 if value > 0:
1150 if value > 0:
1092 leftover = leftover % length
1151 leftover = leftover % length
1093 time.append(u'%s%s' % (str(value), suffix))
1152 time.append(u'%s%s' % (str(value), suffix))
1094 if leftover < 1:
1153 if leftover < 1:
1095 break
1154 break
1096 return " ".join(time)
1155 return " ".join(time)
1097
1156
1098
1157
1099 # Unfortunately the unicode 'micro' symbol can cause problems in
1158 # Unfortunately the unicode 'micro' symbol can cause problems in
1100 # certain terminals.
1159 # certain terminals.
1101 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1160 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1102 # Try to prevent crashes by being more secure than it needs to
1161 # Try to prevent crashes by being more secure than it needs to
1103 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1162 # E.g. eclipse is able to print a µ, but has no sys.stdout.encoding set.
1104 units = [u"s", u"ms",u'us',"ns"] # the save value
1163 units = [u"s", u"ms",u'us',"ns"] # the save value
1105 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1164 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1106 try:
1165 try:
1107 u'\xb5'.encode(sys.stdout.encoding)
1166 u'\xb5'.encode(sys.stdout.encoding)
1108 units = [u"s", u"ms",u'\xb5s',"ns"]
1167 units = [u"s", u"ms",u'\xb5s',"ns"]
1109 except:
1168 except:
1110 pass
1169 pass
1111 scaling = [1, 1e3, 1e6, 1e9]
1170 scaling = [1, 1e3, 1e6, 1e9]
1112
1171
1113 if timespan > 0.0:
1172 if timespan > 0.0:
1114 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1173 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1115 else:
1174 else:
1116 order = 3
1175 order = 3
1117 ret = u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1176 ret = u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1118 return ret
1177 return ret
@@ -1,339 +1,416 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Tests for code execution (%run and related), which is particularly tricky.
2 """Tests for code execution (%run and related), which is particularly tricky.
3
3
4 Because of how %run manages namespaces, and the fact that we are trying here to
4 Because of how %run manages namespaces, and the fact that we are trying here to
5 verify subtle object deletion and reference counting issues, the %run tests
5 verify subtle object deletion and reference counting issues, the %run tests
6 will be kept in this separate file. This makes it easier to aggregate in one
6 will be kept in this separate file. This makes it easier to aggregate in one
7 place the tricks needed to handle it; most other magics are much easier to test
7 place the tricks needed to handle it; most other magics are much easier to test
8 and we do so in a common test_magic file.
8 and we do so in a common test_magic file.
9 """
9 """
10 from __future__ import absolute_import
10 from __future__ import absolute_import
11
11
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Imports
13 # Imports
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 import functools
16 import os
17 import os
18 import random
17 import sys
19 import sys
18 import tempfile
20 import tempfile
21 import textwrap
22 import unittest
19
23
20 import nose.tools as nt
24 import nose.tools as nt
21 from nose import SkipTest
25 from nose import SkipTest
22
26
23 from IPython.testing import decorators as dec
27 from IPython.testing import decorators as dec
24 from IPython.testing import tools as tt
28 from IPython.testing import tools as tt
25 from IPython.utils import py3compat
29 from IPython.utils import py3compat
30 from IPython.utils.tempdir import TemporaryDirectory
31 from IPython.core import debugger
26
32
27 #-----------------------------------------------------------------------------
33 #-----------------------------------------------------------------------------
28 # Test functions begin
34 # Test functions begin
29 #-----------------------------------------------------------------------------
35 #-----------------------------------------------------------------------------
30
36
31 def doctest_refbug():
37 def doctest_refbug():
32 """Very nasty problem with references held by multiple runs of a script.
38 """Very nasty problem with references held by multiple runs of a script.
33 See: https://github.com/ipython/ipython/issues/141
39 See: https://github.com/ipython/ipython/issues/141
34
40
35 In [1]: _ip.clear_main_mod_cache()
41 In [1]: _ip.clear_main_mod_cache()
36 # random
42 # random
37
43
38 In [2]: %run refbug
44 In [2]: %run refbug
39
45
40 In [3]: call_f()
46 In [3]: call_f()
41 lowercased: hello
47 lowercased: hello
42
48
43 In [4]: %run refbug
49 In [4]: %run refbug
44
50
45 In [5]: call_f()
51 In [5]: call_f()
46 lowercased: hello
52 lowercased: hello
47 lowercased: hello
53 lowercased: hello
48 """
54 """
49
55
50
56
51 def doctest_run_builtins():
57 def doctest_run_builtins():
52 r"""Check that %run doesn't damage __builtins__.
58 r"""Check that %run doesn't damage __builtins__.
53
59
54 In [1]: import tempfile
60 In [1]: import tempfile
55
61
56 In [2]: bid1 = id(__builtins__)
62 In [2]: bid1 = id(__builtins__)
57
63
58 In [3]: fname = tempfile.mkstemp('.py')[1]
64 In [3]: fname = tempfile.mkstemp('.py')[1]
59
65
60 In [3]: f = open(fname,'w')
66 In [3]: f = open(fname,'w')
61
67
62 In [4]: dummy= f.write('pass\n')
68 In [4]: dummy= f.write('pass\n')
63
69
64 In [5]: f.flush()
70 In [5]: f.flush()
65
71
66 In [6]: t1 = type(__builtins__)
72 In [6]: t1 = type(__builtins__)
67
73
68 In [7]: %run $fname
74 In [7]: %run $fname
69
75
70 In [7]: f.close()
76 In [7]: f.close()
71
77
72 In [8]: bid2 = id(__builtins__)
78 In [8]: bid2 = id(__builtins__)
73
79
74 In [9]: t2 = type(__builtins__)
80 In [9]: t2 = type(__builtins__)
75
81
76 In [10]: t1 == t2
82 In [10]: t1 == t2
77 Out[10]: True
83 Out[10]: True
78
84
79 In [10]: bid1 == bid2
85 In [10]: bid1 == bid2
80 Out[10]: True
86 Out[10]: True
81
87
82 In [12]: try:
88 In [12]: try:
83 ....: os.unlink(fname)
89 ....: os.unlink(fname)
84 ....: except:
90 ....: except:
85 ....: pass
91 ....: pass
86 ....:
92 ....:
87 """
93 """
88
94
89
95
90 def doctest_run_option_parser():
96 def doctest_run_option_parser():
91 r"""Test option parser in %run.
97 r"""Test option parser in %run.
92
98
93 In [1]: %run print_argv.py
99 In [1]: %run print_argv.py
94 []
100 []
95
101
96 In [2]: %run print_argv.py print*.py
102 In [2]: %run print_argv.py print*.py
97 ['print_argv.py']
103 ['print_argv.py']
98
104
99 In [3]: %run -G print_argv.py print*.py
105 In [3]: %run -G print_argv.py print*.py
100 ['print*.py']
106 ['print*.py']
101
107
102 """
108 """
103
109
104
110
105 @dec.skip_win32
111 @dec.skip_win32
106 def doctest_run_option_parser_for_posix():
112 def doctest_run_option_parser_for_posix():
107 r"""Test option parser in %run (Linux/OSX specific).
113 r"""Test option parser in %run (Linux/OSX specific).
108
114
109 You need double quote to escape glob in POSIX systems:
115 You need double quote to escape glob in POSIX systems:
110
116
111 In [1]: %run print_argv.py print\\*.py
117 In [1]: %run print_argv.py print\\*.py
112 ['print*.py']
118 ['print*.py']
113
119
114 You can't use quote to escape glob in POSIX systems:
120 You can't use quote to escape glob in POSIX systems:
115
121
116 In [2]: %run print_argv.py 'print*.py'
122 In [2]: %run print_argv.py 'print*.py'
117 ['print_argv.py']
123 ['print_argv.py']
118
124
119 """
125 """
120
126
121
127
122 @dec.skip_if_not_win32
128 @dec.skip_if_not_win32
123 def doctest_run_option_parser_for_windows():
129 def doctest_run_option_parser_for_windows():
124 r"""Test option parser in %run (Windows specific).
130 r"""Test option parser in %run (Windows specific).
125
131
126 In Windows, you can't escape ``*` `by backslash:
132 In Windows, you can't escape ``*` `by backslash:
127
133
128 In [1]: %run print_argv.py print\\*.py
134 In [1]: %run print_argv.py print\\*.py
129 ['print\\*.py']
135 ['print\\*.py']
130
136
131 You can use quote to escape glob:
137 You can use quote to escape glob:
132
138
133 In [2]: %run print_argv.py 'print*.py'
139 In [2]: %run print_argv.py 'print*.py'
134 ['print*.py']
140 ['print*.py']
135
141
136 """
142 """
137
143
138
144
139 @py3compat.doctest_refactor_print
145 @py3compat.doctest_refactor_print
140 def doctest_reset_del():
146 def doctest_reset_del():
141 """Test that resetting doesn't cause errors in __del__ methods.
147 """Test that resetting doesn't cause errors in __del__ methods.
142
148
143 In [2]: class A(object):
149 In [2]: class A(object):
144 ...: def __del__(self):
150 ...: def __del__(self):
145 ...: print str("Hi")
151 ...: print str("Hi")
146 ...:
152 ...:
147
153
148 In [3]: a = A()
154 In [3]: a = A()
149
155
150 In [4]: get_ipython().reset()
156 In [4]: get_ipython().reset()
151 Hi
157 Hi
152
158
153 In [5]: 1+1
159 In [5]: 1+1
154 Out[5]: 2
160 Out[5]: 2
155 """
161 """
156
162
157 # For some tests, it will be handy to organize them in a class with a common
163 # For some tests, it will be handy to organize them in a class with a common
158 # setup that makes a temp file
164 # setup that makes a temp file
159
165
160 class TestMagicRunPass(tt.TempFileMixin):
166 class TestMagicRunPass(tt.TempFileMixin):
161
167
162 def setup(self):
168 def setup(self):
163 """Make a valid python temp file."""
169 """Make a valid python temp file."""
164 self.mktmp('pass\n')
170 self.mktmp('pass\n')
165
171
166 def run_tmpfile(self):
172 def run_tmpfile(self):
167 _ip = get_ipython()
173 _ip = get_ipython()
168 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
174 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
169 # See below and ticket https://bugs.launchpad.net/bugs/366353
175 # See below and ticket https://bugs.launchpad.net/bugs/366353
170 _ip.magic('run %s' % self.fname)
176 _ip.magic('run %s' % self.fname)
171
177
172 def run_tmpfile_p(self):
178 def run_tmpfile_p(self):
173 _ip = get_ipython()
179 _ip = get_ipython()
174 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
180 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
175 # See below and ticket https://bugs.launchpad.net/bugs/366353
181 # See below and ticket https://bugs.launchpad.net/bugs/366353
176 _ip.magic('run -p %s' % self.fname)
182 _ip.magic('run -p %s' % self.fname)
177
183
178 def test_builtins_id(self):
184 def test_builtins_id(self):
179 """Check that %run doesn't damage __builtins__ """
185 """Check that %run doesn't damage __builtins__ """
180 _ip = get_ipython()
186 _ip = get_ipython()
181 # Test that the id of __builtins__ is not modified by %run
187 # Test that the id of __builtins__ is not modified by %run
182 bid1 = id(_ip.user_ns['__builtins__'])
188 bid1 = id(_ip.user_ns['__builtins__'])
183 self.run_tmpfile()
189 self.run_tmpfile()
184 bid2 = id(_ip.user_ns['__builtins__'])
190 bid2 = id(_ip.user_ns['__builtins__'])
185 nt.assert_equal(bid1, bid2)
191 nt.assert_equal(bid1, bid2)
186
192
187 def test_builtins_type(self):
193 def test_builtins_type(self):
188 """Check that the type of __builtins__ doesn't change with %run.
194 """Check that the type of __builtins__ doesn't change with %run.
189
195
190 However, the above could pass if __builtins__ was already modified to
196 However, the above could pass if __builtins__ was already modified to
191 be a dict (it should be a module) by a previous use of %run. So we
197 be a dict (it should be a module) by a previous use of %run. So we
192 also check explicitly that it really is a module:
198 also check explicitly that it really is a module:
193 """
199 """
194 _ip = get_ipython()
200 _ip = get_ipython()
195 self.run_tmpfile()
201 self.run_tmpfile()
196 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
202 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
197
203
198 def test_prompts(self):
204 def test_prompts(self):
199 """Test that prompts correctly generate after %run"""
205 """Test that prompts correctly generate after %run"""
200 self.run_tmpfile()
206 self.run_tmpfile()
201 _ip = get_ipython()
207 _ip = get_ipython()
202 p2 = _ip.prompt_manager.render('in2').strip()
208 p2 = _ip.prompt_manager.render('in2').strip()
203 nt.assert_equal(p2[:3], '...')
209 nt.assert_equal(p2[:3], '...')
204
210
205 def test_run_profile( self ):
211 def test_run_profile( self ):
206 """Test that the option -p, which invokes the profiler, do not
212 """Test that the option -p, which invokes the profiler, do not
207 crash by invoking execfile"""
213 crash by invoking execfile"""
208 _ip = get_ipython()
214 _ip = get_ipython()
209 self.run_tmpfile_p()
215 self.run_tmpfile_p()
210
216
211
217
212 class TestMagicRunSimple(tt.TempFileMixin):
218 class TestMagicRunSimple(tt.TempFileMixin):
213
219
214 def test_simpledef(self):
220 def test_simpledef(self):
215 """Test that simple class definitions work."""
221 """Test that simple class definitions work."""
216 src = ("class foo: pass\n"
222 src = ("class foo: pass\n"
217 "def f(): return foo()")
223 "def f(): return foo()")
218 self.mktmp(src)
224 self.mktmp(src)
219 _ip.magic('run %s' % self.fname)
225 _ip.magic('run %s' % self.fname)
220 _ip.run_cell('t = isinstance(f(), foo)')
226 _ip.run_cell('t = isinstance(f(), foo)')
221 nt.assert_true(_ip.user_ns['t'])
227 nt.assert_true(_ip.user_ns['t'])
222
228
223 def test_obj_del(self):
229 def test_obj_del(self):
224 """Test that object's __del__ methods are called on exit."""
230 """Test that object's __del__ methods are called on exit."""
225 if sys.platform == 'win32':
231 if sys.platform == 'win32':
226 try:
232 try:
227 import win32api
233 import win32api
228 except ImportError:
234 except ImportError:
229 raise SkipTest("Test requires pywin32")
235 raise SkipTest("Test requires pywin32")
230 src = ("class A(object):\n"
236 src = ("class A(object):\n"
231 " def __del__(self):\n"
237 " def __del__(self):\n"
232 " print 'object A deleted'\n"
238 " print 'object A deleted'\n"
233 "a = A()\n")
239 "a = A()\n")
234 self.mktmp(py3compat.doctest_refactor_print(src))
240 self.mktmp(py3compat.doctest_refactor_print(src))
235 if dec.module_not_available('sqlite3'):
241 if dec.module_not_available('sqlite3'):
236 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
242 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
237 else:
243 else:
238 err = None
244 err = None
239 tt.ipexec_validate(self.fname, 'object A deleted', err)
245 tt.ipexec_validate(self.fname, 'object A deleted', err)
240
246
241 @dec.skip_known_failure
247 @dec.skip_known_failure
242 def test_aggressive_namespace_cleanup(self):
248 def test_aggressive_namespace_cleanup(self):
243 """Test that namespace cleanup is not too aggressive GH-238
249 """Test that namespace cleanup is not too aggressive GH-238
244
250
245 Returning from another run magic deletes the namespace"""
251 Returning from another run magic deletes the namespace"""
246 # see ticket https://github.com/ipython/ipython/issues/238
252 # see ticket https://github.com/ipython/ipython/issues/238
247 class secondtmp(tt.TempFileMixin): pass
253 class secondtmp(tt.TempFileMixin): pass
248 empty = secondtmp()
254 empty = secondtmp()
249 empty.mktmp('')
255 empty.mktmp('')
250 src = ("ip = get_ipython()\n"
256 src = ("ip = get_ipython()\n"
251 "for i in range(5):\n"
257 "for i in range(5):\n"
252 " try:\n"
258 " try:\n"
253 " ip.magic('run %s')\n"
259 " ip.magic('run %s')\n"
254 " except NameError as e:\n"
260 " except NameError as e:\n"
255 " print i;break\n" % empty.fname)
261 " print i;break\n" % empty.fname)
256 self.mktmp(py3compat.doctest_refactor_print(src))
262 self.mktmp(py3compat.doctest_refactor_print(src))
257 _ip.magic('run %s' % self.fname)
263 _ip.magic('run %s' % self.fname)
258 _ip.run_cell('ip == get_ipython()')
264 _ip.run_cell('ip == get_ipython()')
259 nt.assert_equal(_ip.user_ns['i'], 5)
265 nt.assert_equal(_ip.user_ns['i'], 5)
260
266
261 @dec.skip_win32
267 @dec.skip_win32
262 def test_tclass(self):
268 def test_tclass(self):
263 mydir = os.path.dirname(__file__)
269 mydir = os.path.dirname(__file__)
264 tc = os.path.join(mydir, 'tclass')
270 tc = os.path.join(mydir, 'tclass')
265 src = ("%%run '%s' C-first\n"
271 src = ("%%run '%s' C-first\n"
266 "%%run '%s' C-second\n"
272 "%%run '%s' C-second\n"
267 "%%run '%s' C-third\n") % (tc, tc, tc)
273 "%%run '%s' C-third\n") % (tc, tc, tc)
268 self.mktmp(src, '.ipy')
274 self.mktmp(src, '.ipy')
269 out = """\
275 out = """\
270 ARGV 1-: ['C-first']
276 ARGV 1-: ['C-first']
271 ARGV 1-: ['C-second']
277 ARGV 1-: ['C-second']
272 tclass.py: deleting object: C-first
278 tclass.py: deleting object: C-first
273 ARGV 1-: ['C-third']
279 ARGV 1-: ['C-third']
274 tclass.py: deleting object: C-second
280 tclass.py: deleting object: C-second
275 tclass.py: deleting object: C-third
281 tclass.py: deleting object: C-third
276 """
282 """
277 if dec.module_not_available('sqlite3'):
283 if dec.module_not_available('sqlite3'):
278 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
284 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
279 else:
285 else:
280 err = None
286 err = None
281 tt.ipexec_validate(self.fname, out, err)
287 tt.ipexec_validate(self.fname, out, err)
282
288
283 def test_run_i_after_reset(self):
289 def test_run_i_after_reset(self):
284 """Check that %run -i still works after %reset (gh-693)"""
290 """Check that %run -i still works after %reset (gh-693)"""
285 src = "yy = zz\n"
291 src = "yy = zz\n"
286 self.mktmp(src)
292 self.mktmp(src)
287 _ip.run_cell("zz = 23")
293 _ip.run_cell("zz = 23")
288 _ip.magic('run -i %s' % self.fname)
294 _ip.magic('run -i %s' % self.fname)
289 nt.assert_equal(_ip.user_ns['yy'], 23)
295 nt.assert_equal(_ip.user_ns['yy'], 23)
290 _ip.magic('reset -f')
296 _ip.magic('reset -f')
291 _ip.run_cell("zz = 23")
297 _ip.run_cell("zz = 23")
292 _ip.magic('run -i %s' % self.fname)
298 _ip.magic('run -i %s' % self.fname)
293 nt.assert_equal(_ip.user_ns['yy'], 23)
299 nt.assert_equal(_ip.user_ns['yy'], 23)
294
300
295 def test_unicode(self):
301 def test_unicode(self):
296 """Check that files in odd encodings are accepted."""
302 """Check that files in odd encodings are accepted."""
297 mydir = os.path.dirname(__file__)
303 mydir = os.path.dirname(__file__)
298 na = os.path.join(mydir, 'nonascii.py')
304 na = os.path.join(mydir, 'nonascii.py')
299 _ip.magic('run "%s"' % na)
305 _ip.magic('run "%s"' % na)
300 nt.assert_equal(_ip.user_ns['u'], u'Ўт№Ф')
306 nt.assert_equal(_ip.user_ns['u'], u'Ўт№Ф')
301
307
302 def test_run_py_file_attribute(self):
308 def test_run_py_file_attribute(self):
303 """Test handling of `__file__` attribute in `%run <file>.py`."""
309 """Test handling of `__file__` attribute in `%run <file>.py`."""
304 src = "t = __file__\n"
310 src = "t = __file__\n"
305 self.mktmp(src)
311 self.mktmp(src)
306 _missing = object()
312 _missing = object()
307 file1 = _ip.user_ns.get('__file__', _missing)
313 file1 = _ip.user_ns.get('__file__', _missing)
308 _ip.magic('run %s' % self.fname)
314 _ip.magic('run %s' % self.fname)
309 file2 = _ip.user_ns.get('__file__', _missing)
315 file2 = _ip.user_ns.get('__file__', _missing)
310
316
311 # Check that __file__ was equal to the filename in the script's
317 # Check that __file__ was equal to the filename in the script's
312 # namespace.
318 # namespace.
313 nt.assert_equal(_ip.user_ns['t'], self.fname)
319 nt.assert_equal(_ip.user_ns['t'], self.fname)
314
320
315 # Check that __file__ was not leaked back into user_ns.
321 # Check that __file__ was not leaked back into user_ns.
316 nt.assert_equal(file1, file2)
322 nt.assert_equal(file1, file2)
317
323
318 def test_run_ipy_file_attribute(self):
324 def test_run_ipy_file_attribute(self):
319 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
325 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
320 src = "t = __file__\n"
326 src = "t = __file__\n"
321 self.mktmp(src, ext='.ipy')
327 self.mktmp(src, ext='.ipy')
322 _missing = object()
328 _missing = object()
323 file1 = _ip.user_ns.get('__file__', _missing)
329 file1 = _ip.user_ns.get('__file__', _missing)
324 _ip.magic('run %s' % self.fname)
330 _ip.magic('run %s' % self.fname)
325 file2 = _ip.user_ns.get('__file__', _missing)
331 file2 = _ip.user_ns.get('__file__', _missing)
326
332
327 # Check that __file__ was equal to the filename in the script's
333 # Check that __file__ was equal to the filename in the script's
328 # namespace.
334 # namespace.
329 nt.assert_equal(_ip.user_ns['t'], self.fname)
335 nt.assert_equal(_ip.user_ns['t'], self.fname)
330
336
331 # Check that __file__ was not leaked back into user_ns.
337 # Check that __file__ was not leaked back into user_ns.
332 nt.assert_equal(file1, file2)
338 nt.assert_equal(file1, file2)
333
339
334 def test_run_formatting(self):
340 def test_run_formatting(self):
335 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
341 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
336 src = "pass"
342 src = "pass"
337 self.mktmp(src)
343 self.mktmp(src)
338 _ip.magic('run -t -N 1 %s' % self.fname)
344 _ip.magic('run -t -N 1 %s' % self.fname)
339 _ip.magic('run -t -N 10 %s' % self.fname)
345 _ip.magic('run -t -N 10 %s' % self.fname)
346
347
348 class TestMagicRunWithPackage(unittest.TestCase):
349
350 def writefile(self, name, content):
351 path = os.path.join(self.tempdir.name, name)
352 d = os.path.dirname(path)
353 if not os.path.isdir(d):
354 os.makedirs(d)
355 with open(path, 'w') as f:
356 f.write(textwrap.dedent(content))
357
358 def setUp(self):
359 self.package = package = 'tmp{0}'.format(repr(random.random())[2:])
360 """Temporary valid python package name."""
361
362 self.value = int(random.random() * 10000)
363
364 self.tempdir = TemporaryDirectory()
365 self.__orig_cwd = os.getcwdu()
366 sys.path.insert(0, self.tempdir.name)
367
368 self.writefile(os.path.join(package, '__init__.py'), '')
369 self.writefile(os.path.join(package, 'sub.py'), """
370 x = {0!r}
371 """.format(self.value))
372 self.writefile(os.path.join(package, 'relative.py'), """
373 from .sub import x
374 """)
375 self.writefile(os.path.join(package, 'absolute.py'), """
376 from {0}.sub import x
377 """.format(package))
378
379 def tearDown(self):
380 os.chdir(self.__orig_cwd)
381 sys.path[:] = [p for p in sys.path if p != self.tempdir.name]
382 self.tempdir.cleanup()
383
384 def check_run_submodule(self, submodule, opts=''):
385 _ip.magic('run {2} -m {0}.{1}'.format(self.package, submodule, opts))
386 self.assertEqual(_ip.user_ns['x'], self.value,
387 'Variable `x` is not loaded from module `{0}`.'
388 .format(submodule))
389
390 def test_run_submodule_with_absolute_import(self):
391 self.check_run_submodule('absolute')
392
393 def test_run_submodule_with_relative_import(self):
394 """Run submodule that has a relative import statement (#2727)."""
395 self.check_run_submodule('relative')
396
397 def test_prun_submodule_with_absolute_import(self):
398 self.check_run_submodule('absolute', '-p')
399
400 def test_prun_submodule_with_relative_import(self):
401 self.check_run_submodule('relative', '-p')
402
403 def with_fake_debugger(func):
404 @functools.wraps(func)
405 def wrapper(*args, **kwds):
406 with tt.monkeypatch(debugger.Pdb, 'run', staticmethod(eval)):
407 return func(*args, **kwds)
408 return wrapper
409
410 @with_fake_debugger
411 def test_debug_run_submodule_with_absolute_import(self):
412 self.check_run_submodule('absolute', '-d')
413
414 @with_fake_debugger
415 def test_debug_run_submodule_with_relative_import(self):
416 self.check_run_submodule('relative', '-d')
@@ -1,1 +1,1 b''
1 Subproject commit f7467391a9f9d4868f0bbf0d088fd572625862a4
1 Subproject commit 945dfca396a1a7ca66d36ee758c7d8dca2b11287
@@ -1,981 +1,1001 b''
1 article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
1 article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
2 audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
2 audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
3 audio:not([controls]){display:none;}
3 audio:not([controls]){display:none;}
4 html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
4 html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
5 a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
5 a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
6 a:hover,a:active{outline:0;}
6 a:hover,a:active{outline:0;}
7 sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
7 sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
8 sup{top:-0.5em;}
8 sup{top:-0.5em;}
9 sub{bottom:-0.25em;}
9 sub{bottom:-0.25em;}
10 img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
10 img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
11 #map_canvas img,.google-maps img{max-width:none;}
11 #map_canvas img,.google-maps img{max-width:none;}
12 button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
12 button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
13 button,input{*overflow:visible;line-height:normal;}
13 button,input{*overflow:visible;line-height:normal;}
14 button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
14 button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
15 button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
15 button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
16 label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;}
16 label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;}
17 input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
17 input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
18 input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
18 input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
19 textarea{overflow:auto;vertical-align:top;}
19 textarea{overflow:auto;vertical-align:top;}
20 @media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
20 @media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
21 .clearfix:after{clear:both;}
21 .clearfix:after{clear:both;}
22 .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
22 .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
23 .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
23 .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
24 body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;color:#000000;background-color:#ffffff;}
24 body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;color:#000000;background-color:#ffffff;}
25 a{color:#0088cc;text-decoration:none;}
25 a{color:#0088cc;text-decoration:none;}
26 a:hover,a:focus{color:#005580;text-decoration:underline;}
26 a:hover,a:focus{color:#005580;text-decoration:underline;}
27 .img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
27 .img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
28 .img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
28 .img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
29 .img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
29 .img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
30 .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
30 .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
31 .row:after{clear:both;}
31 .row:after{clear:both;}
32 [class*="span"]{float:left;min-height:1px;margin-left:20px;}
32 [class*="span"]{float:left;min-height:1px;margin-left:20px;}
33 .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
33 .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
34 .span12{width:940px;}
34 .span12{width:940px;}
35 .span11{width:860px;}
35 .span11{width:860px;}
36 .span10{width:780px;}
36 .span10{width:780px;}
37 .span9{width:700px;}
37 .span9{width:700px;}
38 .span8{width:620px;}
38 .span8{width:620px;}
39 .span7{width:540px;}
39 .span7{width:540px;}
40 .span6{width:460px;}
40 .span6{width:460px;}
41 .span5{width:380px;}
41 .span5{width:380px;}
42 .span4{width:300px;}
42 .span4{width:300px;}
43 .span3{width:220px;}
43 .span3{width:220px;}
44 .span2{width:140px;}
44 .span2{width:140px;}
45 .span1{width:60px;}
45 .span1{width:60px;}
46 .offset12{margin-left:980px;}
46 .offset12{margin-left:980px;}
47 .offset11{margin-left:900px;}
47 .offset11{margin-left:900px;}
48 .offset10{margin-left:820px;}
48 .offset10{margin-left:820px;}
49 .offset9{margin-left:740px;}
49 .offset9{margin-left:740px;}
50 .offset8{margin-left:660px;}
50 .offset8{margin-left:660px;}
51 .offset7{margin-left:580px;}
51 .offset7{margin-left:580px;}
52 .offset6{margin-left:500px;}
52 .offset6{margin-left:500px;}
53 .offset5{margin-left:420px;}
53 .offset5{margin-left:420px;}
54 .offset4{margin-left:340px;}
54 .offset4{margin-left:340px;}
55 .offset3{margin-left:260px;}
55 .offset3{margin-left:260px;}
56 .offset2{margin-left:180px;}
56 .offset2{margin-left:180px;}
57 .offset1{margin-left:100px;}
57 .offset1{margin-left:100px;}
58 .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
58 .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
59 .row-fluid:after{clear:both;}
59 .row-fluid:after{clear:both;}
60 .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
60 .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
61 .row-fluid [class*="span"]:first-child{margin-left:0;}
61 .row-fluid [class*="span"]:first-child{margin-left:0;}
62 .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;}
62 .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;}
63 .row-fluid .span12{width:100%;*width:99.94680851063829%;}
63 .row-fluid .span12{width:100%;*width:99.94680851063829%;}
64 .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
64 .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
65 .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
65 .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
66 .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
66 .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
67 .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
67 .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
68 .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
68 .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
69 .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
69 .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
70 .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
70 .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
71 .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
71 .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
72 .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
72 .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
73 .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
73 .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
74 .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
74 .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
75 .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
75 .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
76 .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
76 .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
77 .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
77 .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
78 .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
78 .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
79 .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
79 .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
80 .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
80 .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
81 .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
81 .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
82 .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
82 .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
83 .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
83 .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
84 .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
84 .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
85 .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
85 .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
86 .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
86 .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
87 .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
87 .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
88 .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
88 .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
89 .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
89 .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
90 .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
90 .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
91 .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
91 .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
92 .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
92 .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
93 .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
93 .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
94 .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
94 .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
95 .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
95 .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
96 .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
96 .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
97 .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
97 .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
98 .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
98 .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
99 [class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
99 [class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
100 [class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
100 [class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
101 .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
101 .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
102 .container:after{clear:both;}
102 .container:after{clear:both;}
103 .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
103 .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
104 .container-fluid:after{clear:both;}
104 .container-fluid:after{clear:both;}
105 p{margin:0 0 10px;}
105 p{margin:0 0 10px;}
106 .lead{margin-bottom:20px;font-size:19.5px;font-weight:200;line-height:30px;}
106 .lead{margin-bottom:20px;font-size:19.5px;font-weight:200;line-height:30px;}
107 small{font-size:85%;}
107 small{font-size:85%;}
108 strong{font-weight:bold;}
108 strong{font-weight:bold;}
109 em{font-style:italic;}
109 em{font-style:italic;}
110 cite{font-style:normal;}
110 cite{font-style:normal;}
111 .muted{color:#999999;}
111 .muted{color:#999999;}
112 a.muted:hover,a.muted:focus{color:#808080;}
112 a.muted:hover,a.muted:focus{color:#808080;}
113 .text-warning{color:#c09853;}
113 .text-warning{color:#c09853;}
114 a.text-warning:hover,a.text-warning:focus{color:#a47e3c;}
114 a.text-warning:hover,a.text-warning:focus{color:#a47e3c;}
115 .text-error{color:#b94a48;}
115 .text-error{color:#b94a48;}
116 a.text-error:hover,a.text-error:focus{color:#953b39;}
116 a.text-error:hover,a.text-error:focus{color:#953b39;}
117 .text-info{color:#3a87ad;}
117 .text-info{color:#3a87ad;}
118 a.text-info:hover,a.text-info:focus{color:#2d6987;}
118 a.text-info:hover,a.text-info:focus{color:#2d6987;}
119 .text-success{color:#468847;}
119 .text-success{color:#468847;}
120 a.text-success:hover,a.text-success:focus{color:#356635;}
120 a.text-success:hover,a.text-success:focus{color:#356635;}
121 .text-left{text-align:left;}
121 .text-left{text-align:left;}
122 .text-right{text-align:right;}
122 .text-right{text-align:right;}
123 .text-center{text-align:center;}
123 .text-center{text-align:center;}
124 h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
124 h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
125 h1,h2,h3{line-height:40px;}
125 h1,h2,h3{line-height:40px;}
126 h1{font-size:35.75px;}
126 h1{font-size:35.75px;}
127 h2{font-size:29.25px;}
127 h2{font-size:29.25px;}
128 h3{font-size:22.75px;}
128 h3{font-size:22.75px;}
129 h4{font-size:16.25px;}
129 h4{font-size:16.25px;}
130 h5{font-size:13px;}
130 h5{font-size:13px;}
131 h6{font-size:11.049999999999999px;}
131 h6{font-size:11.049999999999999px;}
132 h1 small{font-size:22.75px;}
132 h1 small{font-size:22.75px;}
133 h2 small{font-size:16.25px;}
133 h2 small{font-size:16.25px;}
134 h3 small{font-size:13px;}
134 h3 small{font-size:13px;}
135 h4 small{font-size:13px;}
135 h4 small{font-size:13px;}
136 .page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
136 .page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
137 ul,ol{padding:0;margin:0 0 10px 25px;}
137 ul,ol{padding:0;margin:0 0 10px 25px;}
138 ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
138 ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
139 li{line-height:20px;}
139 li{line-height:20px;}
140 ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
140 ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
141 ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;}
141 ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;}
142 dl{margin-bottom:20px;}
142 dl{margin-bottom:20px;}
143 dt,dd{line-height:20px;}
143 dt,dd{line-height:20px;}
144 dt{font-weight:bold;}
144 dt{font-weight:bold;}
145 dd{margin-left:10px;}
145 dd{margin-left:10px;}
146 .dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;}
146 .dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;}
147 .dl-horizontal:after{clear:both;}
147 .dl-horizontal:after{clear:both;}
148 .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
148 .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
149 .dl-horizontal dd{margin-left:180px;}
149 .dl-horizontal dd{margin-left:180px;}
150 hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
150 hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
151 abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;}
151 abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;}
152 abbr.initialism{font-size:90%;text-transform:uppercase;}
152 abbr.initialism{font-size:90%;text-transform:uppercase;}
153 blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16.25px;font-weight:300;line-height:1.25;}
153 blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16.25px;font-weight:300;line-height:1.25;}
154 blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
154 blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
155 blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
155 blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
156 blockquote.pull-right small:before{content:'';}
156 blockquote.pull-right small:before{content:'';}
157 blockquote.pull-right small:after{content:'\00A0 \2014';}
157 blockquote.pull-right small:after{content:'\00A0 \2014';}
158 q:before,q:after,blockquote:before,blockquote:after{content:"";}
158 q:before,q:after,blockquote:before,blockquote:after{content:"";}
159 address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
159 address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
160 form{margin:0 0 20px;}
160 form{margin:0 0 20px;}
161 fieldset{padding:0;margin:0;border:0;}
161 fieldset{padding:0;margin:0;border:0;}
162 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
162 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
163 label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:20px;}
163 label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:20px;}
164 input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
164 input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
165 label{display:block;margin-bottom:5px;}
165 label{display:block;margin-bottom:5px;}
166 select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:13px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;}
166 select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:13px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;}
167 input,textarea,.uneditable-input{width:206px;}
167 input,textarea,.uneditable-input{width:206px;}
168 textarea{height:auto;}
168 textarea{height:auto;}
169 textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
169 textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
170 input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;}
170 input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;}
171 input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
171 input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
172 select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
172 select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
173 select{width:220px;border:1px solid #cccccc;background-color:#ffffff;}
173 select{width:220px;border:1px solid #cccccc;background-color:#ffffff;}
174 select[multiple],select[size]{height:auto;}
174 select[multiple],select[size]{height:auto;}
175 select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
175 select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
176 .uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
176 .uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
177 .uneditable-input{overflow:hidden;white-space:nowrap;}
177 .uneditable-input{overflow:hidden;white-space:nowrap;}
178 .uneditable-textarea{width:auto;height:auto;}
178 .uneditable-textarea{width:auto;height:auto;}
179 input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
179 input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
180 input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
180 input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
181 input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
181 input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
182 .radio,.checkbox{min-height:20px;padding-left:20px;}
182 .radio,.checkbox{min-height:20px;padding-left:20px;}
183 .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;}
183 .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;}
184 .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
184 .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
185 .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
185 .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
186 .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
186 .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
187 .input-mini{width:60px;}
187 .input-mini{width:60px;}
188 .input-small{width:90px;}
188 .input-small{width:90px;}
189 .input-medium{width:150px;}
189 .input-medium{width:150px;}
190 .input-large{width:210px;}
190 .input-large{width:210px;}
191 .input-xlarge{width:270px;}
191 .input-xlarge{width:270px;}
192 .input-xxlarge{width:530px;}
192 .input-xxlarge{width:530px;}
193 input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
193 input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
194 .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
194 .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
195 input,textarea,.uneditable-input{margin-left:0;}
195 input,textarea,.uneditable-input{margin-left:0;}
196 .controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
196 .controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
197 input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
197 input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
198 input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
198 input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
199 input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
199 input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
200 input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
200 input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
201 input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
201 input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
202 input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
202 input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
203 input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
203 input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
204 input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
204 input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
205 input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
205 input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
206 input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
206 input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
207 input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
207 input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
208 input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
208 input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
209 .controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
209 .controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
210 .controls-row:after{clear:both;}
210 .controls-row:after{clear:both;}
211 .controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;}
211 .controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;}
212 .controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;}
212 .controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;}
213 input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
213 input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
214 input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
214 input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
215 .control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
215 .control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
216 .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
216 .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
217 .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
217 .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
218 .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
218 .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
219 .control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
219 .control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
220 .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
220 .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
221 .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
221 .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
222 .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
222 .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
223 .control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
223 .control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
224 .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
224 .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
225 .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
225 .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
226 .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
226 .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
227 .control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
227 .control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
228 .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
228 .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
229 .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
229 .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
230 .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
230 .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
231 input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
231 input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
232 .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
232 .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
233 .form-actions:after{clear:both;}
233 .form-actions:after{clear:both;}
234 .help-block,.help-inline{color:#262626;}
234 .help-block,.help-inline{color:#262626;}
235 .help-block{display:block;margin-bottom:10px;}
235 .help-block{display:block;margin-bottom:10px;}
236 .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
236 .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
237 .input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:13px;}
237 .input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:13px;}
238 .input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;}
238 .input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;}
239 .input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:13px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
239 .input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:13px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
240 .input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
240 .input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
241 .input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
241 .input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
242 .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
242 .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
243 .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
243 .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
244 .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
244 .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
245 .input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;}
245 .input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;}
246 .input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
246 .input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
247 .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
247 .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
248 .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
248 .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
249 .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
249 .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
250 .input-prepend.input-append .btn-group:first-child{margin-left:0;}
250 .input-prepend.input-append .btn-group:first-child{margin-left:0;}
251 input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
251 input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
252 .form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
252 .form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
253 .form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
253 .form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
254 .form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
254 .form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
255 .form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
255 .form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
256 .form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
256 .form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
257 .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;}
257 .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;}
258 .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
258 .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
259 .form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
259 .form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
260 .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
260 .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
261 .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
261 .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
262 .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
262 .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
263 .control-group{margin-bottom:10px;}
263 .control-group{margin-bottom:10px;}
264 legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
264 legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
265 .form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
265 .form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
266 .form-horizontal .control-group:after{clear:both;}
266 .form-horizontal .control-group:after{clear:both;}
267 .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;}
267 .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;}
268 .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;}
268 .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;}
269 .form-horizontal .help-block{margin-bottom:0;}
269 .form-horizontal .help-block{margin-bottom:0;}
270 .form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;}
270 .form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;}
271 .form-horizontal .form-actions{padding-left:180px;}
271 .form-horizontal .form-actions{padding-left:180px;}
272 table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
272 table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
273 .table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
273 .table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
274 .table th{font-weight:bold;}
274 .table th{font-weight:bold;}
275 .table thead th{vertical-align:bottom;}
275 .table thead th{vertical-align:bottom;}
276 .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
276 .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
277 .table tbody+tbody{border-top:2px solid #dddddd;}
277 .table tbody+tbody{border-top:2px solid #dddddd;}
278 .table .table{background-color:#ffffff;}
278 .table .table{background-color:#ffffff;}
279 .table-condensed th,.table-condensed td{padding:4px 5px;}
279 .table-condensed th,.table-condensed td{padding:4px 5px;}
280 .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
280 .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
281 .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
281 .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
282 .table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
282 .table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
283 .table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
283 .table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
284 .table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
284 .table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
285 .table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
285 .table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
286 .table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;}
286 .table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;}
287 .table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;}
287 .table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;}
288 .table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
288 .table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
289 .table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
289 .table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
290 .table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;}
290 .table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;}
291 .table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;}
291 .table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;}
292 table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;}
292 table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;}
293 .table td.span1,.table th.span1{float:none;width:44px;margin-left:0;}
293 .table td.span1,.table th.span1{float:none;width:44px;margin-left:0;}
294 .table td.span2,.table th.span2{float:none;width:124px;margin-left:0;}
294 .table td.span2,.table th.span2{float:none;width:124px;margin-left:0;}
295 .table td.span3,.table th.span3{float:none;width:204px;margin-left:0;}
295 .table td.span3,.table th.span3{float:none;width:204px;margin-left:0;}
296 .table td.span4,.table th.span4{float:none;width:284px;margin-left:0;}
296 .table td.span4,.table th.span4{float:none;width:284px;margin-left:0;}
297 .table td.span5,.table th.span5{float:none;width:364px;margin-left:0;}
297 .table td.span5,.table th.span5{float:none;width:364px;margin-left:0;}
298 .table td.span6,.table th.span6{float:none;width:444px;margin-left:0;}
298 .table td.span6,.table th.span6{float:none;width:444px;margin-left:0;}
299 .table td.span7,.table th.span7{float:none;width:524px;margin-left:0;}
299 .table td.span7,.table th.span7{float:none;width:524px;margin-left:0;}
300 .table td.span8,.table th.span8{float:none;width:604px;margin-left:0;}
300 .table td.span8,.table th.span8{float:none;width:604px;margin-left:0;}
301 .table td.span9,.table th.span9{float:none;width:684px;margin-left:0;}
301 .table td.span9,.table th.span9{float:none;width:684px;margin-left:0;}
302 .table td.span10,.table th.span10{float:none;width:764px;margin-left:0;}
302 .table td.span10,.table th.span10{float:none;width:764px;margin-left:0;}
303 .table td.span11,.table th.span11{float:none;width:844px;margin-left:0;}
303 .table td.span11,.table th.span11{float:none;width:844px;margin-left:0;}
304 .table td.span12,.table th.span12{float:none;width:924px;margin-left:0;}
304 .table td.span12,.table th.span12{float:none;width:924px;margin-left:0;}
305 .table tbody tr.success>td{background-color:#dff0d8;}
305 .table tbody tr.success>td{background-color:#dff0d8;}
306 .table tbody tr.error>td{background-color:#f2dede;}
306 .table tbody tr.error>td{background-color:#f2dede;}
307 .table tbody tr.warning>td{background-color:#fcf8e3;}
307 .table tbody tr.warning>td{background-color:#fcf8e3;}
308 .table tbody tr.info>td{background-color:#d9edf7;}
308 .table tbody tr.info>td{background-color:#d9edf7;}
309 .table-hover tbody tr.success:hover>td{background-color:#d0e9c6;}
309 .table-hover tbody tr.success:hover>td{background-color:#d0e9c6;}
310 .table-hover tbody tr.error:hover>td{background-color:#ebcccc;}
310 .table-hover tbody tr.error:hover>td{background-color:#ebcccc;}
311 .table-hover tbody tr.warning:hover>td{background-color:#faf2cc;}
311 .table-hover tbody tr.warning:hover>td{background-color:#faf2cc;}
312 .table-hover tbody tr.info:hover>td{background-color:#c4e3f3;}
312 .table-hover tbody tr.info:hover>td{background-color:#c4e3f3;}
313 [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
313 [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
314 .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
314 .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
315 .icon-glass{background-position:0 0;}
315 .icon-glass{background-position:0 0;}
316 .icon-music{background-position:-24px 0;}
316 .icon-music{background-position:-24px 0;}
317 .icon-search{background-position:-48px 0;}
317 .icon-search{background-position:-48px 0;}
318 .icon-envelope{background-position:-72px 0;}
318 .icon-envelope{background-position:-72px 0;}
319 .icon-heart{background-position:-96px 0;}
319 .icon-heart{background-position:-96px 0;}
320 .icon-star{background-position:-120px 0;}
320 .icon-star{background-position:-120px 0;}
321 .icon-star-empty{background-position:-144px 0;}
321 .icon-star-empty{background-position:-144px 0;}
322 .icon-user{background-position:-168px 0;}
322 .icon-user{background-position:-168px 0;}
323 .icon-film{background-position:-192px 0;}
323 .icon-film{background-position:-192px 0;}
324 .icon-th-large{background-position:-216px 0;}
324 .icon-th-large{background-position:-216px 0;}
325 .icon-th{background-position:-240px 0;}
325 .icon-th{background-position:-240px 0;}
326 .icon-th-list{background-position:-264px 0;}
326 .icon-th-list{background-position:-264px 0;}
327 .icon-ok{background-position:-288px 0;}
327 .icon-ok{background-position:-288px 0;}
328 .icon-remove{background-position:-312px 0;}
328 .icon-remove{background-position:-312px 0;}
329 .icon-zoom-in{background-position:-336px 0;}
329 .icon-zoom-in{background-position:-336px 0;}
330 .icon-zoom-out{background-position:-360px 0;}
330 .icon-zoom-out{background-position:-360px 0;}
331 .icon-off{background-position:-384px 0;}
331 .icon-off{background-position:-384px 0;}
332 .icon-signal{background-position:-408px 0;}
332 .icon-signal{background-position:-408px 0;}
333 .icon-cog{background-position:-432px 0;}
333 .icon-cog{background-position:-432px 0;}
334 .icon-trash{background-position:-456px 0;}
334 .icon-trash{background-position:-456px 0;}
335 .icon-home{background-position:0 -24px;}
335 .icon-home{background-position:0 -24px;}
336 .icon-file{background-position:-24px -24px;}
336 .icon-file{background-position:-24px -24px;}
337 .icon-time{background-position:-48px -24px;}
337 .icon-time{background-position:-48px -24px;}
338 .icon-road{background-position:-72px -24px;}
338 .icon-road{background-position:-72px -24px;}
339 .icon-download-alt{background-position:-96px -24px;}
339 .icon-download-alt{background-position:-96px -24px;}
340 .icon-download{background-position:-120px -24px;}
340 .icon-download{background-position:-120px -24px;}
341 .icon-upload{background-position:-144px -24px;}
341 .icon-upload{background-position:-144px -24px;}
342 .icon-inbox{background-position:-168px -24px;}
342 .icon-inbox{background-position:-168px -24px;}
343 .icon-play-circle{background-position:-192px -24px;}
343 .icon-play-circle{background-position:-192px -24px;}
344 .icon-repeat{background-position:-216px -24px;}
344 .icon-repeat{background-position:-216px -24px;}
345 .icon-refresh{background-position:-240px -24px;}
345 .icon-refresh{background-position:-240px -24px;}
346 .icon-list-alt{background-position:-264px -24px;}
346 .icon-list-alt{background-position:-264px -24px;}
347 .icon-lock{background-position:-287px -24px;}
347 .icon-lock{background-position:-287px -24px;}
348 .icon-flag{background-position:-312px -24px;}
348 .icon-flag{background-position:-312px -24px;}
349 .icon-headphones{background-position:-336px -24px;}
349 .icon-headphones{background-position:-336px -24px;}
350 .icon-volume-off{background-position:-360px -24px;}
350 .icon-volume-off{background-position:-360px -24px;}
351 .icon-volume-down{background-position:-384px -24px;}
351 .icon-volume-down{background-position:-384px -24px;}
352 .icon-volume-up{background-position:-408px -24px;}
352 .icon-volume-up{background-position:-408px -24px;}
353 .icon-qrcode{background-position:-432px -24px;}
353 .icon-qrcode{background-position:-432px -24px;}
354 .icon-barcode{background-position:-456px -24px;}
354 .icon-barcode{background-position:-456px -24px;}
355 .icon-tag{background-position:0 -48px;}
355 .icon-tag{background-position:0 -48px;}
356 .icon-tags{background-position:-25px -48px;}
356 .icon-tags{background-position:-25px -48px;}
357 .icon-book{background-position:-48px -48px;}
357 .icon-book{background-position:-48px -48px;}
358 .icon-bookmark{background-position:-72px -48px;}
358 .icon-bookmark{background-position:-72px -48px;}
359 .icon-print{background-position:-96px -48px;}
359 .icon-print{background-position:-96px -48px;}
360 .icon-camera{background-position:-120px -48px;}
360 .icon-camera{background-position:-120px -48px;}
361 .icon-font{background-position:-144px -48px;}
361 .icon-font{background-position:-144px -48px;}
362 .icon-bold{background-position:-167px -48px;}
362 .icon-bold{background-position:-167px -48px;}
363 .icon-italic{background-position:-192px -48px;}
363 .icon-italic{background-position:-192px -48px;}
364 .icon-text-height{background-position:-216px -48px;}
364 .icon-text-height{background-position:-216px -48px;}
365 .icon-text-width{background-position:-240px -48px;}
365 .icon-text-width{background-position:-240px -48px;}
366 .icon-align-left{background-position:-264px -48px;}
366 .icon-align-left{background-position:-264px -48px;}
367 .icon-align-center{background-position:-288px -48px;}
367 .icon-align-center{background-position:-288px -48px;}
368 .icon-align-right{background-position:-312px -48px;}
368 .icon-align-right{background-position:-312px -48px;}
369 .icon-align-justify{background-position:-336px -48px;}
369 .icon-align-justify{background-position:-336px -48px;}
370 .icon-list{background-position:-360px -48px;}
370 .icon-list{background-position:-360px -48px;}
371 .icon-indent-left{background-position:-384px -48px;}
371 .icon-indent-left{background-position:-384px -48px;}
372 .icon-indent-right{background-position:-408px -48px;}
372 .icon-indent-right{background-position:-408px -48px;}
373 .icon-facetime-video{background-position:-432px -48px;}
373 .icon-facetime-video{background-position:-432px -48px;}
374 .icon-picture{background-position:-456px -48px;}
374 .icon-picture{background-position:-456px -48px;}
375 .icon-pencil{background-position:0 -72px;}
375 .icon-pencil{background-position:0 -72px;}
376 .icon-map-marker{background-position:-24px -72px;}
376 .icon-map-marker{background-position:-24px -72px;}
377 .icon-adjust{background-position:-48px -72px;}
377 .icon-adjust{background-position:-48px -72px;}
378 .icon-tint{background-position:-72px -72px;}
378 .icon-tint{background-position:-72px -72px;}
379 .icon-edit{background-position:-96px -72px;}
379 .icon-edit{background-position:-96px -72px;}
380 .icon-share{background-position:-120px -72px;}
380 .icon-share{background-position:-120px -72px;}
381 .icon-check{background-position:-144px -72px;}
381 .icon-check{background-position:-144px -72px;}
382 .icon-move{background-position:-168px -72px;}
382 .icon-move{background-position:-168px -72px;}
383 .icon-step-backward{background-position:-192px -72px;}
383 .icon-step-backward{background-position:-192px -72px;}
384 .icon-fast-backward{background-position:-216px -72px;}
384 .icon-fast-backward{background-position:-216px -72px;}
385 .icon-backward{background-position:-240px -72px;}
385 .icon-backward{background-position:-240px -72px;}
386 .icon-play{background-position:-264px -72px;}
386 .icon-play{background-position:-264px -72px;}
387 .icon-pause{background-position:-288px -72px;}
387 .icon-pause{background-position:-288px -72px;}
388 .icon-stop{background-position:-312px -72px;}
388 .icon-stop{background-position:-312px -72px;}
389 .icon-forward{background-position:-336px -72px;}
389 .icon-forward{background-position:-336px -72px;}
390 .icon-fast-forward{background-position:-360px -72px;}
390 .icon-fast-forward{background-position:-360px -72px;}
391 .icon-step-forward{background-position:-384px -72px;}
391 .icon-step-forward{background-position:-384px -72px;}
392 .icon-eject{background-position:-408px -72px;}
392 .icon-eject{background-position:-408px -72px;}
393 .icon-chevron-left{background-position:-432px -72px;}
393 .icon-chevron-left{background-position:-432px -72px;}
394 .icon-chevron-right{background-position:-456px -72px;}
394 .icon-chevron-right{background-position:-456px -72px;}
395 .icon-plus-sign{background-position:0 -96px;}
395 .icon-plus-sign{background-position:0 -96px;}
396 .icon-minus-sign{background-position:-24px -96px;}
396 .icon-minus-sign{background-position:-24px -96px;}
397 .icon-remove-sign{background-position:-48px -96px;}
397 .icon-remove-sign{background-position:-48px -96px;}
398 .icon-ok-sign{background-position:-72px -96px;}
398 .icon-ok-sign{background-position:-72px -96px;}
399 .icon-question-sign{background-position:-96px -96px;}
399 .icon-question-sign{background-position:-96px -96px;}
400 .icon-info-sign{background-position:-120px -96px;}
400 .icon-info-sign{background-position:-120px -96px;}
401 .icon-screenshot{background-position:-144px -96px;}
401 .icon-screenshot{background-position:-144px -96px;}
402 .icon-remove-circle{background-position:-168px -96px;}
402 .icon-remove-circle{background-position:-168px -96px;}
403 .icon-ok-circle{background-position:-192px -96px;}
403 .icon-ok-circle{background-position:-192px -96px;}
404 .icon-ban-circle{background-position:-216px -96px;}
404 .icon-ban-circle{background-position:-216px -96px;}
405 .icon-arrow-left{background-position:-240px -96px;}
405 .icon-arrow-left{background-position:-240px -96px;}
406 .icon-arrow-right{background-position:-264px -96px;}
406 .icon-arrow-right{background-position:-264px -96px;}
407 .icon-arrow-up{background-position:-289px -96px;}
407 .icon-arrow-up{background-position:-289px -96px;}
408 .icon-arrow-down{background-position:-312px -96px;}
408 .icon-arrow-down{background-position:-312px -96px;}
409 .icon-share-alt{background-position:-336px -96px;}
409 .icon-share-alt{background-position:-336px -96px;}
410 .icon-resize-full{background-position:-360px -96px;}
410 .icon-resize-full{background-position:-360px -96px;}
411 .icon-resize-small{background-position:-384px -96px;}
411 .icon-resize-small{background-position:-384px -96px;}
412 .icon-plus{background-position:-408px -96px;}
412 .icon-plus{background-position:-408px -96px;}
413 .icon-minus{background-position:-433px -96px;}
413 .icon-minus{background-position:-433px -96px;}
414 .icon-asterisk{background-position:-456px -96px;}
414 .icon-asterisk{background-position:-456px -96px;}
415 .icon-exclamation-sign{background-position:0 -120px;}
415 .icon-exclamation-sign{background-position:0 -120px;}
416 .icon-gift{background-position:-24px -120px;}
416 .icon-gift{background-position:-24px -120px;}
417 .icon-leaf{background-position:-48px -120px;}
417 .icon-leaf{background-position:-48px -120px;}
418 .icon-fire{background-position:-72px -120px;}
418 .icon-fire{background-position:-72px -120px;}
419 .icon-eye-open{background-position:-96px -120px;}
419 .icon-eye-open{background-position:-96px -120px;}
420 .icon-eye-close{background-position:-120px -120px;}
420 .icon-eye-close{background-position:-120px -120px;}
421 .icon-warning-sign{background-position:-144px -120px;}
421 .icon-warning-sign{background-position:-144px -120px;}
422 .icon-plane{background-position:-168px -120px;}
422 .icon-plane{background-position:-168px -120px;}
423 .icon-calendar{background-position:-192px -120px;}
423 .icon-calendar{background-position:-192px -120px;}
424 .icon-random{background-position:-216px -120px;width:16px;}
424 .icon-random{background-position:-216px -120px;width:16px;}
425 .icon-comment{background-position:-240px -120px;}
425 .icon-comment{background-position:-240px -120px;}
426 .icon-magnet{background-position:-264px -120px;}
426 .icon-magnet{background-position:-264px -120px;}
427 .icon-chevron-up{background-position:-288px -120px;}
427 .icon-chevron-up{background-position:-288px -120px;}
428 .icon-chevron-down{background-position:-313px -119px;}
428 .icon-chevron-down{background-position:-313px -119px;}
429 .icon-retweet{background-position:-336px -120px;}
429 .icon-retweet{background-position:-336px -120px;}
430 .icon-shopping-cart{background-position:-360px -120px;}
430 .icon-shopping-cart{background-position:-360px -120px;}
431 .icon-folder-close{background-position:-384px -120px;width:16px;}
431 .icon-folder-close{background-position:-384px -120px;width:16px;}
432 .icon-folder-open{background-position:-408px -120px;width:16px;}
432 .icon-folder-open{background-position:-408px -120px;width:16px;}
433 .icon-resize-vertical{background-position:-432px -119px;}
433 .icon-resize-vertical{background-position:-432px -119px;}
434 .icon-resize-horizontal{background-position:-456px -118px;}
434 .icon-resize-horizontal{background-position:-456px -118px;}
435 .icon-hdd{background-position:0 -144px;}
435 .icon-hdd{background-position:0 -144px;}
436 .icon-bullhorn{background-position:-24px -144px;}
436 .icon-bullhorn{background-position:-24px -144px;}
437 .icon-bell{background-position:-48px -144px;}
437 .icon-bell{background-position:-48px -144px;}
438 .icon-certificate{background-position:-72px -144px;}
438 .icon-certificate{background-position:-72px -144px;}
439 .icon-thumbs-up{background-position:-96px -144px;}
439 .icon-thumbs-up{background-position:-96px -144px;}
440 .icon-thumbs-down{background-position:-120px -144px;}
440 .icon-thumbs-down{background-position:-120px -144px;}
441 .icon-hand-right{background-position:-144px -144px;}
441 .icon-hand-right{background-position:-144px -144px;}
442 .icon-hand-left{background-position:-168px -144px;}
442 .icon-hand-left{background-position:-168px -144px;}
443 .icon-hand-up{background-position:-192px -144px;}
443 .icon-hand-up{background-position:-192px -144px;}
444 .icon-hand-down{background-position:-216px -144px;}
444 .icon-hand-down{background-position:-216px -144px;}
445 .icon-circle-arrow-right{background-position:-240px -144px;}
445 .icon-circle-arrow-right{background-position:-240px -144px;}
446 .icon-circle-arrow-left{background-position:-264px -144px;}
446 .icon-circle-arrow-left{background-position:-264px -144px;}
447 .icon-circle-arrow-up{background-position:-288px -144px;}
447 .icon-circle-arrow-up{background-position:-288px -144px;}
448 .icon-circle-arrow-down{background-position:-312px -144px;}
448 .icon-circle-arrow-down{background-position:-312px -144px;}
449 .icon-globe{background-position:-336px -144px;}
449 .icon-globe{background-position:-336px -144px;}
450 .icon-wrench{background-position:-360px -144px;}
450 .icon-wrench{background-position:-360px -144px;}
451 .icon-tasks{background-position:-384px -144px;}
451 .icon-tasks{background-position:-384px -144px;}
452 .icon-filter{background-position:-408px -144px;}
452 .icon-filter{background-position:-408px -144px;}
453 .icon-briefcase{background-position:-432px -144px;}
453 .icon-briefcase{background-position:-432px -144px;}
454 .icon-fullscreen{background-position:-456px -144px;}
454 .icon-fullscreen{background-position:-456px -144px;}
455 .dropup,.dropdown{position:relative;}
455 .dropup,.dropdown{position:relative;}
456 .dropdown-toggle{*margin-bottom:-3px;}
456 .dropdown-toggle{*margin-bottom:-3px;}
457 .dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
457 .dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
458 .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
458 .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
459 .dropdown .caret{margin-top:8px;margin-left:2px;}
459 .dropdown .caret{margin-top:8px;margin-left:2px;}
460 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;}
460 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;}
461 .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
461 .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
462 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
462 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
463 .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
463 .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
464 .dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
464 .dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
465 .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;}
465 .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;}
466 .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;}
466 .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;}
467 .open{*z-index:1000;}.open>.dropdown-menu{display:block;}
467 .open{*z-index:1000;}.open>.dropdown-menu{display:block;}
468 .pull-right>.dropdown-menu{right:0;left:auto;}
468 .pull-right>.dropdown-menu{right:0;left:auto;}
469 .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";}
469 .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";}
470 .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
470 .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
471 .dropdown-submenu{position:relative;}
471 .dropdown-submenu{position:relative;}
472 .dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
472 .dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
473 .dropdown-submenu:hover>.dropdown-menu{display:block;}
473 .dropdown-submenu:hover>.dropdown-menu{display:block;}
474 .dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;}
474 .dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;}
475 .dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
475 .dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
476 .dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
476 .dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
477 .dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
477 .dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
478 .dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
478 .dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
479 .typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
479 .typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
480 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
480 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
481 .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
481 .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
482 .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
482 .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
483 .fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
483 .fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
484 .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
484 .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
485 .close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
485 .close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
486 button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
486 button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
487 .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
487 .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
488 .btn:active,.btn.active{background-color:#cccccc \9;}
488 .btn:active,.btn.active{background-color:#cccccc \9;}
489 .btn:first-child{*margin-left:0;}
489 .btn:first-child{*margin-left:0;}
490 .btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
490 .btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
491 .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
491 .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
492 .btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
492 .btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
493 .btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
493 .btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
494 .btn-large{padding:11px 19px;font-size:16.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
494 .btn-large{padding:11px 19px;font-size:16.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
495 .btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;}
495 .btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;}
496 .btn-small{padding:2px 10px;font-size:11.049999999999999px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
496 .btn-small{padding:2px 10px;font-size:11.049999999999999px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
497 .btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;}
497 .btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;}
498 .btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;}
498 .btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;}
499 .btn-mini{padding:0 6px;font-size:9.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
499 .btn-mini{padding:0 6px;font-size:9.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
500 .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
500 .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
501 .btn-block+.btn-block{margin-top:5px;}
501 .btn-block+.btn-block{margin-top:5px;}
502 input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;}
502 input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;}
503 .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
503 .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
504 .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}
504 .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}
505 .btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
505 .btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
506 .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
506 .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
507 .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
507 .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
508 .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
508 .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
509 .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
509 .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
510 .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
510 .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
511 .btn-success:active,.btn-success.active{background-color:#408140 \9;}
511 .btn-success:active,.btn-success.active{background-color:#408140 \9;}
512 .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
512 .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
513 .btn-info:active,.btn-info.active{background-color:#24748c \9;}
513 .btn-info:active,.btn-info.active{background-color:#24748c \9;}
514 .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
514 .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
515 .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
515 .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
516 button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
516 button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
517 button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
517 button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
518 button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
518 button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
519 button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
519 button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
520 .btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
520 .btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
521 .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
521 .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
522 .btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;}
522 .btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;}
523 .btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;}
523 .btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;}
524 .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
524 .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
525 .btn-group+.btn-group{margin-left:5px;}
525 .btn-group+.btn-group{margin-left:5px;}
526 .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;}
526 .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;}
527 .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
527 .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
528 .btn-group>.btn+.btn{margin-left:-1px;}
528 .btn-group>.btn+.btn{margin-left:-1px;}
529 .btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:13px;}
529 .btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:13px;}
530 .btn-group>.btn-mini{font-size:9.75px;}
530 .btn-group>.btn-mini{font-size:9.75px;}
531 .btn-group>.btn-small{font-size:11.049999999999999px;}
531 .btn-group>.btn-small{font-size:11.049999999999999px;}
532 .btn-group>.btn-large{font-size:16.25px;}
532 .btn-group>.btn-large{font-size:16.25px;}
533 .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
533 .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
534 .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
534 .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
535 .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
535 .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
536 .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
536 .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
537 .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
537 .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
538 .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
538 .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
539 .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
539 .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
540 .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
540 .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
541 .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
541 .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
542 .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
542 .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
543 .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
543 .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
544 .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
544 .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
545 .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;}
545 .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;}
546 .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
546 .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
547 .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
547 .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
548 .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
548 .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
549 .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
549 .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
550 .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
550 .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
551 .btn .caret{margin-top:8px;margin-left:0;}
551 .btn .caret{margin-top:8px;margin-left:0;}
552 .btn-large .caret{margin-top:6px;}
552 .btn-large .caret{margin-top:6px;}
553 .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
553 .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
554 .btn-mini .caret,.btn-small .caret{margin-top:8px;}
554 .btn-mini .caret,.btn-small .caret{margin-top:8px;}
555 .dropup .btn-large .caret{border-bottom-width:5px;}
555 .dropup .btn-large .caret{border-bottom-width:5px;}
556 .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
556 .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
557 .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
557 .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
558 .btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
558 .btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
559 .btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;}
559 .btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;}
560 .btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
560 .btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
561 .btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
561 .btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
562 .btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
562 .btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
563 .btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
563 .btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
564 .alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
564 .alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
565 .alert,.alert h4{color:#c09853;}
565 .alert,.alert h4{color:#c09853;}
566 .alert h4{margin:0;}
566 .alert h4{margin:0;}
567 .alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
567 .alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
568 .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
568 .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
569 .alert-success h4{color:#468847;}
569 .alert-success h4{color:#468847;}
570 .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
570 .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
571 .alert-danger h4,.alert-error h4{color:#b94a48;}
571 .alert-danger h4,.alert-error h4{color:#b94a48;}
572 .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
572 .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
573 .alert-info h4{color:#3a87ad;}
573 .alert-info h4{color:#3a87ad;}
574 .alert-block{padding-top:14px;padding-bottom:14px;}
574 .alert-block{padding-top:14px;padding-bottom:14px;}
575 .alert-block>p,.alert-block>ul{margin-bottom:0;}
575 .alert-block>p,.alert-block>ul{margin-bottom:0;}
576 .alert-block p+p{margin-top:5px;}
576 .alert-block p+p{margin-top:5px;}
577 .nav{margin-left:0;margin-bottom:20px;list-style:none;}
577 .nav{margin-left:0;margin-bottom:20px;list-style:none;}
578 .nav>li>a{display:block;}
578 .nav>li>a{display:block;}
579 .nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;}
579 .nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;}
580 .nav>li>a>img{max-width:none;}
580 .nav>li>a>img{max-width:none;}
581 .nav>.pull-right{float:right;}
581 .nav>.pull-right{float:right;}
582 .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
582 .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
583 .nav li+.nav-header{margin-top:9px;}
583 .nav li+.nav-header{margin-top:9px;}
584 .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
584 .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
585 .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
585 .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
586 .nav-list>li>a{padding:3px 15px;}
586 .nav-list>li>a{padding:3px 15px;}
587 .nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
587 .nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
588 .nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;}
588 .nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;}
589 .nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
589 .nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
590 .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
590 .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
591 .nav-tabs:after,.nav-pills:after{clear:both;}
591 .nav-tabs:after,.nav-pills:after{clear:both;}
592 .nav-tabs>li,.nav-pills>li{float:left;}
592 .nav-tabs>li,.nav-pills>li{float:left;}
593 .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
593 .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
594 .nav-tabs{border-bottom:1px solid #ddd;}
594 .nav-tabs{border-bottom:1px solid #ddd;}
595 .nav-tabs>li{margin-bottom:-1px;}
595 .nav-tabs>li{margin-bottom:-1px;}
596 .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;}
596 .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;}
597 .nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
597 .nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
598 .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
598 .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
599 .nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#0088cc;}
599 .nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#0088cc;}
600 .nav-stacked>li{float:none;}
600 .nav-stacked>li{float:none;}
601 .nav-stacked>li>a{margin-right:0;}
601 .nav-stacked>li>a{margin-right:0;}
602 .nav-tabs.nav-stacked{border-bottom:0;}
602 .nav-tabs.nav-stacked{border-bottom:0;}
603 .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
603 .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
604 .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
604 .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
605 .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
605 .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
606 .nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;}
606 .nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;}
607 .nav-pills.nav-stacked>li>a{margin-bottom:3px;}
607 .nav-pills.nav-stacked>li>a{margin-bottom:3px;}
608 .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
608 .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
609 .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
609 .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
610 .nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
610 .nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
611 .nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;}
611 .nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;}
612 .nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580;}
612 .nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580;}
613 .nav-tabs .dropdown-toggle .caret{margin-top:8px;}
613 .nav-tabs .dropdown-toggle .caret{margin-top:8px;}
614 .nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
614 .nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
615 .nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
615 .nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
616 .nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;}
616 .nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;}
617 .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;}
617 .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;}
618 .nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
618 .nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
619 .tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;}
619 .tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;}
620 .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
620 .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
621 .tabbable:after{clear:both;}
621 .tabbable:after{clear:both;}
622 .tab-content{overflow:auto;}
622 .tab-content{overflow:auto;}
623 .tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
623 .tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
624 .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
624 .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
625 .tab-content>.active,.pill-content>.active{display:block;}
625 .tab-content>.active,.pill-content>.active{display:block;}
626 .tabs-below>.nav-tabs{border-top:1px solid #ddd;}
626 .tabs-below>.nav-tabs{border-top:1px solid #ddd;}
627 .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
627 .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
628 .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;}
628 .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;}
629 .tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;}
629 .tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;}
630 .tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
630 .tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
631 .tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
631 .tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
632 .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
632 .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
633 .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
633 .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
634 .tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
634 .tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
635 .tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
635 .tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
636 .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
636 .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
637 .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
637 .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
638 .tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
638 .tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
639 .tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
639 .tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
640 .nav>.disabled>a{color:#999999;}
640 .nav>.disabled>a{color:#999999;}
641 .nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;}
641 .nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;}
642 .navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;}
642 .navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;}
643 .navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;}
643 .navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;}
644 .navbar-inner:after{clear:both;}
644 .navbar-inner:after{clear:both;}
645 .navbar .container{width:auto;}
645 .navbar .container{width:auto;}
646 .nav-collapse.collapse{height:auto;overflow:visible;}
646 .nav-collapse.collapse{height:auto;overflow:visible;}
647 .navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;}
647 .navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;}
648 .navbar-text{margin-bottom:0;line-height:40px;color:#777777;}
648 .navbar-text{margin-bottom:0;line-height:40px;color:#777777;}
649 .navbar-link{color:#777777;}.navbar-link:hover,.navbar-link:focus{color:#333333;}
649 .navbar-link{color:#777777;}.navbar-link:hover,.navbar-link:focus{color:#333333;}
650 .navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;}
650 .navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;}
651 .navbar .btn,.navbar .btn-group{margin-top:5px;}
651 .navbar .btn,.navbar .btn-group{margin-top:5px;}
652 .navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;}
652 .navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;}
653 .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
653 .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
654 .navbar-form:after{clear:both;}
654 .navbar-form:after{clear:both;}
655 .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
655 .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
656 .navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
656 .navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
657 .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
657 .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
658 .navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
658 .navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
659 .navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
659 .navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
660 .navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
660 .navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
661 .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
661 .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
662 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;}
662 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;}
663 .navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;}
663 .navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;}
664 .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
664 .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
665 .navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
665 .navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
666 .navbar-fixed-top{top:0;}
666 .navbar-fixed-top{top:0;}
667 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);}
667 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);}
668 .navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);}
668 .navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);}
669 .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
669 .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
670 .navbar .nav.pull-right{float:right;margin-right:0;}
670 .navbar .nav.pull-right{float:right;margin-right:0;}
671 .navbar .nav>li{float:left;}
671 .navbar .nav>li{float:left;}
672 .navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
672 .navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
673 .navbar .nav .dropdown-toggle .caret{margin-top:8px;}
673 .navbar .nav .dropdown-toggle .caret{margin-top:8px;}
674 .navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;}
674 .navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;}
675 .navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
675 .navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
676 .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;}
676 .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;}
677 .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;}
677 .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;}
678 .navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
678 .navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
679 .btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
679 .btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
680 .navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
680 .navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
681 .navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
681 .navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
682 .navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
682 .navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
683 .navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
683 .navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
684 .navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;}
684 .navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;}
685 .navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;}
685 .navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;}
686 .navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;}
686 .navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;}
687 .navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
687 .navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
688 .navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
688 .navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
689 .navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
689 .navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
690 .navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
690 .navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
691 .navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;}
691 .navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;}
692 .navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;}
692 .navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;}
693 .navbar-inverse .brand{color:#999999;}
693 .navbar-inverse .brand{color:#999999;}
694 .navbar-inverse .navbar-text{color:#999999;}
694 .navbar-inverse .navbar-text{color:#999999;}
695 .navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
695 .navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
696 .navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
696 .navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
697 .navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;}
697 .navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;}
698 .navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
698 .navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
699 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
699 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
700 .navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
700 .navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
701 .navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
701 .navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
702 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
702 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
703 .navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
703 .navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
704 .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
704 .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
705 .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
705 .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
706 .navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
706 .navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
707 .navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;}
707 .navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;}
708 .navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
708 .navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
709 .breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;}
709 .breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;}
710 .breadcrumb>.active{color:#999999;}
710 .breadcrumb>.active{color:#999999;}
711 .pagination{margin:20px 0;}
711 .pagination{margin:20px 0;}
712 .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
712 .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
713 .pagination ul>li{display:inline;}
713 .pagination ul>li{display:inline;}
714 .pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
714 .pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
715 .pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;}
715 .pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;}
716 .pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;}
716 .pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;}
717 .pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;}
717 .pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;}
718 .pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
718 .pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
719 .pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
719 .pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
720 .pagination-centered{text-align:center;}
720 .pagination-centered{text-align:center;}
721 .pagination-right{text-align:right;}
721 .pagination-right{text-align:right;}
722 .pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:16.25px;}
722 .pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:16.25px;}
723 .pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
723 .pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
724 .pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
724 .pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
725 .pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;}
725 .pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;}
726 .pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;}
726 .pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;}
727 .pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.049999999999999px;}
727 .pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.049999999999999px;}
728 .pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:9.75px;}
728 .pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:9.75px;}
729 .pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
729 .pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
730 .pager:after{clear:both;}
730 .pager:after{clear:both;}
731 .pager li{display:inline;}
731 .pager li{display:inline;}
732 .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
732 .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
733 .pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;}
733 .pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;}
734 .pager .next>a,.pager .next>span{float:right;}
734 .pager .next>a,.pager .next>span{float:right;}
735 .pager .previous>a,.pager .previous>span{float:left;}
735 .pager .previous>a,.pager .previous>span{float:left;}
736 .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;}
736 .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;}
737 .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
737 .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
738 .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
738 .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
739 .modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
739 .modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
740 .modal.fade.in{top:10%;}
740 .modal.fade.in{top:10%;}
741 .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
741 .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
742 .modal-header h3{margin:0;line-height:30px;}
742 .modal-header h3{margin:0;line-height:30px;}
743 .modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;}
743 .modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;}
744 .modal-form{margin-bottom:0;}
744 .modal-form{margin-bottom:0;}
745 .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
745 .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
746 .modal-footer:after{clear:both;}
746 .modal-footer:after{clear:both;}
747 .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
747 .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
748 .modal-footer .btn-group .btn+.btn{margin-left:-1px;}
748 .modal-footer .btn-group .btn+.btn{margin-left:-1px;}
749 .modal-footer .btn-block+.btn-block{margin-left:0;}
749 .modal-footer .btn-block+.btn-block{margin-left:0;}
750 .tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
750 .tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
751 .tooltip.top{margin-top:-3px;padding:5px 0;}
751 .tooltip.top{margin-top:-3px;padding:5px 0;}
752 .tooltip.right{margin-left:3px;padding:0 5px;}
752 .tooltip.right{margin-left:3px;padding:0 5px;}
753 .tooltip.bottom{margin-top:3px;padding:5px 0;}
753 .tooltip.bottom{margin-top:3px;padding:5px 0;}
754 .tooltip.left{margin-left:-3px;padding:0 5px;}
754 .tooltip.left{margin-left:-3px;padding:0 5px;}
755 .tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
755 .tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
756 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
756 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
757 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
757 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
758 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
758 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
759 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
759 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
760 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
760 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
761 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;}
761 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;}
762 .popover.right{margin-left:10px;}
762 .popover.right{margin-left:10px;}
763 .popover.bottom{margin-top:10px;}
763 .popover.bottom{margin-top:10px;}
764 .popover.left{margin-left:-10px;}
764 .popover.left{margin-left:-10px;}
765 .popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;}
765 .popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;}
766 .popover-content{padding:9px 14px;}
766 .popover-content{padding:9px 14px;}
767 .popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;}
767 .popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;}
768 .popover .arrow{border-width:11px;}
768 .popover .arrow{border-width:11px;}
769 .popover .arrow:after{border-width:10px;content:"";}
769 .popover .arrow:after{border-width:10px;content:"";}
770 .popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;}
770 .popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;}
771 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;}
771 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;}
772 .popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;}
772 .popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;}
773 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;}
773 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;}
774 .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
774 .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
775 .thumbnails:after{clear:both;}
775 .thumbnails:after{clear:both;}
776 .row-fluid .thumbnails{margin-left:0;}
776 .row-fluid .thumbnails{margin-left:0;}
777 .thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
777 .thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
778 .thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
778 .thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
779 a.thumbnail:hover,a.thumbnail:focus{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
779 a.thumbnail:hover,a.thumbnail:focus{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
780 .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
780 .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
781 .thumbnail .caption{padding:9px;color:#555555;}
781 .thumbnail .caption{padding:9px;color:#555555;}
782 .media,.media-body{overflow:hidden;*overflow:visible;zoom:1;}
782 .media,.media-body{overflow:hidden;*overflow:visible;zoom:1;}
783 .media,.media .media{margin-top:15px;}
783 .media,.media .media{margin-top:15px;}
784 .media:first-child{margin-top:0;}
784 .media:first-child{margin-top:0;}
785 .media-object{display:block;}
785 .media-object{display:block;}
786 .media-heading{margin:0 0 5px;}
786 .media-heading{margin:0 0 5px;}
787 .media>.pull-left{margin-right:10px;}
787 .media>.pull-left{margin-right:10px;}
788 .media>.pull-right{margin-left:10px;}
788 .media>.pull-right{margin-left:10px;}
789 .media-list{margin-left:0;list-style:none;}
789 .media-list{margin-left:0;list-style:none;}
790 .label,.badge{display:inline-block;padding:2px 4px;font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
790 .label,.badge{display:inline-block;padding:2px 4px;font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
791 .label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
791 .label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
792 .badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
792 .badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
793 .label:empty,.badge:empty{display:none;}
793 .label:empty,.badge:empty{display:none;}
794 a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;}
794 a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;}
795 .label-important,.badge-important{background-color:#b94a48;}
795 .label-important,.badge-important{background-color:#b94a48;}
796 .label-important[href],.badge-important[href]{background-color:#953b39;}
796 .label-important[href],.badge-important[href]{background-color:#953b39;}
797 .label-warning,.badge-warning{background-color:#f89406;}
797 .label-warning,.badge-warning{background-color:#f89406;}
798 .label-warning[href],.badge-warning[href]{background-color:#c67605;}
798 .label-warning[href],.badge-warning[href]{background-color:#c67605;}
799 .label-success,.badge-success{background-color:#468847;}
799 .label-success,.badge-success{background-color:#468847;}
800 .label-success[href],.badge-success[href]{background-color:#356635;}
800 .label-success[href],.badge-success[href]{background-color:#356635;}
801 .label-info,.badge-info{background-color:#3a87ad;}
801 .label-info,.badge-info{background-color:#3a87ad;}
802 .label-info[href],.badge-info[href]{background-color:#2d6987;}
802 .label-info[href],.badge-info[href]{background-color:#2d6987;}
803 .label-inverse,.badge-inverse{background-color:#333333;}
803 .label-inverse,.badge-inverse{background-color:#333333;}
804 .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
804 .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
805 .btn .label,.btn .badge{position:relative;top:-1px;}
805 .btn .label,.btn .badge{position:relative;top:-1px;}
806 .btn-mini .label,.btn-mini .badge{top:0;}
806 .btn-mini .label,.btn-mini .badge{top:0;}
807 @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
807 @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
808 .progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
808 .progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
809 .progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
809 .progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
810 .progress-striped .bar{background-color:#149bdf;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));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);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);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);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);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
810 .progress-striped .bar{background-color:#149bdf;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));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);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);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);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);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
811 .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
811 .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
812 .progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);}
812 .progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);}
813 .progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;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));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);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);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);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);}
813 .progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;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));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);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);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);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);}
814 .progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);}
814 .progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);}
815 .progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;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));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);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);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);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);}
815 .progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;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));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);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);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);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);}
816 .progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);}
816 .progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);}
817 .progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;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));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);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);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);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);}
817 .progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;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));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);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);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);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);}
818 .progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);}
818 .progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);}
819 .progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;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));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);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);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);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);}
819 .progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;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));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);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);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);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);}
820 .accordion{margin-bottom:20px;}
820 .accordion{margin-bottom:20px;}
821 .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
821 .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
822 .accordion-heading{border-bottom:0;}
822 .accordion-heading{border-bottom:0;}
823 .accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
823 .accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
824 .accordion-toggle{cursor:pointer;}
824 .accordion-toggle{cursor:pointer;}
825 .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
825 .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
826 .carousel{position:relative;margin-bottom:20px;line-height:1;}
826 .carousel{position:relative;margin-bottom:20px;line-height:1;}
827 .carousel-inner{overflow:hidden;width:100%;position:relative;}
827 .carousel-inner{overflow:hidden;width:100%;position:relative;}
828 .carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;}
828 .carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;}
829 .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;}
829 .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;}
830 .carousel-inner>.active{left:0;}
830 .carousel-inner>.active{left:0;}
831 .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;}
831 .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;}
832 .carousel-inner>.next{left:100%;}
832 .carousel-inner>.next{left:100%;}
833 .carousel-inner>.prev{left:-100%;}
833 .carousel-inner>.prev{left:-100%;}
834 .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;}
834 .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;}
835 .carousel-inner>.active.left{left:-100%;}
835 .carousel-inner>.active.left{left:-100%;}
836 .carousel-inner>.active.right{left:100%;}
836 .carousel-inner>.active.right{left:100%;}
837 .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
837 .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
838 .carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
838 .carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
839 .carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;}
839 .carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;}
840 .carousel-indicators .active{background-color:#fff;}
840 .carousel-indicators .active{background-color:#fff;}
841 .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
841 .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
842 .carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
842 .carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
843 .carousel-caption h4{margin:0 0 5px;}
843 .carousel-caption h4{margin:0 0 5px;}
844 .carousel-caption p{margin-bottom:0;}
844 .carousel-caption p{margin-bottom:0;}
845 .hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
845 .hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
846 .hero-unit li{line-height:30px;}
846 .hero-unit li{line-height:30px;}
847 .pull-right{float:right;}
847 .pull-right{float:right;}
848 .pull-left{float:left;}
848 .pull-left{float:left;}
849 .hide{display:none;}
849 .hide{display:none;}
850 .show{display:block;}
850 .show{display:block;}
851 .invisible{visibility:hidden;}
851 .invisible{visibility:hidden;}
852 .affix{position:fixed;}
852 .affix{position:fixed;}
853 .corner-all{border-radius:4px;}
853 .corner-all{border-radius:4px;}
854 .hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
854 .hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
855 .hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
855 .hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
856 .vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
856 .vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
857 .vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
857 .vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
858 .reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;}
858 .reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;}
859 .box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
859 .box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
860 .box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
860 .box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
861 .box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
861 .box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
862 .box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;}
862 .box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;}
863 .box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1;}
863 .box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1;}
864 .box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2;}
864 .box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2;}
865 .start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;}
865 .start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;}
866 .end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;}
866 .end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;}
867 .center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;}
867 .center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;}
868 .corner-all{border-radius:4px;}
868 .corner-all{border-radius:4px;}
869 pre code{display:block;padding:0.5em;}
870 .highlight-base,pre code,pre .subst,pre .tag .title,pre .lisp .title,pre .clojure .built_in,pre .nginx .title{color:black;}
871 .highlight-string,pre .string,pre .constant,pre .parent,pre .tag .value,pre .rules .value,pre .rules .value .number,pre .preprocessor,pre .ruby .symbol,pre .ruby .symbol .string,pre .aggregate,pre .template_tag,pre .django .variable,pre .smalltalk .class,pre .addition,pre .flow,pre .stream,pre .bash .variable,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .tex .special,pre .erlang_repl .function_or_atom,pre .markdown .header{color:#BA2121;}
872 .highlight-comment,pre .comment,pre .annotation,pre .template_comment,pre .diff .header,pre .chunk,pre .markdown .blockquote{color:#408080;font-style:italic;}
873 .highlight-number,pre .number,pre .date,pre .regexp,pre .literal,pre .smalltalk .symbol,pre .smalltalk .char,pre .go .constant,pre .change,pre .markdown .bullet,pre .markdown .link_url{color:#080;}
874 pre .label,pre .javadoc,pre .ruby .string,pre .decorator,pre .filter .argument,pre .localvars,pre .array,pre .attr_selector,pre .important,pre .pseudo,pre .pi,pre .doctype,pre .deletion,pre .envvar,pre .shebang,pre .apache .sqbracket,pre .nginx .built_in,pre .tex .formula,pre .erlang_repl .reserved,pre .prompt,pre .markdown .link_label,pre .vhdl .attribute,pre .clojure .attribute,pre .coffeescript .property{color:#8888ff;}
875 .highlight-keyword,pre .keyword,pre .id,pre .phpdoc,pre .aggregate,pre .css .tag,pre .javadoctag,pre .phpdoc,pre .yardoctag,pre .smalltalk .class,pre .winutils,pre .bash .variable,pre .apache .tag,pre .go .typename,pre .tex .command,pre .markdown .strong,pre .request,pre .status{color:#008000;font-weight:bold;}
876 .highlight-builtin,pre .built_in{color:#008000;}
877 pre .markdown .emphasis{font-style:italic;}
878 pre .nginx .built_in{font-weight:normal;}
879 pre .coffeescript .javascript,pre .javascript .xml,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:0.5;}
880 .cm-s-ipython span.cm-variable{color:black;}
881 .cm-s-ipython span.cm-keyword{color:#008000;font-weight:bold;}
882 .cm-s-ipython span.cm-number{color:#080;}
883 .cm-s-ipython span.cm-comment{color:#408080;font-style:italic;}
884 .cm-s-ipython span.cm-string{color:#BA2121;}
885 .cm-s-ipython span.cm-builtin{color:#008000;}
886 .cm-s-ipython span.cm-error{color:#f00;}
887 .cm-s-ipython span.cm-operator{color:#AA22FF;font-weight:bold;}
888 .cm-s-ipython span.cm-meta{color:#AA22FF;}
869 body{background-color:#ffffff;}
889 body{background-color:#ffffff;}
870 body.notebook_app{overflow:hidden;}
890 body.notebook_app{overflow:hidden;}
871 blockquote{border-left:4px solid #DDD;padding:0 15px;color:#777;}
891 blockquote{border-left:4px solid #DDD;padding:0 15px;color:#777;}
872 span#save_widget{padding:5px;margin:0px 0px 0px 300px;display:inline-block;}
892 span#save_widget{padding:5px;margin:0px 0px 0px 300px;display:inline-block;}
873 span#checkpoint_status span#autosave_status{font-size:small;}
893 span#checkpoint_status span#autosave_status{font-size:small;}
874 span#notebook_name{height:1em;line-height:1em;padding:3px;border:none;font-size:146.5%;}
894 span#notebook_name{height:1em;line-height:1em;padding:3px;border:none;font-size:146.5%;}
875 .ui-menubar-item .ui-button .ui-button-text{padding:0.4em 1.0em;font-size:100%;}
895 .ui-menubar-item .ui-button .ui-button-text{padding:0.4em 1.0em;font-size:100%;}
876 .ui-menu{-webkit-box-shadow:0px 6px 10px -1px #adadad;-moz-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;}
896 .ui-menu{-webkit-box-shadow:0px 6px 10px -1px #adadad;-moz-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;}
877 .ui-menu .ui-menu-item a{border:1px solid transparent;padding:2px 1.6em;}
897 .ui-menu .ui-menu-item a{border:1px solid transparent;padding:2px 1.6em;}
878 .ui-menu .ui-menu-item a.ui-state-focus{margin:0;}
898 .ui-menu .ui-menu-item a.ui-state-focus{margin:0;}
879 .ui-menu hr{margin:0.3em 0;}
899 .ui-menu hr{margin:0.3em 0;}
880 #menubar_container{position:relative;}
900 #menubar_container{position:relative;}
881 #notification_area{position:absolute;right:0px;top:0px;height:25px;padding:3px 0px;padding-right:3px;z-index:10;}
901 #notification_area{position:absolute;right:0px;top:0px;height:25px;padding:3px 0px;padding-right:3px;z-index:10;}
882 .notification_widget{float:right;right:0px;top:1px;height:25px;padding:3px 6px;z-index:10;}
902 .notification_widget{float:right;right:0px;top:1px;height:25px;padding:3px 6px;z-index:10;}
883 .toolbar{padding:3px 15px;border-bottom:1px #ababab solid;}.toolbar button{margin-top:2px;margin-bottom:2px;}
903 .toolbar{padding:3px 15px;border-bottom:1px #ababab solid;}.toolbar button{margin-top:2px;margin-bottom:2px;}
884 .toolbar select,.toolbar label{height:19px;vertical-align:middle;margin-right:2px;margin-bottom:0;display:inline;font-size:92%;margin-left:0.3em;margin-right:0.3em;padding:0px;}
904 .toolbar select,.toolbar label{height:19px;vertical-align:middle;margin-right:2px;margin-bottom:0;display:inline;font-size:92%;margin-left:0.3em;margin-right:0.3em;padding:0px;}
885 .toolbar select{width:auto;}
905 .toolbar select{width:auto;}
886 #ipython-main-app{width:100%;position:relative;font-size:110%;}
906 #ipython-main-app{width:100%;position:relative;font-size:110%;}
887 span#quick_help_area{position:static;padding:5px 0px;margin:0px 0px 0px 0px;}
907 span#quick_help_area{position:static;padding:5px 0px;margin:0px 0px 0px 0px;}
888 .help_string{float:right;width:170px;padding:0px 5px;text-align:left;font-size:85%;}
908 .help_string{float:right;width:170px;padding:0px 5px;text-align:left;font-size:85%;}
889 .help_string_label{float:right;font-size:85%;}
909 .help_string_label{float:right;font-size:85%;}
890 div#notebook_panel{margin:0px 0px 0px 0px;padding:0px;}
910 div#notebook_panel{margin:0px 0px 0px 0px;padding:0px;}
891 div#notebook{overflow-y:scroll;overflow-x:auto;width:100%;padding:5px 5px 15px 5px;margin:0px;}
911 div#notebook{overflow-y:scroll;overflow-x:auto;width:100%;padding:5px 5px 15px 5px;margin:0px;}
892 div#pager_splitter{height:8px;}
912 div#pager_splitter{height:8px;}
893 #pager_container{position:relative;}
913 #pager_container{position:relative;}
894 div#pager{padding:15px;overflow:auto;display:none;}
914 div#pager{padding:15px;overflow:auto;display:none;}
895 div.ui-widget-content{border:1px solid #ababab;outline:none;}
915 div.ui-widget-content{border:1px solid #ababab;outline:none;}
896 .cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}.cell.selected{border-radius:4px;border:thin #ababab solid;}
916 .cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}.cell.selected{border-radius:4px;border:thin #ababab solid;}
897 div.cell{width:100%;padding:5px 5px 5px 0px;margin:2px 0px 2px 0px;outline:none;}
917 div.cell{width:100%;padding:5px 5px 5px 0px;margin:2px 0px 2px 0px;outline:none;}
898 div.prompt{width:11ex;padding:0.4em;margin:0px;font-family:monospace;text-align:right;line-height:1.231;}
918 div.prompt{width:11ex;padding:0.4em;margin:0px;font-family:monospace;text-align:right;line-height:1.231;}
899 div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
919 div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
900 div.input_area{border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
920 div.input_area{border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
901 div.input_prompt{color:navy;border-top:1px solid transparent;}
921 div.input_prompt{color:navy;border-top:1px solid transparent;}
902 div.output_wrapper{margin-top:5px;margin-left:5px;width:100%;position:relative;}
922 div.output_wrapper{margin-top:5px;margin-left:5px;width:100%;position:relative;}
903 div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:4px;-webkit-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);-moz-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);}
923 div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:4px;-webkit-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);-moz-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);}
904 div.output_collapsed{margin-right:5px;}
924 div.output_collapsed{margin-right:5px;}
905 div.out_prompt_overlay{height:100%;padding:0px;position:absolute;border-radius:4px;}
925 div.out_prompt_overlay{height:100%;padding:0px;position:absolute;border-radius:4px;}
906 div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000000;-moz-box-shadow:inset 0 0 1px #000000;box-shadow:inset 0 0 1px #000000;background:rgba(240, 240, 240, 0.5);}
926 div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000000;-moz-box-shadow:inset 0 0 1px #000000;box-shadow:inset 0 0 1px #000000;background:rgba(240, 240, 240, 0.5);}
907 div.output_prompt{color:darkred;margin:0 5px 0 -5px;}
927 div.output_prompt{color:darkred;margin:0 5px 0 -5px;}
908 div.output_area{padding:0px;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
928 div.output_area{padding:0px;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
909 div.output_area pre{font-family:monospace;margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline;color:black;}
929 div.output_area pre{font-family:monospace;margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline;color:black;}
910 div.output_subarea{padding:0.44em 0.4em 0.4em 1px;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
930 div.output_subarea{padding:0.44em 0.4em 0.4em 1px;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
911 div.output_text{text-align:left;color:#000000;font-family:monospace;line-height:1.231;}
931 div.output_text{text-align:left;color:#000000;font-family:monospace;line-height:1.231;}
912 div.output_stream{padding-top:0.0em;padding-bottom:0.0em;}
932 div.output_stream{padding-top:0.0em;padding-bottom:0.0em;}
913 div.output_stderr{background:#fdd;}
933 div.output_stderr{background:#fdd;}
914 div.output_latex{text-align:left;}
934 div.output_latex{text-align:left;}
915 div.text_cell{padding:5px 5px 5px 5px;}
935 div.text_cell{padding:5px 5px 5px 5px;}
916 div.text_cell_input{color:#000000;border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
936 div.text_cell_input{color:#000000;border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
917 div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:5px;color:#000000;}
937 div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:5px;color:#000000;}
918 .CodeMirror{line-height:1.231;height:auto;background:none;}
938 .CodeMirror{line-height:1.231;height:auto;background:none;}
919 .CodeMirror-scroll{overflow-y:hidden;overflow-x:auto;}
939 .CodeMirror-scroll{overflow-y:hidden;overflow-x:auto;}
920 .CodeMirror-lines{padding:0.4em;}
940 .CodeMirror-lines{padding:0.4em;}
921 .CodeMirror pre{padding:0;}
941 .CodeMirror pre{padding:0;}
922 .ansiblack{color:#000000;}
942 .ansiblack{color:#000000;}
923 .ansired{color:darkred;}
943 .ansired{color:darkred;}
924 .ansigreen{color:darkgreen;}
944 .ansigreen{color:darkgreen;}
925 .ansiyellow{color:brown;}
945 .ansiyellow{color:brown;}
926 .ansiblue{color:darkblue;}
946 .ansiblue{color:darkblue;}
927 .ansipurple{color:darkviolet;}
947 .ansipurple{color:darkviolet;}
928 .ansicyan{color:steelblue;}
948 .ansicyan{color:steelblue;}
929 .ansigrey{color:grey;}
949 .ansigrey{color:grey;}
930 .ansibold{font-weight:bold;}
950 .ansibold{font-weight:bold;}
931 .completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:4px;-webkit-box-shadow:0px 6px 10px -1px #adadad;-moz-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;}
951 .completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:4px;-webkit-box-shadow:0px 6px 10px -1px #adadad;-moz-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;}
932 .completions select{background:white;outline:none;border:none;padding:0px;margin:0px;overflow:auto;font-family:monospace;font-size:110%;color:#000000;}
952 .completions select{background:white;outline:none;border:none;padding:0px;margin:0px;overflow:auto;font-family:monospace;font-size:110%;color:#000000;}
933 .completions select option.context{color:#0064cd;}
953 .completions select option.context{color:#0064cd;}
934 pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:4px;padding:0.4em;padding-left:2em;}
954 pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:4px;padding:0.4em;padding-left:2em;}
935 p.dialog{padding:0.2em;}
955 p.dialog{padding:0.2em;}
936 .shortcut_key{display:inline-block;width:15ex;text-align:right;font-family:monospace;}
956 .shortcut_key{display:inline-block;width:15ex;text-align:right;font-family:monospace;}
937 pre,code,kbd,samp{white-space:pre-wrap;}
957 pre,code,kbd,samp{white-space:pre-wrap;}
938 #fonttest{font-family:monospace;}
958 #fonttest{font-family:monospace;}
939 .js-error{color:darkred;}
959 .js-error{color:darkred;}
940 a{text-decoration:underline;}
960 a{text-decoration:underline;}
941 p{margin-bottom:0;}
961 p{margin-bottom:0;}
942 a.heading-anchor:link,a.heading-anchor:visited{text-decoration:none;color:inherit;}
962 a.heading-anchor:link,a.heading-anchor:visited{text-decoration:none;color:inherit;}
943 div.raw_input{padding-top:0px;padding-bottom:0px;height:1em;line-height:1em;font-family:monospace;}
963 div.raw_input{padding-top:0px;padding-bottom:0px;height:1em;line-height:1em;font-family:monospace;}
944 span.input_prompt{font-family:inherit;}
964 span.input_prompt{font-family:inherit;}
945 input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;margin:-2px 0px 0px 1px;padding-left:1px;padding-top:2px;height:1em;}
965 input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;margin:-2px 0px 0px 1px;padding-left:1px;padding-top:2px;height:1em;}
946 p.p-space{margin-bottom:10px;}
966 p.p-space{margin-bottom:10px;}
947 .rendered_html{color:black;}.rendered_html em{font-style:italic;}
967 .rendered_html{color:black;}.rendered_html em{font-style:italic;}
948 .rendered_html strong{font-weight:bold;}
968 .rendered_html strong{font-weight:bold;}
949 .rendered_html u{text-decoration:underline;}
969 .rendered_html u{text-decoration:underline;}
950 .rendered_html :link{text-decoration:underline;}
970 .rendered_html :link{text-decoration:underline;}
951 .rendered_html :visited{text-decoration:underline;}
971 .rendered_html :visited{text-decoration:underline;}
952 .rendered_html h1{font-size:197%;margin:.65em 0;font-weight:bold;}
972 .rendered_html h1{font-size:197%;margin:.65em 0;font-weight:bold;}
953 .rendered_html h2{font-size:153.9%;margin:.75em 0;font-weight:bold;}
973 .rendered_html h2{font-size:153.9%;margin:.75em 0;font-weight:bold;}
954 .rendered_html h3{font-size:123.1%;margin:.85em 0;font-weight:bold;}
974 .rendered_html h3{font-size:123.1%;margin:.85em 0;font-weight:bold;}
955 .rendered_html h4{font-size:100%;margin:0.95em 0;font-weight:bold;}
975 .rendered_html h4{font-size:100%;margin:0.95em 0;font-weight:bold;}
956 .rendered_html h5{font-size:85%;margin:1.5em 0;font-weight:bold;}
976 .rendered_html h5{font-size:85%;margin:1.5em 0;font-weight:bold;}
957 .rendered_html h6{font-size:77%;margin:1.65em 0;font-weight:bold;}
977 .rendered_html h6{font-size:77%;margin:1.65em 0;font-weight:bold;}
958 .rendered_html ul{list-style:disc;margin:1em 2em;}
978 .rendered_html ul{list-style:disc;margin:1em 2em;}
959 .rendered_html ul ul{list-style:square;margin:0em 2em;}
979 .rendered_html ul ul{list-style:square;margin:0em 2em;}
960 .rendered_html ul ul ul{list-style:circle;margin:0em 2em;}
980 .rendered_html ul ul ul{list-style:circle;margin:0em 2em;}
961 .rendered_html ol{list-style:decimal;margin:1em 2em;}
981 .rendered_html ol{list-style:decimal;margin:1em 2em;}
962 .rendered_html ol ol{list-style:upper-alpha;margin:0em 2em;}
982 .rendered_html ol ol{list-style:upper-alpha;margin:0em 2em;}
963 .rendered_html ol ol ol{list-style:lower-alpha;margin:0em 2em;}
983 .rendered_html ol ol ol{list-style:lower-alpha;margin:0em 2em;}
964 .rendered_html ol ol ol ol{list-style:lower-roman;margin:0em 2em;}
984 .rendered_html ol ol ol ol{list-style:lower-roman;margin:0em 2em;}
965 .rendered_html ol ol ol ol ol{list-style:decimal;margin:0em 2em;}
985 .rendered_html ol ol ol ol ol{list-style:decimal;margin:0em 2em;}
966 .rendered_html hr{color:black;background-color:black;}
986 .rendered_html hr{color:black;background-color:black;}
967 .rendered_html pre{margin:1em 2em;}
987 .rendered_html pre{margin:1em 2em;}
968 .rendered_html blockquote{margin:1em 2em;}
988 .rendered_html blockquote{margin:1em 2em;}
969 .rendered_html table,.rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em;}
989 .rendered_html table,.rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em;}
970 .rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px;}
990 .rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px;}
971 .rendered_html th{font-weight:bold;}
991 .rendered_html th{font-weight:bold;}
972 .rendered_html p{text-align:justify;}
992 .rendered_html p{text-align:justify;}
973 .rendered_html p+p{margin-top:1em;}
993 .rendered_html p+p{margin-top:1em;}
974 .corner-all{border-radius:4px;}
994 .corner-all{border-radius:4px;}
975 @-moz-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-webkit-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-moz-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}@-webkit-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;}
995 @-moz-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-webkit-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-moz-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}@-webkit-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;}
976 .smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px;}
996 .smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px;}
977 .tooltipbuttons{position:absolute;padding-right:15px;top:0px;right:0px;}
997 .tooltipbuttons{position:absolute;padding-right:15px;top:0px;right:0px;}
978 .tooltiptext{padding-right:30px;}
998 .tooltiptext{padding-right:30px;}
979 .ipython_tooltip{max-width:700px;-webkit-animation:fadeOut 400ms;-moz-animation:fadeOut 400ms;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:#ababab 1px solid;outline:none;padding:3px;margin:0px;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0px 6px 10px -1px #adadad;-webkit-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;border-radius:4px;position:absolute;z-index:2;}.ipython_tooltip a{float:right;}
999 .ipython_tooltip{max-width:700px;-webkit-animation:fadeOut 400ms;-moz-animation:fadeOut 400ms;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:#ababab 1px solid;outline:none;padding:3px;margin:0px;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0px 6px 10px -1px #adadad;-webkit-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;border-radius:4px;position:absolute;z-index:2;}.ipython_tooltip a{float:right;}
980 .pretooltiparrow{left:0px;margin:0px;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute;}
1000 .pretooltiparrow{left:0px;margin:0px;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute;}
981 .pretooltiparrow:before{background-color:#f7f7f7;border:1px #ababab solid;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);}
1001 .pretooltiparrow:before{background-color:#f7f7f7;border:1px #ababab solid;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);}
@@ -1,99 +1,115 b''
1 //----------------------------------------------------------------------------
1 //----------------------------------------------------------------------------
2 // Copyright (C) 2011 The IPython Development Team
2 // Copyright (C) 2011 The IPython Development Team
3 //
3 //
4 // Distributed under the terms of the BSD License. The full license is in
4 // Distributed under the terms of the BSD License. The full license is in
5 // the file COPYING, distributed as part of this software.
5 // the file COPYING, distributed as part of this software.
6 //----------------------------------------------------------------------------
6 //----------------------------------------------------------------------------
7
7
8 //============================================================================
8 //============================================================================
9 // On document ready
9 // On document ready
10 //============================================================================
10 //============================================================================
11
11
12
12
13 $(document).ready(function () {
13 $(document).ready(function () {
14
14
15 // monkey patch CM to be able to syntax highlight cell magics
15 // monkey patch CM to be able to syntax highlight cell magics
16 // bug reported upstream,
16 // bug reported upstream,
17 // see https://github.com/marijnh/CodeMirror2/issues/670
17 // see https://github.com/marijnh/CodeMirror2/issues/670
18 if(CodeMirror.getMode(1,'text/plain').indent == undefined ){
18 if(CodeMirror.getMode(1,'text/plain').indent == undefined ){
19 console.log('patching CM for undefined indent');
19 console.log('patching CM for undefined indent');
20 CodeMirror.modes.null = function() { return {token: function(stream) {stream.skipToEnd();},indent : function(){return 0}}}
20 CodeMirror.modes.null = function() { return {token: function(stream) {stream.skipToEnd();},indent : function(){return 0}}}
21 }
21 }
22
22
23 CodeMirror.patchedGetMode = function(config, mode){
23 CodeMirror.patchedGetMode = function(config, mode){
24 var cmmode = CodeMirror.getMode(config, mode);
24 var cmmode = CodeMirror.getMode(config, mode);
25 if(cmmode.indent == null)
25 if(cmmode.indent == null)
26 {
26 {
27 console.log('patch mode "' , mode, '" on the fly');
27 console.log('patch mode "' , mode, '" on the fly');
28 cmmode.indent = function(){return 0};
28 cmmode.indent = function(){return 0};
29 }
29 }
30 return cmmode;
30 return cmmode;
31 }
31 }
32 // end monkey patching CodeMirror
32 // end monkey patching CodeMirror
33
33
34 IPython.mathjaxutils.init();
34 IPython.mathjaxutils.init();
35
35
36 IPython.read_only = $('body').data('readOnly') === 'True';
36 IPython.read_only = $('body').data('readOnly') === 'True';
37 $('#ipython-main-app').addClass('border-box-sizing');
37 $('#ipython-main-app').addClass('border-box-sizing');
38 $('div#notebook_panel').addClass('border-box-sizing');
38 $('div#notebook_panel').addClass('border-box-sizing');
39 // The header's bottom border is provided by the menu bar so we remove it.
39 // The header's bottom border is provided by the menu bar so we remove it.
40 $('div#header').css('border-bottom-style','none');
40 $('div#header').css('border-bottom-style','none');
41
41
42 var baseProjectUrl = $('body').data('baseProjectUrl')
42 var baseProjectUrl = $('body').data('baseProjectUrl')
43
43
44 IPython.page = new IPython.Page();
44 IPython.page = new IPython.Page();
45 IPython.markdown_converter = new Markdown.Converter();
46 IPython.layout_manager = new IPython.LayoutManager();
45 IPython.layout_manager = new IPython.LayoutManager();
47 IPython.pager = new IPython.Pager('div#pager', 'div#pager_splitter');
46 IPython.pager = new IPython.Pager('div#pager', 'div#pager_splitter');
48 IPython.quick_help = new IPython.QuickHelp('span#quick_help_area');
47 IPython.quick_help = new IPython.QuickHelp('span#quick_help_area');
49 IPython.login_widget = new IPython.LoginWidget('span#login_widget',{baseProjectUrl:baseProjectUrl});
48 IPython.login_widget = new IPython.LoginWidget('span#login_widget',{baseProjectUrl:baseProjectUrl});
50 IPython.notebook = new IPython.Notebook('div#notebook',{baseProjectUrl:baseProjectUrl, read_only:IPython.read_only});
49 IPython.notebook = new IPython.Notebook('div#notebook',{baseProjectUrl:baseProjectUrl, read_only:IPython.read_only});
51 IPython.save_widget = new IPython.SaveWidget('span#save_widget');
50 IPython.save_widget = new IPython.SaveWidget('span#save_widget');
52 IPython.menubar = new IPython.MenuBar('#menubar',{baseProjectUrl:baseProjectUrl})
51 IPython.menubar = new IPython.MenuBar('#menubar',{baseProjectUrl:baseProjectUrl})
53 IPython.toolbar = new IPython.MainToolBar('#maintoolbar')
52 IPython.toolbar = new IPython.MainToolBar('#maintoolbar')
54 IPython.tooltip = new IPython.Tooltip()
53 IPython.tooltip = new IPython.Tooltip()
55 IPython.notification_area = new IPython.NotificationArea('#notification_area')
54 IPython.notification_area = new IPython.NotificationArea('#notification_area')
56 IPython.notification_area.init_notification_widgets();
55 IPython.notification_area.init_notification_widgets();
57
56
58 IPython.layout_manager.do_resize();
57 IPython.layout_manager.do_resize();
59
58
60 $('body').append('<div id="fonttest"><pre><span id="test1">x</span>'+
59 $('body').append('<div id="fonttest"><pre><span id="test1">x</span>'+
61 '<span id="test2" style="font-weight: bold;">x</span>'+
60 '<span id="test2" style="font-weight: bold;">x</span>'+
62 '<span id="test3" style="font-style: italic;">x</span></pre></div>')
61 '<span id="test3" style="font-style: italic;">x</span></pre></div>')
63 var nh = $('#test1').innerHeight();
62 var nh = $('#test1').innerHeight();
64 var bh = $('#test2').innerHeight();
63 var bh = $('#test2').innerHeight();
65 var ih = $('#test3').innerHeight();
64 var ih = $('#test3').innerHeight();
66 if(nh != bh || nh != ih) {
65 if(nh != bh || nh != ih) {
67 $('head').append('<style>.CodeMirror span { vertical-align: bottom; }</style>');
66 $('head').append('<style>.CodeMirror span { vertical-align: bottom; }</style>');
68 }
67 }
69 $('#fonttest').remove();
68 $('#fonttest').remove();
70
69
71 if(IPython.read_only){
70 if(IPython.read_only){
72 // hide various elements from read-only view
71 // hide various elements from read-only view
73 $('div#pager').remove();
72 $('div#pager').remove();
74 $('div#pager_splitter').remove();
73 $('div#pager_splitter').remove();
75
74
76 // set the notebook name field as not modifiable
75 // set the notebook name field as not modifiable
77 $('#notebook_name').attr('disabled','disabled')
76 $('#notebook_name').attr('disabled','disabled')
78 }
77 }
79
78
80 IPython.page.show();
79 IPython.page.show();
81
80
82 IPython.layout_manager.do_resize();
81 IPython.layout_manager.do_resize();
83 var first_load = function () {
82 var first_load = function () {
84 IPython.layout_manager.do_resize();
83 IPython.layout_manager.do_resize();
85 var hash = document.location.hash;
84 var hash = document.location.hash;
86 if (hash) {
85 if (hash) {
87 document.location.hash = '';
86 document.location.hash = '';
88 document.location.hash = hash;
87 document.location.hash = hash;
89 }
88 }
90 IPython.notebook.set_autosave_interval(IPython.notebook.minimum_autosave_interval);
89 IPython.notebook.set_autosave_interval(IPython.notebook.minimum_autosave_interval);
91 // only do this once
90 // only do this once
92 $([IPython.events]).off('notebook_loaded.Notebook', first_load);
91 $([IPython.events]).off('notebook_loaded.Notebook', first_load);
93 };
92 };
94
93
95 $([IPython.events]).on('notebook_loaded.Notebook', first_load);
94 $([IPython.events]).on('notebook_loaded.Notebook', first_load);
96 IPython.notebook.load_notebook($('body').data('notebookId'));
95 IPython.notebook.load_notebook($('body').data('notebookId'));
97
96
97 if (marked) {
98 marked.setOptions({
99 gfm : true,
100 tables: true,
101 langPrefix: "language-",
102 highlight: function(code, lang) {
103 var highlighted;
104 try {
105 highlighted = hljs.highlight(lang, code, false);
106 } catch(err) {
107 highlighted = hljs.highlightAuto(code);
108 }
109 return highlighted.value;
110 }
111 })
112 }
113
98 });
114 });
99
115
@@ -1,161 +1,162 b''
1 //----------------------------------------------------------------------------
1 //----------------------------------------------------------------------------
2 // Copyright (C) 2008-2011 The IPython Development Team
2 // Copyright (C) 2008-2011 The IPython Development Team
3 //
3 //
4 // Distributed under the terms of the BSD License. The full license is in
4 // Distributed under the terms of the BSD License. The full license is in
5 // the file COPYING, distributed as part of this software.
5 // the file COPYING, distributed as part of this software.
6 //----------------------------------------------------------------------------
6 //----------------------------------------------------------------------------
7
7
8 //============================================================================
8 //============================================================================
9 // SaveWidget
9 // SaveWidget
10 //============================================================================
10 //============================================================================
11
11
12 var IPython = (function (IPython) {
12 var IPython = (function (IPython) {
13
13
14 var utils = IPython.utils;
14 var utils = IPython.utils;
15
15
16 var SaveWidget = function (selector) {
16 var SaveWidget = function (selector) {
17 this.selector = selector;
17 this.selector = selector;
18 if (this.selector !== undefined) {
18 if (this.selector !== undefined) {
19 this.element = $(selector);
19 this.element = $(selector);
20 this.style();
20 this.style();
21 this.bind_events();
21 this.bind_events();
22 }
22 }
23 };
23 };
24
24
25
25
26 SaveWidget.prototype.style = function () {
26 SaveWidget.prototype.style = function () {
27 this.element.find('span#save_widget').addClass('ui-widget');
27 this.element.find('span#save_widget').addClass('ui-widget');
28 this.element.find('span#notebook_name').addClass('ui-widget');
28 this.element.find('span#notebook_name').addClass('ui-widget');
29 this.element.find('span#autosave_status').addClass('ui-widget')
29 this.element.find('span#autosave_status').addClass('ui-widget')
30 .css({border: 'none'});
30 .css({border: 'none'});
31 this.element.find('span#checkpoint_status').addClass('ui-widget')
31 this.element.find('span#checkpoint_status').addClass('ui-widget')
32 .css({border: 'none', 'margin-left': '20px'});
32 .css({border: 'none', 'margin-left': '20px'});
33 };
33 };
34
34
35
35
36 SaveWidget.prototype.bind_events = function () {
36 SaveWidget.prototype.bind_events = function () {
37 var that = this;
37 var that = this;
38 this.element.find('span#notebook_name').click(function () {
38 this.element.find('span#notebook_name').click(function () {
39 that.rename_notebook();
39 that.rename_notebook();
40 });
40 });
41 this.element.find('span#notebook_name').hover(function () {
41 this.element.find('span#notebook_name').hover(function () {
42 $(this).addClass("ui-state-hover");
42 $(this).addClass("ui-state-hover");
43 }, function () {
43 }, function () {
44 $(this).removeClass("ui-state-hover");
44 $(this).removeClass("ui-state-hover");
45 });
45 });
46 $([IPython.events]).on('notebook_loaded.Notebook', function () {
46 $([IPython.events]).on('notebook_loaded.Notebook', function () {
47 that.set_last_saved();
47 that.set_last_saved();
48 that.update_notebook_name();
48 that.update_notebook_name();
49 that.update_document_title();
49 that.update_document_title();
50 });
50 });
51 $([IPython.events]).on('notebook_saved.Notebook', function () {
51 $([IPython.events]).on('notebook_saved.Notebook', function () {
52 that.set_last_saved();
52 that.set_last_saved();
53 that.update_notebook_name();
53 that.update_notebook_name();
54 that.update_document_title();
54 that.update_document_title();
55 });
55 });
56 $([IPython.events]).on('notebook_save_failed.Notebook', function () {
56 $([IPython.events]).on('notebook_save_failed.Notebook', function () {
57 that.set_save_status('Last Save Failed!');
57 that.set_save_status('Last Save Failed!');
58 });
58 });
59 $([IPython.events]).on('checkpoints_listed.Notebook', function (event, data) {
59 $([IPython.events]).on('checkpoints_listed.Notebook', function (event, data) {
60 that.set_last_checkpoint(data[0]);
60 that.set_last_checkpoint(data[0]);
61 });
61 });
62
62
63 $([IPython.events]).on('checkpoint_created.Notebook', function (event, data) {
63 $([IPython.events]).on('checkpoint_created.Notebook', function (event, data) {
64 that.set_last_checkpoint(data);
64 that.set_last_checkpoint(data);
65 });
65 });
66 };
66 };
67
67
68
68
69 SaveWidget.prototype.rename_notebook = function () {
69 SaveWidget.prototype.rename_notebook = function () {
70 var that = this;
70 var that = this;
71 var dialog = $('<div/>');
71 var dialog = $('<div/>');
72 dialog.append(
72 dialog.append(
73 $('<p/>').html('Enter a new notebook name:')
73 $('<p/>').html('Enter a new notebook name:')
74 .css({'margin-bottom': '10px'})
74 .css({'margin-bottom': '10px'})
75 );
75 );
76 dialog.append(
76 dialog.append(
77 $('<input/>').attr('type','text').attr('size','25')
77 $('<input/>').attr('type','text').attr('size','25')
78 .addClass('ui-widget ui-widget-content')
78 .addClass('ui-widget ui-widget-content')
79 .attr('value',IPython.notebook.get_notebook_name())
79 .attr('value',IPython.notebook.get_notebook_name())
80 );
80 );
81 // $(document).append(dialog);
81 // $(document).append(dialog);
82 dialog.dialog({
82 dialog.dialog({
83 resizable: false,
83 resizable: false,
84 modal: true,
84 modal: true,
85 title: "Rename Notebook",
85 title: "Rename Notebook",
86 closeText: "",
86 closeText: "",
87 close: function(event, ui) {$(this).dialog('destroy').remove();},
87 close: function(event, ui) {$(this).dialog('destroy').remove();},
88 buttons : {
88 buttons : {
89 "OK": function () {
89 "OK": function () {
90 var new_name = $(this).find('input').attr('value');
90 var new_name = $(this).find('input').attr('value');
91 if (!IPython.notebook.test_notebook_name(new_name)) {
91 if (!IPython.notebook.test_notebook_name(new_name)) {
92 $(this).find('h3').html(
92 $(this).find('h3').html(
93 "Invalid notebook name. Notebook names must "+
93 "Invalid notebook name. Notebook names must "+
94 "have 1 or more characters and can contain any characters " +
94 "have 1 or more characters and can contain any characters " +
95 "except :/\\. Please enter a new notebook name:"
95 "except :/\\. Please enter a new notebook name:"
96 );
96 );
97 } else {
97 } else {
98 IPython.notebook.set_notebook_name(new_name);
98 IPython.notebook.set_notebook_name(new_name);
99 IPython.notebook.save_notebook();
99 IPython.notebook.save_notebook();
100 $(this).dialog('close');
100 $(this).dialog('close');
101 }
101 }
102 },
102 },
103 "Cancel": function () {
103 "Cancel": function () {
104 $(this).dialog('close');
104 $(this).dialog('close');
105 }
105 }
106 },
106 },
107 open : function (event, ui) {
107 open : function (event, ui) {
108 var that = $(this);
108 var that = $(this);
109 // Upon ENTER, click the OK button.
109 // Upon ENTER, click the OK button.
110 that.find('input[type="text"]').keydown(function (event, ui) {
110 that.find('input[type="text"]').keydown(function (event, ui) {
111 if (event.which === utils.keycodes.ENTER) {
111 if (event.which === utils.keycodes.ENTER) {
112 that.parent().find('button').first().click();
112 that.parent().find('button').first().click();
113 }
113 }
114 });
114 });
115 }
115 }
116 });
116 });
117 }
117 }
118
118
119
119
120 SaveWidget.prototype.update_notebook_name = function () {
120 SaveWidget.prototype.update_notebook_name = function () {
121 var nbname = IPython.notebook.get_notebook_name();
121 var nbname = IPython.notebook.get_notebook_name();
122 this.element.find('span#notebook_name').html(nbname);
122 this.element.find('span#notebook_name').html(nbname);
123 };
123 };
124
124
125
125
126 SaveWidget.prototype.update_document_title = function () {
126 SaveWidget.prototype.update_document_title = function () {
127 var nbname = IPython.notebook.get_notebook_name();
127 var nbname = IPython.notebook.get_notebook_name();
128 document.title = nbname;
128 document.title = nbname;
129 };
129 };
130
130
131
131
132 SaveWidget.prototype.set_save_status = function (msg) {
132 SaveWidget.prototype.set_save_status = function (msg) {
133 this.element.find('span#autosave_status').html(msg);
133 this.element.find('span#autosave_status').html(msg);
134 }
134 }
135
135
136 SaveWidget.prototype.set_checkpoint_status = function (msg) {
136 SaveWidget.prototype.set_checkpoint_status = function (msg) {
137 this.element.find('span#checkpoint_status').html(msg);
137 this.element.find('span#checkpoint_status').html(msg);
138 }
138 }
139
139
140 SaveWidget.prototype.set_last_checkpoint = function (checkpoint) {
140 SaveWidget.prototype.set_last_checkpoint = function (checkpoint) {
141 if (!checkpoint) {
141 if (!checkpoint) {
142 this.set_checkpoint_status("");
142 this.set_checkpoint_status("");
143 return;
143 }
144 }
144 var d = new Date(checkpoint.last_modified);
145 var d = new Date(checkpoint.last_modified);
145 this.set_checkpoint_status(
146 this.set_checkpoint_status(
146 "Last Checkpoint: " + d.format('mmm dd HH:MM')
147 "Last Checkpoint: " + d.format('mmm dd HH:MM')
147 );
148 );
148 }
149 }
149
150
150 SaveWidget.prototype.set_last_saved = function () {
151 SaveWidget.prototype.set_last_saved = function () {
151 var d = new Date();
152 var d = new Date();
152 this.set_save_status('(autosaved: '+d.format('mmm dd HH:MM') + ')');
153 this.set_save_status('(autosaved: '+d.format('mmm dd HH:MM') + ')');
153 };
154 };
154
155
155
156
156 IPython.SaveWidget = SaveWidget;
157 IPython.SaveWidget = SaveWidget;
157
158
158 return IPython;
159 return IPython;
159
160
160 }(IPython));
161 }(IPython));
161
162
@@ -1,558 +1,546 b''
1 //----------------------------------------------------------------------------
1 //----------------------------------------------------------------------------
2 // Copyright (C) 2008-2012 The IPython Development Team
2 // Copyright (C) 2008-2012 The IPython Development Team
3 //
3 //
4 // Distributed under the terms of the BSD License. The full license is in
4 // Distributed under the terms of the BSD License. The full license is in
5 // the file COPYING, distributed as part of this software.
5 // the file COPYING, distributed as part of this software.
6 //----------------------------------------------------------------------------
6 //----------------------------------------------------------------------------
7
7
8 //============================================================================
8 //============================================================================
9 // TextCell
9 // TextCell
10 //============================================================================
10 //============================================================================
11
11
12
12
13
13
14 /**
14 /**
15 A module that allow to create different type of Text Cell
15 A module that allow to create different type of Text Cell
16 @module IPython
16 @module IPython
17 @namespace IPython
17 @namespace IPython
18 */
18 */
19 var IPython = (function (IPython) {
19 var IPython = (function (IPython) {
20
20
21 // TextCell base class
21 // TextCell base class
22 var key = IPython.utils.keycodes;
22 var key = IPython.utils.keycodes;
23
23
24 /**
24 /**
25 * Construct a new TextCell, codemirror mode is by default 'htmlmixed', and cell type is 'text'
25 * Construct a new TextCell, codemirror mode is by default 'htmlmixed', and cell type is 'text'
26 * cell start as not redered.
26 * cell start as not redered.
27 *
27 *
28 * @class TextCell
28 * @class TextCell
29 * @constructor TextCell
29 * @constructor TextCell
30 * @extend Ipython.Cell
30 * @extend Ipython.Cell
31 * @param {object|undefined} [options]
31 * @param {object|undefined} [options]
32 * @param [options.cm_config] {object} config to pass to CodeMirror, will extend/overwrite default config
32 * @param [options.cm_config] {object} config to pass to CodeMirror, will extend/overwrite default config
33 * @param [options.placeholder] {string} default string to use when souce in empty for rendering (only use in some TextCell subclass)
33 * @param [options.placeholder] {string} default string to use when souce in empty for rendering (only use in some TextCell subclass)
34 */
34 */
35 var TextCell = function (options) {
35 var TextCell = function (options) {
36 // in all TextCell/Cell subclasses
36 // in all TextCell/Cell subclasses
37 // do not assign most of members here, just pass it down
37 // do not assign most of members here, just pass it down
38 // in the options dict potentially overwriting what you wish.
38 // in the options dict potentially overwriting what you wish.
39 // they will be assigned in the base class.
39 // they will be assigned in the base class.
40
40
41 // we cannot put this as a class key as it has handle to "this".
41 // we cannot put this as a class key as it has handle to "this".
42 var cm_overwrite_options = {
42 var cm_overwrite_options = {
43 onKeyEvent: $.proxy(this.handle_codemirror_keyevent,this)
43 onKeyEvent: $.proxy(this.handle_codemirror_keyevent,this)
44 };
44 };
45
45
46 options = this.mergeopt(TextCell,options,{cm_config:cm_overwrite_options});
46 options = this.mergeopt(TextCell,options,{cm_config:cm_overwrite_options});
47
47
48 IPython.Cell.apply(this, [options]);
48 IPython.Cell.apply(this, [options]);
49
49
50
50
51 this.rendered = false;
51 this.rendered = false;
52 this.cell_type = this.cell_type || 'text';
52 this.cell_type = this.cell_type || 'text';
53 };
53 };
54
54
55 TextCell.prototype = new IPython.Cell();
55 TextCell.prototype = new IPython.Cell();
56
56
57 TextCell.options_default = {
57 TextCell.options_default = {
58 cm_config : {
58 cm_config : {
59 extraKeys: {"Tab": "indentMore","Shift-Tab" : "indentLess"},
59 extraKeys: {"Tab": "indentMore","Shift-Tab" : "indentLess"},
60 mode: 'htmlmixed',
60 mode: 'htmlmixed',
61 lineWrapping : true,
61 lineWrapping : true,
62 }
62 }
63 };
63 };
64
64
65
65
66
66
67 /**
67 /**
68 * Create the DOM element of the TextCell
68 * Create the DOM element of the TextCell
69 * @method create_element
69 * @method create_element
70 * @private
70 * @private
71 */
71 */
72 TextCell.prototype.create_element = function () {
72 TextCell.prototype.create_element = function () {
73 IPython.Cell.prototype.create_element.apply(this, arguments);
73 IPython.Cell.prototype.create_element.apply(this, arguments);
74 var cell = $("<div>").addClass('cell text_cell border-box-sizing');
74 var cell = $("<div>").addClass('cell text_cell border-box-sizing');
75 cell.attr('tabindex','2');
75 cell.attr('tabindex','2');
76
76
77 this.celltoolbar = new IPython.CellToolbar(this);
77 this.celltoolbar = new IPython.CellToolbar(this);
78 cell.append(this.celltoolbar.element);
78 cell.append(this.celltoolbar.element);
79
79
80 var input_area = $('<div/>').addClass('text_cell_input border-box-sizing');
80 var input_area = $('<div/>').addClass('text_cell_input border-box-sizing');
81 this.code_mirror = CodeMirror(input_area.get(0), this.cm_config);
81 this.code_mirror = CodeMirror(input_area.get(0), this.cm_config);
82
82
83 // The tabindex=-1 makes this div focusable.
83 // The tabindex=-1 makes this div focusable.
84 var render_area = $('<div/>').addClass('text_cell_render border-box-sizing').
84 var render_area = $('<div/>').addClass('text_cell_render border-box-sizing').
85 addClass('rendered_html').attr('tabindex','-1');
85 addClass('rendered_html').attr('tabindex','-1');
86 cell.append(input_area).append(render_area);
86 cell.append(input_area).append(render_area);
87 this.element = cell;
87 this.element = cell;
88 };
88 };
89
89
90
90
91 /**
91 /**
92 * Bind the DOM evet to cell actions
92 * Bind the DOM evet to cell actions
93 * Need to be called after TextCell.create_element
93 * Need to be called after TextCell.create_element
94 * @private
94 * @private
95 * @method bind_event
95 * @method bind_event
96 */
96 */
97 TextCell.prototype.bind_events = function () {
97 TextCell.prototype.bind_events = function () {
98 IPython.Cell.prototype.bind_events.apply(this);
98 IPython.Cell.prototype.bind_events.apply(this);
99 var that = this;
99 var that = this;
100 this.element.keydown(function (event) {
100 this.element.keydown(function (event) {
101 if (event.which === 13 && !event.shiftKey) {
101 if (event.which === 13 && !event.shiftKey) {
102 if (that.rendered) {
102 if (that.rendered) {
103 that.edit();
103 that.edit();
104 return false;
104 return false;
105 };
105 };
106 };
106 };
107 });
107 });
108 this.element.dblclick(function () {
108 this.element.dblclick(function () {
109 that.edit();
109 that.edit();
110 });
110 });
111 };
111 };
112
112
113 /**
113 /**
114 * This method gets called in CodeMirror's onKeyDown/onKeyPress
114 * This method gets called in CodeMirror's onKeyDown/onKeyPress
115 * handlers and is used to provide custom key handling.
115 * handlers and is used to provide custom key handling.
116 *
116 *
117 * Subclass should override this method to have custom handeling
117 * Subclass should override this method to have custom handeling
118 *
118 *
119 * @method handle_codemirror_keyevent
119 * @method handle_codemirror_keyevent
120 * @param {CodeMirror} editor - The codemirror instance bound to the cell
120 * @param {CodeMirror} editor - The codemirror instance bound to the cell
121 * @param {event} event -
121 * @param {event} event -
122 * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise
122 * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise
123 */
123 */
124 TextCell.prototype.handle_codemirror_keyevent = function (editor, event) {
124 TextCell.prototype.handle_codemirror_keyevent = function (editor, event) {
125
125
126 if (event.keyCode === 13 && (event.shiftKey || event.ctrlKey)) {
126 if (event.keyCode === 13 && (event.shiftKey || event.ctrlKey)) {
127 // Always ignore shift-enter in CodeMirror as we handle it.
127 // Always ignore shift-enter in CodeMirror as we handle it.
128 return true;
128 return true;
129 }
129 }
130 return false;
130 return false;
131 };
131 };
132
132
133 /**
133 /**
134 * Select the current cell and trigger 'focus'
134 * Select the current cell and trigger 'focus'
135 * @method select
135 * @method select
136 */
136 */
137 TextCell.prototype.select = function () {
137 TextCell.prototype.select = function () {
138 IPython.Cell.prototype.select.apply(this);
138 IPython.Cell.prototype.select.apply(this);
139 var output = this.element.find("div.text_cell_render");
139 var output = this.element.find("div.text_cell_render");
140 output.trigger('focus');
140 output.trigger('focus');
141 };
141 };
142
142
143 /**
143 /**
144 * unselect the current cell and `render` it
144 * unselect the current cell and `render` it
145 * @method unselect
145 * @method unselect
146 */
146 */
147 TextCell.prototype.unselect = function() {
147 TextCell.prototype.unselect = function() {
148 // render on selection of another cell
148 // render on selection of another cell
149 this.render();
149 this.render();
150 IPython.Cell.prototype.unselect.apply(this);
150 IPython.Cell.prototype.unselect.apply(this);
151 };
151 };
152
152
153 /**
153 /**
154 *
154 *
155 * put the current cell in edition mode
155 * put the current cell in edition mode
156 * @method edit
156 * @method edit
157 */
157 */
158 TextCell.prototype.edit = function () {
158 TextCell.prototype.edit = function () {
159 if ( this.read_only ) return;
159 if ( this.read_only ) return;
160 if (this.rendered === true) {
160 if (this.rendered === true) {
161 var text_cell = this.element;
161 var text_cell = this.element;
162 var output = text_cell.find("div.text_cell_render");
162 var output = text_cell.find("div.text_cell_render");
163 output.hide();
163 output.hide();
164 text_cell.find('div.text_cell_input').show();
164 text_cell.find('div.text_cell_input').show();
165 this.code_mirror.refresh();
165 this.code_mirror.refresh();
166 this.code_mirror.focus();
166 this.code_mirror.focus();
167 // We used to need an additional refresh() after the focus, but
167 // We used to need an additional refresh() after the focus, but
168 // it appears that this has been fixed in CM. This bug would show
168 // it appears that this has been fixed in CM. This bug would show
169 // up on FF when a newly loaded markdown cell was edited.
169 // up on FF when a newly loaded markdown cell was edited.
170 this.rendered = false;
170 this.rendered = false;
171 if (this.get_text() === this.placeholder) {
171 if (this.get_text() === this.placeholder) {
172 this.set_text('');
172 this.set_text('');
173 this.refresh();
173 this.refresh();
174 }
174 }
175 }
175 }
176 };
176 };
177
177
178
178
179 /**
179 /**
180 * Empty, Subclasses must define render.
180 * Empty, Subclasses must define render.
181 * @method render
181 * @method render
182 */
182 */
183 TextCell.prototype.render = function () {};
183 TextCell.prototype.render = function () {};
184
184
185
185
186 /**
186 /**
187 * setter: {{#crossLink "TextCell/set_text"}}{{/crossLink}}
187 * setter: {{#crossLink "TextCell/set_text"}}{{/crossLink}}
188 * @method get_text
188 * @method get_text
189 * @retrun {string} CodeMirror current text value
189 * @retrun {string} CodeMirror current text value
190 */
190 */
191 TextCell.prototype.get_text = function() {
191 TextCell.prototype.get_text = function() {
192 return this.code_mirror.getValue();
192 return this.code_mirror.getValue();
193 };
193 };
194
194
195 /**
195 /**
196 * @param {string} text - Codemiror text value
196 * @param {string} text - Codemiror text value
197 * @see TextCell#get_text
197 * @see TextCell#get_text
198 * @method set_text
198 * @method set_text
199 * */
199 * */
200 TextCell.prototype.set_text = function(text) {
200 TextCell.prototype.set_text = function(text) {
201 this.code_mirror.setValue(text);
201 this.code_mirror.setValue(text);
202 this.code_mirror.refresh();
202 this.code_mirror.refresh();
203 };
203 };
204
204
205 /**
205 /**
206 * setter :{{#crossLink "TextCell/set_rendered"}}{{/crossLink}}
206 * setter :{{#crossLink "TextCell/set_rendered"}}{{/crossLink}}
207 * @method get_rendered
207 * @method get_rendered
208 * @return {html} html of rendered element
208 * @return {html} html of rendered element
209 * */
209 * */
210 TextCell.prototype.get_rendered = function() {
210 TextCell.prototype.get_rendered = function() {
211 return this.element.find('div.text_cell_render').html();
211 return this.element.find('div.text_cell_render').html();
212 };
212 };
213
213
214 /**
214 /**
215 * @method set_rendered
215 * @method set_rendered
216 */
216 */
217 TextCell.prototype.set_rendered = function(text) {
217 TextCell.prototype.set_rendered = function(text) {
218 this.element.find('div.text_cell_render').html(text);
218 this.element.find('div.text_cell_render').html(text);
219 };
219 };
220
220
221 /**
221 /**
222 * not deprecated, but implementation wrong
222 * not deprecated, but implementation wrong
223 * @method at_top
223 * @method at_top
224 * @deprecated
224 * @deprecated
225 * @return {Boolean} true is cell rendered, false otherwise
225 * @return {Boolean} true is cell rendered, false otherwise
226 * I doubt this is what it is supposed to do
226 * I doubt this is what it is supposed to do
227 * this implementation is completly false
227 * this implementation is completly false
228 */
228 */
229 TextCell.prototype.at_top = function () {
229 TextCell.prototype.at_top = function () {
230 if (this.rendered) {
230 if (this.rendered) {
231 return true;
231 return true;
232 } else {
232 } else {
233 return false;
233 return false;
234 }
234 }
235 };
235 };
236
236
237
237
238 /**
238 /**
239 * not deprecated, but implementation wrong
239 * not deprecated, but implementation wrong
240 * @method at_bottom
240 * @method at_bottom
241 * @deprecated
241 * @deprecated
242 * @return {Boolean} true is cell rendered, false otherwise
242 * @return {Boolean} true is cell rendered, false otherwise
243 * I doubt this is what it is supposed to do
243 * I doubt this is what it is supposed to do
244 * this implementation is completly false
244 * this implementation is completly false
245 * */
245 * */
246 TextCell.prototype.at_bottom = function () {
246 TextCell.prototype.at_bottom = function () {
247 if (this.rendered) {
247 if (this.rendered) {
248 return true;
248 return true;
249 } else {
249 } else {
250 return false;
250 return false;
251 }
251 }
252 };
252 };
253
253
254 /**
254 /**
255 * Create Text cell from JSON
255 * Create Text cell from JSON
256 * @param {json} data - JSON serialized text-cell
256 * @param {json} data - JSON serialized text-cell
257 * @method fromJSON
257 * @method fromJSON
258 */
258 */
259 TextCell.prototype.fromJSON = function (data) {
259 TextCell.prototype.fromJSON = function (data) {
260 IPython.Cell.prototype.fromJSON.apply(this, arguments);
260 IPython.Cell.prototype.fromJSON.apply(this, arguments);
261 if (data.cell_type === this.cell_type) {
261 if (data.cell_type === this.cell_type) {
262 if (data.source !== undefined) {
262 if (data.source !== undefined) {
263 this.set_text(data.source);
263 this.set_text(data.source);
264 // make this value the starting point, so that we can only undo
264 // make this value the starting point, so that we can only undo
265 // to this state, instead of a blank cell
265 // to this state, instead of a blank cell
266 this.code_mirror.clearHistory();
266 this.code_mirror.clearHistory();
267 this.set_rendered(data.rendered || '');
267 this.set_rendered(data.rendered || '');
268 this.rendered = false;
268 this.rendered = false;
269 this.render();
269 this.render();
270 }
270 }
271 }
271 }
272 };
272 };
273
273
274 /** Generate JSON from cell
274 /** Generate JSON from cell
275 * @return {object} cell data serialised to json
275 * @return {object} cell data serialised to json
276 */
276 */
277 TextCell.prototype.toJSON = function () {
277 TextCell.prototype.toJSON = function () {
278 var data = IPython.Cell.prototype.toJSON.apply(this);
278 var data = IPython.Cell.prototype.toJSON.apply(this);
279 data.cell_type = this.cell_type;
279 data.cell_type = this.cell_type;
280 data.source = this.get_text();
280 data.source = this.get_text();
281 return data;
281 return data;
282 };
282 };
283
283
284
284
285 /**
285 /**
286 * @class MarkdownCell
286 * @class MarkdownCell
287 * @constructor MarkdownCell
287 * @constructor MarkdownCell
288 * @extends Ipython.HtmlCell
288 * @extends Ipython.HtmlCell
289 */
289 */
290 var MarkdownCell = function (options) {
290 var MarkdownCell = function (options) {
291 var options = options || {};
291 var options = options || {};
292
292
293 options = this.mergeopt(MarkdownCell,options);
293 options = this.mergeopt(MarkdownCell,options);
294 TextCell.apply(this, [options]);
294 TextCell.apply(this, [options]);
295
295
296 this.cell_type = 'markdown';
296 this.cell_type = 'markdown';
297 };
297 };
298
298
299 MarkdownCell.options_default = {
299 MarkdownCell.options_default = {
300 cm_config: {
300 cm_config: {
301 mode: 'markdown'
301 mode: 'gfm'
302 },
302 },
303 placeholder: "Type *Markdown* and LaTeX: $\\alpha^2$"
303 placeholder: "Type *Markdown* and LaTeX: $\\alpha^2$"
304 }
304 }
305
305
306
306
307
307
308
308
309 MarkdownCell.prototype = new TextCell();
309 MarkdownCell.prototype = new TextCell();
310
310
311 /**
311 /**
312 * @method render
312 * @method render
313 */
313 */
314 MarkdownCell.prototype.render = function () {
314 MarkdownCell.prototype.render = function () {
315 if (this.rendered === false) {
315 if (this.rendered === false) {
316 var text = this.get_text();
316 var text = this.get_text();
317 if (text === "") { text = this.placeholder; }
317 if (text === "") { text = this.placeholder; }
318 text = IPython.mathjaxutils.remove_math(text)
318 text = IPython.mathjaxutils.remove_math(text);
319 var html = IPython.markdown_converter.makeHtml(text);
319 var html = marked.parser(marked.lexer(text));
320 html = IPython.mathjaxutils.replace_math(html)
320 html = IPython.mathjaxutils.replace_math(html);
321 try {
321 try {
322 this.set_rendered(html);
322 this.set_rendered(html);
323 } catch (e) {
323 } catch (e) {
324 console.log("Error running Javascript in Markdown:");
324 console.log("Error running Javascript in Markdown:");
325 console.log(e);
325 console.log(e);
326 this.set_rendered($("<div/>").addClass("js-error").html(
326 this.set_rendered($("<div/>").addClass("js-error").html(
327 "Error rendering Markdown!<br/>" + e.toString())
327 "Error rendering Markdown!<br/>" + e.toString())
328 );
328 );
329 }
329 }
330 this.element.find('div.text_cell_input').hide();
330 this.element.find('div.text_cell_input').hide();
331 this.element.find("div.text_cell_render").show();
331 this.element.find("div.text_cell_render").show();
332 var code_snippets = this.element.find("pre > code");
333 code_snippets.replaceWith(function () {
334 var code = $(this).html();
335 /* Substitute br for newlines and &nbsp; for spaces
336 before highlighting, since prettify doesn't
337 preserve those on all browsers */
338 code = code.replace(/(\r\n|\n|\r)/gm, "<br/>");
339 code = code.replace(/ /gm, '&nbsp;');
340 code = prettyPrintOne(code);
341
342 return '<code class="prettyprint">' + code + '</code>';
343 });
344 this.typeset()
332 this.typeset()
345 this.rendered = true;
333 this.rendered = true;
346 }
334 }
347 };
335 };
348
336
349
337
350 // RawCell
338 // RawCell
351
339
352 /**
340 /**
353 * @class RawCell
341 * @class RawCell
354 * @constructor RawCell
342 * @constructor RawCell
355 * @extends Ipython.TextCell
343 * @extends Ipython.TextCell
356 */
344 */
357 var RawCell = function (options) {
345 var RawCell = function (options) {
358
346
359 options = this.mergeopt(RawCell,options)
347 options = this.mergeopt(RawCell,options)
360 TextCell.apply(this, [options]);
348 TextCell.apply(this, [options]);
361
349
362 this.cell_type = 'raw';
350 this.cell_type = 'raw';
363
351
364 var that = this
352 var that = this
365 this.element.focusout(
353 this.element.focusout(
366 function() { that.auto_highlight(); }
354 function() { that.auto_highlight(); }
367 );
355 );
368 };
356 };
369
357
370 RawCell.options_default = {
358 RawCell.options_default = {
371 placeholder : "Type plain text and LaTeX: $\\alpha^2$"
359 placeholder : "Type plain text and LaTeX: $\\alpha^2$"
372 };
360 };
373
361
374
362
375
363
376 RawCell.prototype = new TextCell();
364 RawCell.prototype = new TextCell();
377
365
378 /**
366 /**
379 * Trigger autodetection of highlight scheme for current cell
367 * Trigger autodetection of highlight scheme for current cell
380 * @method auto_highlight
368 * @method auto_highlight
381 */
369 */
382 RawCell.prototype.auto_highlight = function () {
370 RawCell.prototype.auto_highlight = function () {
383 this._auto_highlight(IPython.config.raw_cell_highlight);
371 this._auto_highlight(IPython.config.raw_cell_highlight);
384 };
372 };
385
373
386 /** @method render **/
374 /** @method render **/
387 RawCell.prototype.render = function () {
375 RawCell.prototype.render = function () {
388 this.rendered = true;
376 this.rendered = true;
389 this.edit();
377 this.edit();
390 };
378 };
391
379
392
380
393 /** @method handle_codemirror_keyevent **/
381 /** @method handle_codemirror_keyevent **/
394 RawCell.prototype.handle_codemirror_keyevent = function (editor, event) {
382 RawCell.prototype.handle_codemirror_keyevent = function (editor, event) {
395
383
396 var that = this;
384 var that = this;
397 if (event.which === key.UPARROW && event.type === 'keydown') {
385 if (event.which === key.UPARROW && event.type === 'keydown') {
398 // If we are not at the top, let CM handle the up arrow and
386 // If we are not at the top, let CM handle the up arrow and
399 // prevent the global keydown handler from handling it.
387 // prevent the global keydown handler from handling it.
400 if (!that.at_top()) {
388 if (!that.at_top()) {
401 event.stop();
389 event.stop();
402 return false;
390 return false;
403 } else {
391 } else {
404 return true;
392 return true;
405 };
393 };
406 } else if (event.which === key.DOWNARROW && event.type === 'keydown') {
394 } else if (event.which === key.DOWNARROW && event.type === 'keydown') {
407 // If we are not at the bottom, let CM handle the down arrow and
395 // If we are not at the bottom, let CM handle the down arrow and
408 // prevent the global keydown handler from handling it.
396 // prevent the global keydown handler from handling it.
409 if (!that.at_bottom()) {
397 if (!that.at_bottom()) {
410 event.stop();
398 event.stop();
411 return false;
399 return false;
412 } else {
400 } else {
413 return true;
401 return true;
414 };
402 };
415 };
403 };
416 return false;
404 return false;
417 };
405 };
418
406
419 /** @method select **/
407 /** @method select **/
420 RawCell.prototype.select = function () {
408 RawCell.prototype.select = function () {
421 IPython.Cell.prototype.select.apply(this);
409 IPython.Cell.prototype.select.apply(this);
422 this.code_mirror.refresh();
410 this.code_mirror.refresh();
423 this.code_mirror.focus();
411 this.code_mirror.focus();
424 };
412 };
425
413
426 /** @method at_top **/
414 /** @method at_top **/
427 RawCell.prototype.at_top = function () {
415 RawCell.prototype.at_top = function () {
428 var cursor = this.code_mirror.getCursor();
416 var cursor = this.code_mirror.getCursor();
429 if (cursor.line === 0 && cursor.ch === 0) {
417 if (cursor.line === 0 && cursor.ch === 0) {
430 return true;
418 return true;
431 } else {
419 } else {
432 return false;
420 return false;
433 }
421 }
434 };
422 };
435
423
436
424
437 /** @method at_bottom **/
425 /** @method at_bottom **/
438 RawCell.prototype.at_bottom = function () {
426 RawCell.prototype.at_bottom = function () {
439 var cursor = this.code_mirror.getCursor();
427 var cursor = this.code_mirror.getCursor();
440 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
428 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
441 return true;
429 return true;
442 } else {
430 } else {
443 return false;
431 return false;
444 }
432 }
445 };
433 };
446
434
447
435
448 /**
436 /**
449 * @class HeadingCell
437 * @class HeadingCell
450 * @extends Ipython.TextCell
438 * @extends Ipython.TextCell
451 */
439 */
452
440
453 /**
441 /**
454 * @constructor HeadingCell
442 * @constructor HeadingCell
455 * @extends Ipython.TextCell
443 * @extends Ipython.TextCell
456 */
444 */
457 var HeadingCell = function (options) {
445 var HeadingCell = function (options) {
458
446
459 options = this.mergeopt(HeadingCell,options)
447 options = this.mergeopt(HeadingCell,options)
460 TextCell.apply(this, [options]);
448 TextCell.apply(this, [options]);
461
449
462 /**
450 /**
463 * heading level of the cell, use getter and setter to access
451 * heading level of the cell, use getter and setter to access
464 * @property level
452 * @property level
465 */
453 */
466 this.level = 1;
454 this.level = 1;
467 this.cell_type = 'heading';
455 this.cell_type = 'heading';
468 };
456 };
469
457
470 HeadingCell.options_default = {
458 HeadingCell.options_default = {
471 placeholder: "Type Heading Here"
459 placeholder: "Type Heading Here"
472 };
460 };
473
461
474 HeadingCell.prototype = new TextCell();
462 HeadingCell.prototype = new TextCell();
475
463
476 /** @method fromJSON */
464 /** @method fromJSON */
477 HeadingCell.prototype.fromJSON = function (data) {
465 HeadingCell.prototype.fromJSON = function (data) {
478 if (data.level != undefined){
466 if (data.level != undefined){
479 this.level = data.level;
467 this.level = data.level;
480 }
468 }
481 TextCell.prototype.fromJSON.apply(this, arguments);
469 TextCell.prototype.fromJSON.apply(this, arguments);
482 };
470 };
483
471
484
472
485 /** @method toJSON */
473 /** @method toJSON */
486 HeadingCell.prototype.toJSON = function () {
474 HeadingCell.prototype.toJSON = function () {
487 var data = TextCell.prototype.toJSON.apply(this);
475 var data = TextCell.prototype.toJSON.apply(this);
488 data.level = this.get_level();
476 data.level = this.get_level();
489 return data;
477 return data;
490 };
478 };
491
479
492
480
493 /**
481 /**
494 * Change heading level of cell, and re-render
482 * Change heading level of cell, and re-render
495 * @method set_level
483 * @method set_level
496 */
484 */
497 HeadingCell.prototype.set_level = function (level) {
485 HeadingCell.prototype.set_level = function (level) {
498 this.level = level;
486 this.level = level;
499 if (this.rendered) {
487 if (this.rendered) {
500 this.rendered = false;
488 this.rendered = false;
501 this.render();
489 this.render();
502 };
490 };
503 };
491 };
504
492
505 /** The depth of header cell, based on html (h1 to h6)
493 /** The depth of header cell, based on html (h1 to h6)
506 * @method get_level
494 * @method get_level
507 * @return {integer} level - for 1 to 6
495 * @return {integer} level - for 1 to 6
508 */
496 */
509 HeadingCell.prototype.get_level = function () {
497 HeadingCell.prototype.get_level = function () {
510 return this.level;
498 return this.level;
511 };
499 };
512
500
513
501
514 HeadingCell.prototype.set_rendered = function (text) {
502 HeadingCell.prototype.set_rendered = function (text) {
515 var r = this.element.find("div.text_cell_render");
503 var r = this.element.find("div.text_cell_render");
516 r.empty();
504 r.empty();
517 var link = text.replace(/ /g, '_');
505 var link = text.replace(/ /g, '_');
518 r.append(
506 r.append(
519 $('<h'+this.level+'/>')
507 $('<h'+this.level+'/>')
520 .append(
508 .append(
521 $('<a/>')
509 $('<a/>')
522 .addClass('heading-anchor')
510 .addClass('heading-anchor')
523 .attr('href', '#' + link)
511 .attr('href', '#' + link)
524 .attr('id', link)
512 .attr('id', link)
525 .html(text)
513 .html(text)
526 )
514 )
527 );
515 );
528 };
516 };
529
517
530
518
531 HeadingCell.prototype.get_rendered = function () {
519 HeadingCell.prototype.get_rendered = function () {
532 var r = this.element.find("div.text_cell_render");
520 var r = this.element.find("div.text_cell_render");
533 return r.children().first().html();
521 return r.children().first().html();
534 };
522 };
535
523
536
524
537 HeadingCell.prototype.render = function () {
525 HeadingCell.prototype.render = function () {
538 if (this.rendered === false) {
526 if (this.rendered === false) {
539 var text = this.get_text();
527 var text = this.get_text();
540 if (text === "") { text = this.placeholder; }
528 if (text === "") { text = this.placeholder; }
541 this.set_rendered(text);
529 this.set_rendered(text);
542 this.typeset();
530 this.typeset();
543 this.element.find('div.text_cell_input').hide();
531 this.element.find('div.text_cell_input').hide();
544 this.element.find("div.text_cell_render").show();
532 this.element.find("div.text_cell_render").show();
545 this.rendered = true;
533 this.rendered = true;
546 };
534 };
547 };
535 };
548
536
549 IPython.TextCell = TextCell;
537 IPython.TextCell = TextCell;
550 IPython.MarkdownCell = MarkdownCell;
538 IPython.MarkdownCell = MarkdownCell;
551 IPython.RawCell = RawCell;
539 IPython.RawCell = RawCell;
552 IPython.HeadingCell = HeadingCell;
540 IPython.HeadingCell = HeadingCell;
553
541
554
542
555 return IPython;
543 return IPython;
556
544
557 }(IPython));
545 }(IPython));
558
546
@@ -1,513 +1,513 b''
1 /**
1 /**
2 * Primary styles
2 * Primary styles
3 *
3 *
4 * Author: IPython Development Team
4 * Author: IPython Development Team
5 */
5 */
6
6
7 @import "variables.less";
7 @import "variables.less";
8
8 @import "highlight.less";
9
9
10 body {
10 body {
11 background-color:@notebook_background;
11 background-color:@notebook_background;
12 }
12 }
13
13
14 body.notebook_app {
14 body.notebook_app {
15 overflow: hidden;
15 overflow: hidden;
16 }
16 }
17
17
18 blockquote {
18 blockquote {
19 border-left: 4px solid #DDD;
19 border-left: 4px solid #DDD;
20 padding: 0 15px;
20 padding: 0 15px;
21 color: #777;
21 color: #777;
22 }
22 }
23
23
24 span#save_widget {
24 span#save_widget {
25 padding: 5px;
25 padding: 5px;
26 margin: 0px 0px 0px 300px;
26 margin: 0px 0px 0px 300px;
27 display:inline-block;
27 display:inline-block;
28 }
28 }
29
29
30 span#checkpoint_status span#autosave_status {
30 span#checkpoint_status span#autosave_status {
31 font-size: small;
31 font-size: small;
32 }
32 }
33
33
34 /*span#save_widget > span#autosave_status {
34 /*span#save_widget > span#autosave_status {
35 font-size: x-small;
35 font-size: x-small;
36 }
36 }
37 */
37 */
38 span#notebook_name {
38 span#notebook_name {
39 height: 1em;
39 height: 1em;
40 line-height: 1em;
40 line-height: 1em;
41 padding: 3px;
41 padding: 3px;
42 border: none;
42 border: none;
43 font-size: 146.5%;
43 font-size: 146.5%;
44 }
44 }
45
45
46
46
47 .ui-menubar-item .ui-button .ui-button-text {
47 .ui-menubar-item .ui-button .ui-button-text {
48 padding: 0.4em 1.0em;
48 padding: 0.4em 1.0em;
49 font-size: 100%;
49 font-size: 100%;
50 }
50 }
51
51
52 .ui-menu {
52 .ui-menu {
53 .box-shadow(0px 6px 10px -1px #adadad);
53 .box-shadow(0px 6px 10px -1px #adadad);
54 }
54 }
55
55
56 .ui-menu .ui-menu-item a {
56 .ui-menu .ui-menu-item a {
57 border: 1px solid transparent;
57 border: 1px solid transparent;
58 padding: 2px 1.6em;
58 padding: 2px 1.6em;
59 }
59 }
60
60
61 .ui-menu .ui-menu-item a.ui-state-focus {
61 .ui-menu .ui-menu-item a.ui-state-focus {
62 margin: 0;
62 margin: 0;
63 }
63 }
64
64
65 .ui-menu hr {
65 .ui-menu hr {
66 margin: 0.3em 0;
66 margin: 0.3em 0;
67 }
67 }
68
68
69 #menubar_container {
69 #menubar_container {
70 position: relative;
70 position: relative;
71 }
71 }
72
72
73 #notification_area {
73 #notification_area {
74 position: absolute;
74 position: absolute;
75 right: 0px;
75 right: 0px;
76 top: 0px;
76 top: 0px;
77 height: 25px;
77 height: 25px;
78 padding: 3px 0px;
78 padding: 3px 0px;
79 padding-right: 3px;
79 padding-right: 3px;
80 z-index: 10;
80 z-index: 10;
81 }
81 }
82
82
83 .notification_widget{
83 .notification_widget{
84 float : right;
84 float : right;
85 right: 0px;
85 right: 0px;
86 top: 1px;
86 top: 1px;
87 height: 25px;
87 height: 25px;
88 padding: 3px 6px;
88 padding: 3px 6px;
89 z-index: 10;
89 z-index: 10;
90 }
90 }
91
91
92 .toolbar {
92 .toolbar {
93 padding: 3px 15px;
93 padding: 3px 15px;
94 border-bottom: @borderwidth @border_color solid;
94 border-bottom: @borderwidth @border_color solid;
95
95
96 button {
96 button {
97 margin-top:2px;
97 margin-top:2px;
98 margin-bottom:2px;
98 margin-bottom:2px;
99 }
99 }
100
100
101
101
102 select, label {
102 select, label {
103 height : 19px;
103 height : 19px;
104 vertical-align:middle;
104 vertical-align:middle;
105 margin-right:2px;
105 margin-right:2px;
106 margin-bottom:0;
106 margin-bottom:0;
107 display: inline;
107 display: inline;
108 font-size: 92%;
108 font-size: 92%;
109 margin-left:0.3em;
109 margin-left:0.3em;
110 margin-right:0.3em;
110 margin-right:0.3em;
111 padding: 0px;
111 padding: 0px;
112 }
112 }
113 }
113 }
114
114
115 .toolbar select{
115 .toolbar select{
116 width:auto;
116 width:auto;
117 }
117 }
118
118
119
119
120 #ipython-main-app {
120 #ipython-main-app {
121 width: 100%;
121 width: 100%;
122 position: relative;
122 position: relative;
123 font-size: 110%;
123 font-size: 110%;
124 }
124 }
125
125
126 span#quick_help_area {
126 span#quick_help_area {
127 position: static;
127 position: static;
128 padding: 5px 0px;
128 padding: 5px 0px;
129 margin: 0px 0px 0px 0px;
129 margin: 0px 0px 0px 0px;
130 }
130 }
131
131
132 .help_string {
132 .help_string {
133 float: right;
133 float: right;
134 width: 170px;
134 width: 170px;
135 padding: 0px 5px;
135 padding: 0px 5px;
136 text-align: left;
136 text-align: left;
137 font-size: 85%;
137 font-size: 85%;
138 }
138 }
139
139
140 .help_string_label {
140 .help_string_label {
141 float: right;
141 float: right;
142 font-size: 85%;
142 font-size: 85%;
143 }
143 }
144
144
145 div#notebook_panel {
145 div#notebook_panel {
146 margin: 0px 0px 0px 0px;
146 margin: 0px 0px 0px 0px;
147 padding: 0px;
147 padding: 0px;
148 }
148 }
149
149
150 div#notebook {
150 div#notebook {
151 overflow-y: scroll;
151 overflow-y: scroll;
152 overflow-x: auto;
152 overflow-x: auto;
153 width: 100%;
153 width: 100%;
154 /* This spaces the cell away from the edge of the notebook area */
154 /* This spaces the cell away from the edge of the notebook area */
155 padding: 5px 5px 15px 5px;
155 padding: 5px 5px 15px 5px;
156 margin: 0px;
156 margin: 0px;
157 }
157 }
158
158
159 div#pager_splitter {
159 div#pager_splitter {
160 height: 8px;
160 height: 8px;
161 }
161 }
162
162
163 #pager_container {
163 #pager_container {
164 position : relative;
164 position : relative;
165 }
165 }
166
166
167 div#pager {
167 div#pager {
168 padding: 15px;
168 padding: 15px;
169 overflow: auto;
169 overflow: auto;
170 display: none;
170 display: none;
171 }
171 }
172
172
173 div.ui-widget-content {
173 div.ui-widget-content {
174 border: 1px solid @border_color;
174 border: 1px solid @border_color;
175 outline: none;
175 outline: none;
176 }
176 }
177
177
178 .cell {
178 .cell {
179 border: 1px solid transparent;
179 border: 1px solid transparent;
180 .vbox();
180 .vbox();
181
181
182 &.selected {
182 &.selected {
183 .corner-all;
183 .corner-all;
184 border : thin @border_color solid;
184 border : thin @border_color solid;
185 }
185 }
186 }
186 }
187
187
188 div.cell {
188 div.cell {
189 width: 100%;
189 width: 100%;
190 padding: 5px 5px 5px 0px;
190 padding: 5px 5px 5px 0px;
191 /* This acts as a spacer between cells, that is outside the border */
191 /* This acts as a spacer between cells, that is outside the border */
192 margin: 2px 0px 2px 0px;
192 margin: 2px 0px 2px 0px;
193 outline: none;
193 outline: none;
194 }
194 }
195
195
196 div.code_cell {
196 div.code_cell {
197 }
197 }
198
198
199 /* any special styling for code cells that are currently running goes here */
199 /* any special styling for code cells that are currently running goes here */
200 div.code_cell.running {
200 div.code_cell.running {
201 }
201 }
202
202
203 div.prompt {
203 div.prompt {
204 /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
204 /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
205 width: 11ex;
205 width: 11ex;
206 /* This 0.4em is tuned to match the padding on the CodeMirror editor. */
206 /* This 0.4em is tuned to match the padding on the CodeMirror editor. */
207 padding: 0.4em;
207 padding: 0.4em;
208 margin: 0px;
208 margin: 0px;
209 font-family: monospace;
209 font-family: monospace;
210 text-align: right;
210 text-align: right;
211 /* This has to match that of the the CodeMirror class line-height below */
211 /* This has to match that of the the CodeMirror class line-height below */
212 line-height: 1.231;
212 line-height: 1.231;
213 }
213 }
214
214
215 div.input {
215 div.input {
216 page-break-inside: avoid;
216 page-break-inside: avoid;
217 .hbox();
217 .hbox();
218 }
218 }
219
219
220 /* input_area and input_prompt must match in top border and margin for alignment */
220 /* input_area and input_prompt must match in top border and margin for alignment */
221 div.input_area {
221 div.input_area {
222 /*color: @fontBaseColor;*/
222 /*color: @fontBaseColor;*/
223 border: 1px solid @light_border_color;
223 border: 1px solid @light_border_color;
224 .corner-all;
224 .corner-all;
225 background: @cell_background;
225 background: @cell_background;
226 }
226 }
227
227
228 div.input_prompt {
228 div.input_prompt {
229 color: navy;
229 color: navy;
230 border-top: 1px solid transparent;
230 border-top: 1px solid transparent;
231 }
231 }
232
232
233 div.output_wrapper {
233 div.output_wrapper {
234 /* This is a spacer between the input and output of each cell */
234 /* This is a spacer between the input and output of each cell */
235 margin-top: 5px;
235 margin-top: 5px;
236 margin-left: 5px;
236 margin-left: 5px;
237 /* FF needs explicit width to stretch */
237 /* FF needs explicit width to stretch */
238 width: 100%;
238 width: 100%;
239 /* this position must be relative to enable descendents to be absolute within it */
239 /* this position must be relative to enable descendents to be absolute within it */
240 position: relative;
240 position: relative;
241 }
241 }
242
242
243 /* class for the output area when it should be height-limited */
243 /* class for the output area when it should be height-limited */
244 div.output_scroll {
244 div.output_scroll {
245 /* ideally, this would be max-height, but FF barfs all over that */
245 /* ideally, this would be max-height, but FF barfs all over that */
246 height: 24em;
246 height: 24em;
247 /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
247 /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */
248 width: 100%;
248 width: 100%;
249
249
250 overflow: auto;
250 overflow: auto;
251 .corner-all;
251 .corner-all;
252 .box-shadow(inset 0 2px 8px rgba(0, 0, 0, .8));
252 .box-shadow(inset 0 2px 8px rgba(0, 0, 0, .8));
253 }
253 }
254
254
255 /* output div while it is collapsed */
255 /* output div while it is collapsed */
256 div.output_collapsed {
256 div.output_collapsed {
257 margin-right: 5px;
257 margin-right: 5px;
258 }
258 }
259
259
260 div.out_prompt_overlay {
260 div.out_prompt_overlay {
261 height: 100%;
261 height: 100%;
262 padding: 0px;
262 padding: 0px;
263 position: absolute;
263 position: absolute;
264 .corner-all;
264 .corner-all;
265 }
265 }
266
266
267 div.out_prompt_overlay:hover {
267 div.out_prompt_overlay:hover {
268 /* use inner shadow to get border that is computed the same on WebKit/FF */
268 /* use inner shadow to get border that is computed the same on WebKit/FF */
269 .box-shadow(inset 0 0 1px #000);
269 .box-shadow(inset 0 0 1px #000);
270 background: rgba(240, 240, 240, 0.5);
270 background: rgba(240, 240, 240, 0.5);
271 }
271 }
272
272
273 div.output_prompt {
273 div.output_prompt {
274 color: darkred;
274 color: darkred;
275 /* 5px right shift to account for margin in parent container */
275 /* 5px right shift to account for margin in parent container */
276 margin: 0 5px 0 -5px;
276 margin: 0 5px 0 -5px;
277 }
277 }
278
278
279 /* This class is the outer container of all output sections. */
279 /* This class is the outer container of all output sections. */
280 div.output_area {
280 div.output_area {
281 padding: 0px;
281 padding: 0px;
282 page-break-inside: avoid;
282 page-break-inside: avoid;
283 .hbox();
283 .hbox();
284 }
284 }
285
285
286
286
287 /* This is needed to protect the pre formating from global settings such
287 /* This is needed to protect the pre formating from global settings such
288 as that of bootstrap */
288 as that of bootstrap */
289 div.output_area pre {
289 div.output_area pre {
290 font-family: monospace;
290 font-family: monospace;
291 margin: 0;
291 margin: 0;
292 padding: 0;
292 padding: 0;
293 border: 0;
293 border: 0;
294 font-size: 100%;
294 font-size: 100%;
295 vertical-align: baseline;
295 vertical-align: baseline;
296 color: black;
296 color: black;
297 }
297 }
298
298
299 /* This class is for the output subarea inside the output_area and after
299 /* This class is for the output subarea inside the output_area and after
300 the prompt div. */
300 the prompt div. */
301 div.output_subarea {
301 div.output_subarea {
302 padding: 0.44em 0.4em 0.4em 1px;
302 padding: 0.44em 0.4em 0.4em 1px;
303 .box-flex1();
303 .box-flex1();
304 }
304 }
305
305
306 /* The rest of the output_* classes are for special styling of the different
306 /* The rest of the output_* classes are for special styling of the different
307 output types */
307 output types */
308
308
309 /* all text output has this class: */
309 /* all text output has this class: */
310 div.output_text {
310 div.output_text {
311 text-align: left;
311 text-align: left;
312 color: @fontBaseColor;
312 color: @fontBaseColor;
313 font-family: monospace;
313 font-family: monospace;
314 /* This has to match that of the the CodeMirror class line-height below */
314 /* This has to match that of the the CodeMirror class line-height below */
315 line-height: 1.231;
315 line-height: 1.231;
316 }
316 }
317
317
318 /* stdout/stderr are 'text' as well as 'stream', but pyout/pyerr are *not* streams */
318 /* stdout/stderr are 'text' as well as 'stream', but pyout/pyerr are *not* streams */
319 div.output_stream {
319 div.output_stream {
320 padding-top: 0.0em;
320 padding-top: 0.0em;
321 padding-bottom: 0.0em;
321 padding-bottom: 0.0em;
322 }
322 }
323 div.output_stdout {
323 div.output_stdout {
324 }
324 }
325 div.output_stderr {
325 div.output_stderr {
326 background: #fdd; /* very light red background for stderr */
326 background: #fdd; /* very light red background for stderr */
327 }
327 }
328
328
329 div.output_latex {
329 div.output_latex {
330 text-align: left;
330 text-align: left;
331 }
331 }
332
332
333 div.output_html {
333 div.output_html {
334 }
334 }
335
335
336 div.output_png {
336 div.output_png {
337 }
337 }
338
338
339 div.output_jpeg {
339 div.output_jpeg {
340 }
340 }
341
341
342 div.text_cell {
342 div.text_cell {
343 padding: 5px 5px 5px 5px;
343 padding: 5px 5px 5px 5px;
344 }
344 }
345
345
346 div.text_cell_input {
346 div.text_cell_input {
347 color: @fontBaseColor;
347 color: @fontBaseColor;
348 border: 1px solid @light_border_color;
348 border: 1px solid @light_border_color;
349 .corner-all;
349 .corner-all;
350 background: @cell_background;
350 background: @cell_background;
351 }
351 }
352
352
353 div.text_cell_render {
353 div.text_cell_render {
354 /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
354 /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/
355 outline: none;
355 outline: none;
356 resize: none;
356 resize: none;
357 width: inherit;
357 width: inherit;
358 border-style: none;
358 border-style: none;
359 padding: 5px;
359 padding: 5px;
360 color: @fontBaseColor;
360 color: @fontBaseColor;
361 }
361 }
362
362
363 /* The following gets added to the <head> if it is detected that the user has a
363 /* The following gets added to the <head> if it is detected that the user has a
364 * monospace font with inconsistent normal/bold/italic height. See
364 * monospace font with inconsistent normal/bold/italic height. See
365 * notebookmain.js. Such fonts will have keywords vertically offset with
365 * notebookmain.js. Such fonts will have keywords vertically offset with
366 * respect to the rest of the text. The user should select a better font.
366 * respect to the rest of the text. The user should select a better font.
367 * See: https://github.com/ipython/ipython/issues/1503
367 * See: https://github.com/ipython/ipython/issues/1503
368 *
368 *
369 * .CodeMirror span {
369 * .CodeMirror span {
370 * vertical-align: bottom;
370 * vertical-align: bottom;
371 * }
371 * }
372 */
372 */
373
373
374 .CodeMirror {
374 .CodeMirror {
375 line-height: 1.231; /* Changed from 1em to our global default */
375 line-height: 1.231; /* Changed from 1em to our global default */
376 height: auto; /* Changed to auto to autogrow */
376 height: auto; /* Changed to auto to autogrow */
377 background: none; /* Changed from white to allow our bg to show through */
377 background: none; /* Changed from white to allow our bg to show through */
378 }
378 }
379
379
380 .CodeMirror-scroll {
380 .CodeMirror-scroll {
381 /* The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
381 /* The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/
382 /* We have found that if it is visible, vertical scrollbars appear with font size changes.*/
382 /* We have found that if it is visible, vertical scrollbars appear with font size changes.*/
383 overflow-y: hidden;
383 overflow-y: hidden;
384 overflow-x: auto; /* Changed from auto to remove scrollbar */
384 overflow-x: auto; /* Changed from auto to remove scrollbar */
385 }
385 }
386
386
387 .CodeMirror-lines {
387 .CodeMirror-lines {
388 /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */
388 /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */
389 /* we have set a different line-height and want this to scale with that. */
389 /* we have set a different line-height and want this to scale with that. */
390 padding: 0.4em;
390 padding: 0.4em;
391 }
391 }
392
392
393 .CodeMirror pre {
393 .CodeMirror pre {
394 /* In CM3 this went to 4px from 0 in CM2. We need the 0 value because of how we size */
394 /* In CM3 this went to 4px from 0 in CM2. We need the 0 value because of how we size */
395 /* .CodeMirror-lines */
395 /* .CodeMirror-lines */
396 padding: 0;
396 padding: 0;
397 }
397 }
398
398
399 /* CSS font colors for translated ANSI colors. */
399 /* CSS font colors for translated ANSI colors. */
400
400
401
401
402 .ansiblack {color: @fontBaseColor;}
402 .ansiblack {color: @fontBaseColor;}
403 .ansired {color: darkred;}
403 .ansired {color: darkred;}
404 .ansigreen {color: darkgreen;}
404 .ansigreen {color: darkgreen;}
405 .ansiyellow {color: brown;}
405 .ansiyellow {color: brown;}
406 .ansiblue {color: darkblue;}
406 .ansiblue {color: darkblue;}
407 .ansipurple {color: darkviolet;}
407 .ansipurple {color: darkviolet;}
408 .ansicyan {color: steelblue;}
408 .ansicyan {color: steelblue;}
409 .ansigrey {color: grey;}
409 .ansigrey {color: grey;}
410 .ansibold {font-weight: bold;}
410 .ansibold {font-weight: bold;}
411
411
412 .completions {
412 .completions {
413 position: absolute;
413 position: absolute;
414 z-index: 10;
414 z-index: 10;
415 overflow: hidden;
415 overflow: hidden;
416 border: 1px solid @border_color;
416 border: 1px solid @border_color;
417 .corner-all;
417 .corner-all;
418 .box-shadow(0px 6px 10px -1px #adadad);
418 .box-shadow(0px 6px 10px -1px #adadad);
419 }
419 }
420
420
421 .completions select {
421 .completions select {
422 background: white;
422 background: white;
423 outline: none;
423 outline: none;
424 border: none;
424 border: none;
425 padding: 0px;
425 padding: 0px;
426 margin: 0px;
426 margin: 0px;
427 overflow: auto;
427 overflow: auto;
428 font-family: monospace;
428 font-family: monospace;
429 font-size: 110%;
429 font-size: 110%;
430 color: @fontBaseColor;
430 color: @fontBaseColor;
431 }
431 }
432
432
433 .completions select option.context {
433 .completions select option.context {
434 color: @blueDark;
434 color: @blueDark;
435 }
435 }
436
436
437 pre.dialog {
437 pre.dialog {
438 background-color: @cell_background;
438 background-color: @cell_background;
439 border: 1px solid #ddd;
439 border: 1px solid #ddd;
440 .corner-all;
440 .corner-all;
441 padding: 0.4em;
441 padding: 0.4em;
442 padding-left: 2em;
442 padding-left: 2em;
443 }
443 }
444
444
445 p.dialog {
445 p.dialog {
446 padding : 0.2em;
446 padding : 0.2em;
447 }
447 }
448
448
449 .shortcut_key {
449 .shortcut_key {
450 display: inline-block;
450 display: inline-block;
451 width: 15ex;
451 width: 15ex;
452 text-align: right;
452 text-align: right;
453 font-family: monospace;
453 font-family: monospace;
454 }
454 }
455
455
456 .shortcut_descr {
456 .shortcut_descr {
457 }
457 }
458
458
459 /* Word-wrap output correctly. This is the CSS3 spelling, though Firefox seems
459 /* Word-wrap output correctly. This is the CSS3 spelling, though Firefox seems
460 to not honor it correctly. Webkit browsers (Chrome, rekonq, Safari) do.
460 to not honor it correctly. Webkit browsers (Chrome, rekonq, Safari) do.
461 */
461 */
462 pre, code, kbd, samp { white-space: pre-wrap; }
462 pre, code, kbd, samp { white-space: pre-wrap; }
463
463
464 #fonttest {
464 #fonttest {
465 font-family: monospace;
465 font-family: monospace;
466 }
466 }
467
467
468 .js-error {
468 .js-error {
469 color: darkred;
469 color: darkred;
470 }
470 }
471
471
472 a {
472 a {
473 text-decoration: underline;
473 text-decoration: underline;
474 }
474 }
475
475
476 p {
476 p {
477
477
478 margin-bottom:0;
478 margin-bottom:0;
479
479
480 }
480 }
481
481
482 a.heading-anchor:link, a.heading-anchor:visited {
482 a.heading-anchor:link, a.heading-anchor:visited {
483 text-decoration: none;
483 text-decoration: none;
484 color: inherit;
484 color: inherit;
485 }
485 }
486
486
487 /* raw_input styles */
487 /* raw_input styles */
488
488
489 div.raw_input {
489 div.raw_input {
490 padding-top: 0px;
490 padding-top: 0px;
491 padding-bottom: 0px;
491 padding-bottom: 0px;
492 height: 1em;
492 height: 1em;
493 line-height: 1em;
493 line-height: 1em;
494 font-family: monospace;
494 font-family: monospace;
495 }
495 }
496 span.input_prompt {
496 span.input_prompt {
497 font-family: inherit;
497 font-family: inherit;
498 }
498 }
499 input.raw_input {
499 input.raw_input {
500 font-family: inherit;
500 font-family: inherit;
501 font-size: inherit;
501 font-size: inherit;
502 color: inherit;
502 color: inherit;
503 width: auto;
503 width: auto;
504 margin: -2px 0px 0px 1px;
504 margin: -2px 0px 0px 1px;
505 padding-left: 1px;
505 padding-left: 1px;
506 padding-top: 2px;
506 padding-top: 2px;
507 height: 1em;
507 height: 1em;
508 }
508 }
509
509
510 p.p-space {
510 p.p-space {
511 margin-bottom: 10px;
511 margin-bottom: 10px;
512 }
512 }
513
513
@@ -1,243 +1,242 b''
1 {% extends "page.html" %}
1 {% extends "page.html" %}
2
2
3 {% block stylesheet %}
3 {% block stylesheet %}
4
4
5 {% if mathjax_url %}
5 {% if mathjax_url %}
6 <script type="text/javascript" src="{{mathjax_url}}?config=TeX-AMS_HTML-full&delayStartupUntil=configured" charset="utf-8"></script>
6 <script type="text/javascript" src="{{mathjax_url}}?config=TeX-AMS_HTML-full&delayStartupUntil=configured" charset="utf-8"></script>
7 {% endif %}
7 {% endif %}
8 <script type="text/javascript">
8 <script type="text/javascript">
9 // MathJax disabled, set as null to distingish from *missing* MathJax,
9 // MathJax disabled, set as null to distingish from *missing* MathJax,
10 // where it will be undefined, and should prompt a dialog later.
10 // where it will be undefined, and should prompt a dialog later.
11 window.mathjax_url = "{{mathjax_url}}";
11 window.mathjax_url = "{{mathjax_url}}";
12 </script>
12 </script>
13
13
14 <link rel="stylesheet" href="{{ static_url("components/codemirror/lib/codemirror.css") }}">
14 <link rel="stylesheet" href="{{ static_url("components/codemirror/lib/codemirror.css") }}">
15 <link rel="stylesheet" href="{{ static_url("css/codemirror-ipython.css") }}">
16
17 <link rel="stylesheet" href="{{ static_url("prettify/prettify.css") }}"/>
18
15
19 <link rel="stylesheet" href="{{ static_url("css/celltoolbar.css") }}" type="text/css" />
16 <link rel="stylesheet" href="{{ static_url("css/celltoolbar.css") }}" type="text/css" />
20
17
21 {{super()}}
18 {{super()}}
22
19
23 {% endblock %}
20 {% endblock %}
24
21
25 {% block params %}
22 {% block params %}
26
23
27 data-project={{project}}
24 data-project={{project}}
28 data-base-project-url={{base_project_url}}
25 data-base-project-url={{base_project_url}}
29 data-base-kernel-url={{base_kernel_url}}
26 data-base-kernel-url={{base_kernel_url}}
30 data-read-only={{read_only and not logged_in}}
27 data-read-only={{read_only and not logged_in}}
31 data-notebook-id={{notebook_id}}
28 data-notebook-id={{notebook_id}}
32 class="notebook_app"
29 class="notebook_app"
33
30
34 {% endblock %}
31 {% endblock %}
35
32
36
33
37 {% block header %}
34 {% block header %}
38
35
39 <span id="save_widget">
36 <span id="save_widget">
40 <span id="notebook_name"></span>
37 <span id="notebook_name"></span>
41 <span id="checkpoint_status"></span>
38 <span id="checkpoint_status"></span>
42 <span id="autosave_status"></span>
39 <span id="autosave_status"></span>
43 </span>
40 </span>
44
41
45 {% endblock %}
42 {% endblock %}
46
43
47
44
48 {% block site %}
45 {% block site %}
49
46
50 <div id="menubar_container">
47 <div id="menubar_container">
51 <div id="menubar">
48 <div id="menubar">
52 <ul id="menus">
49 <ul id="menus">
53 <li><a href="#">File</a>
50 <li><a href="#">File</a>
54 <ul>
51 <ul>
55 <li id="new_notebook"><a href="#">New</a></li>
52 <li id="new_notebook"><a href="#">New</a></li>
56 <li id="open_notebook"><a href="#">Open...</a></li>
53 <li id="open_notebook"><a href="#">Open...</a></li>
57 <hr/>
54 <hr/>
58 <li id="copy_notebook"><a href="#">Make a Copy...</a></li>
55 <li id="copy_notebook"><a href="#">Make a Copy...</a></li>
59 <li id="rename_notebook"><a href="#">Rename...</a></li>
56 <li id="rename_notebook"><a href="#">Rename...</a></li>
60 <li id="save_checkpoint"><a href="#">Save and Checkpoint</a></li>
57 <li id="save_checkpoint"><a href="#">Save and Checkpoint</a></li>
61 <hr/>
58 <hr/>
62 <li id="restore_checkpoint"><a href="#">Revert to Checkpoint</a>
59 <li id="restore_checkpoint"><a href="#">Revert to Checkpoint</a>
63 <ul>
60 <ul>
64 <li><a href="#"></a></li>
61 <li><a href="#"></a></li>
65 <li><a href="#"></a></li>
62 <li><a href="#"></a></li>
66 <li><a href="#"></a></li>
63 <li><a href="#"></a></li>
67 <li><a href="#"></a></li>
64 <li><a href="#"></a></li>
68 <li><a href="#"></a></li>
65 <li><a href="#"></a></li>
69 </ul>
66 </ul>
70 </li>
67 </li>
71 <hr/>
68 <hr/>
72 <li><a href="#">Download as</a>
69 <li><a href="#">Download as</a>
73 <ul>
70 <ul>
74 <li id="download_ipynb"><a href="#">IPython (.ipynb)</a></li>
71 <li id="download_ipynb"><a href="#">IPython (.ipynb)</a></li>
75 <li id="download_py"><a href="#">Python (.py)</a></li>
72 <li id="download_py"><a href="#">Python (.py)</a></li>
76 </ul>
73 </ul>
77 </li>
74 </li>
78 <!--<hr/>
75 <!--<hr/>
79 <li id="print_notebook"><a href="/{{notebook_id}}/print" target="_blank">Print View</a></li>-->
76 <li id="print_notebook"><a href="/{{notebook_id}}/print" target="_blank">Print View</a></li>-->
80 <hr/>
77 <hr/>
81 <li id="kill_and_exit"><a href="#" >Close and halt</a></li>
78 <li id="kill_and_exit"><a href="#" >Close and halt</a></li>
82 </ul>
79 </ul>
83 </li>
80 </li>
84 <li><a href="#">Edit</a>
81 <li><a href="#">Edit</a>
85 <ul>
82 <ul>
86 <li id="cut_cell"><a href="#">Cut Cell</a></li>
83 <li id="cut_cell"><a href="#">Cut Cell</a></li>
87 <li id="copy_cell"><a href="#">Copy Cell</a></li>
84 <li id="copy_cell"><a href="#">Copy Cell</a></li>
88 <li id="paste_cell_above" class="ui-state-disabled"><a href="#">Paste Cell Above</a></li>
85 <li id="paste_cell_above" class="ui-state-disabled"><a href="#">Paste Cell Above</a></li>
89 <li id="paste_cell_below" class="ui-state-disabled"><a href="#">Paste Cell Below</a></li>
86 <li id="paste_cell_below" class="ui-state-disabled"><a href="#">Paste Cell Below</a></li>
90 <li id="paste_cell_replace" class="ui-state-disabled"><a href="#">Paste Cell &amp; Replace</a></li>
87 <li id="paste_cell_replace" class="ui-state-disabled"><a href="#">Paste Cell &amp; Replace</a></li>
91 <li id="delete_cell"><a href="#">Delete Cell</a></li>
88 <li id="delete_cell"><a href="#">Delete Cell</a></li>
92 <li id="undelete_cell" class="ui-state-disabled"><a href="#">Undo Delete Cell</a></li>
89 <li id="undelete_cell" class="ui-state-disabled"><a href="#">Undo Delete Cell</a></li>
93 <hr/>
90 <hr/>
94 <li id="split_cell"><a href="#">Split Cell</a></li>
91 <li id="split_cell"><a href="#">Split Cell</a></li>
95 <li id="merge_cell_above"><a href="#">Merge Cell Above</a></li>
92 <li id="merge_cell_above"><a href="#">Merge Cell Above</a></li>
96 <li id="merge_cell_below"><a href="#">Merge Cell Below</a></li>
93 <li id="merge_cell_below"><a href="#">Merge Cell Below</a></li>
97 <hr/>
94 <hr/>
98 <li id="move_cell_up"><a href="#">Move Cell Up</a></li>
95 <li id="move_cell_up"><a href="#">Move Cell Up</a></li>
99 <li id="move_cell_down"><a href="#">Move Cell Down</a></li>
96 <li id="move_cell_down"><a href="#">Move Cell Down</a></li>
100 <hr/>
97 <hr/>
101 <li id="select_previous"><a href="#">Select Previous Cell</a></li>
98 <li id="select_previous"><a href="#">Select Previous Cell</a></li>
102 <li id="select_next"><a href="#">Select Next Cell</a></li>
99 <li id="select_next"><a href="#">Select Next Cell</a></li>
103 </ul>
100 </ul>
104 </li>
101 </li>
105 <li><a href="#">View</a>
102 <li><a href="#">View</a>
106 <ul>
103 <ul>
107 <li id="toggle_header"><a href="#">Toggle Header</a></li>
104 <li id="toggle_header"><a href="#">Toggle Header</a></li>
108 <li id="toggle_toolbar"><a href="#">Toggle Toolbar</a></li>
105 <li id="toggle_toolbar"><a href="#">Toggle Toolbar</a></li>
109 </ul>
106 </ul>
110 </li>
107 </li>
111 <li><a href="#">Insert</a>
108 <li><a href="#">Insert</a>
112 <ul>
109 <ul>
113 <li id="insert_cell_above"><a href="#">Insert Cell Above</a></li>
110 <li id="insert_cell_above"><a href="#">Insert Cell Above</a></li>
114 <li id="insert_cell_below"><a href="#">Insert Cell Below</a></li>
111 <li id="insert_cell_below"><a href="#">Insert Cell Below</a></li>
115 </ul>
112 </ul>
116 </li>
113 </li>
117 <li><a href="#">Cell</a>
114 <li><a href="#">Cell</a>
118 <ul>
115 <ul>
119 <li id="run_cell"><a href="#">Run</a></li>
116 <li id="run_cell"><a href="#">Run</a></li>
120 <li id="run_cell_in_place"><a href="#">Run in Place</a></li>
117 <li id="run_cell_in_place"><a href="#">Run in Place</a></li>
121 <li id="run_all_cells"><a href="#">Run All</a></li>
118 <li id="run_all_cells"><a href="#">Run All</a></li>
122 <li id="run_all_cells_above"><a href="#">Run All Above</a></li>
119 <li id="run_all_cells_above"><a href="#">Run All Above</a></li>
123 <li id="run_all_cells_below"><a href="#">Run All Below</a></li>
120 <li id="run_all_cells_below"><a href="#">Run All Below</a></li>
124 <hr/>
121 <hr/>
125 <li id="to_code"><a href="#">Code</a></li>
122 <li id="to_code"><a href="#">Code</a></li>
126 <li id="to_markdown"><a href="#">Markdown </a></li>
123 <li id="to_markdown"><a href="#">Markdown </a></li>
127 <li id="to_raw"><a href="#">Raw Text</a></li>
124 <li id="to_raw"><a href="#">Raw Text</a></li>
128 <li id="to_heading1"><a href="#">Heading 1</a></li>
125 <li id="to_heading1"><a href="#">Heading 1</a></li>
129 <li id="to_heading2"><a href="#">Heading 2</a></li>
126 <li id="to_heading2"><a href="#">Heading 2</a></li>
130 <li id="to_heading3"><a href="#">Heading 3</a></li>
127 <li id="to_heading3"><a href="#">Heading 3</a></li>
131 <li id="to_heading4"><a href="#">Heading 4</a></li>
128 <li id="to_heading4"><a href="#">Heading 4</a></li>
132 <li id="to_heading5"><a href="#">Heading 5</a></li>
129 <li id="to_heading5"><a href="#">Heading 5</a></li>
133 <li id="to_heading6"><a href="#">Heading 6</a></li>
130 <li id="to_heading6"><a href="#">Heading 6</a></li>
134 <hr/>
131 <hr/>
135 <li id="toggle_output"><a href="#">Toggle Current Output</a></li>
132 <li id="toggle_output"><a href="#">Toggle Current Output</a></li>
136 <li id="all_outputs"><a href="#">All Output</a>
133 <li id="all_outputs"><a href="#">All Output</a>
137 <ul>
134 <ul>
138 <li id="expand_all_output"><a href="#">Expand</a></li>
135 <li id="expand_all_output"><a href="#">Expand</a></li>
139 <li id="scroll_all_output"><a href="#">Scroll Long</a></li>
136 <li id="scroll_all_output"><a href="#">Scroll Long</a></li>
140 <li id="collapse_all_output"><a href="#">Collapse</a></li>
137 <li id="collapse_all_output"><a href="#">Collapse</a></li>
141 <li id="clear_all_output"><a href="#">Clear</a></li>
138 <li id="clear_all_output"><a href="#">Clear</a></li>
142 </ul>
139 </ul>
143 </li>
140 </li>
144 </ul>
141 </ul>
145 </li>
142 </li>
146 <li><a href="#">Kernel</a>
143 <li><a href="#">Kernel</a>
147 <ul>
144 <ul>
148 <li id="int_kernel"><a href="#">Interrupt</a></li>
145 <li id="int_kernel"><a href="#">Interrupt</a></li>
149 <li id="restart_kernel"><a href="#">Restart</a></li>
146 <li id="restart_kernel"><a href="#">Restart</a></li>
150 </ul>
147 </ul>
151 </li>
148 </li>
152 <li><a href="#">Help</a>
149 <li><a href="#">Help</a>
153 <ul>
150 <ul>
154 <li><a href="http://ipython.org/documentation.html" target="_blank">IPython Help</a></li>
151 <li><a href="http://ipython.org/documentation.html" target="_blank">IPython Help</a></li>
155 <li><a href="http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html" target="_blank">Notebook Help</a></li>
152 <li><a href="http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html" target="_blank">Notebook Help</a></li>
156 <li id="keyboard_shortcuts"><a href="#">Keyboard Shortcuts</a></li>
153 <li id="keyboard_shortcuts"><a href="#">Keyboard Shortcuts</a></li>
157 <hr/>
154 <hr/>
158 <li><a href="http://docs.python.org" target="_blank">Python</a></li>
155 <li><a href="http://docs.python.org" target="_blank">Python</a></li>
159 <li><a href="http://docs.scipy.org/doc/numpy/reference/" target="_blank">NumPy</a></li>
156 <li><a href="http://docs.scipy.org/doc/numpy/reference/" target="_blank">NumPy</a></li>
160 <li><a href="http://docs.scipy.org/doc/scipy/reference/" target="_blank">SciPy</a></li>
157 <li><a href="http://docs.scipy.org/doc/scipy/reference/" target="_blank">SciPy</a></li>
161 <li><a href="http://docs.sympy.org/dev/index.html" target="_blank">SymPy</a></li>
158 <li><a href="http://docs.sympy.org/dev/index.html" target="_blank">SymPy</a></li>
162 <li><a href="http://matplotlib.sourceforge.net/" target="_blank">Matplotlib</a></li>
159 <li><a href="http://matplotlib.sourceforge.net/" target="_blank">Matplotlib</a></li>
163 </ul>
160 </ul>
164 </li>
161 </li>
165 </ul>
162 </ul>
166
163
167 </div>
164 </div>
168 <div id="notification_area">
165 <div id="notification_area">
169 </div>
166 </div>
170 </div>
167 </div>
171
168
172
169
173 <div id="maintoolbar"></div>
170 <div id="maintoolbar"></div>
174
171
175 <div id="ipython-main-app">
172 <div id="ipython-main-app">
176
173
177 <div id="notebook_panel">
174 <div id="notebook_panel">
178 <div id="notebook"></div>
175 <div id="notebook"></div>
179 <div id="pager_splitter"></div>
176 <div id="pager_splitter"></div>
180 <div id="pager_container">
177 <div id="pager_container">
181 <div id='pager_button_area'>
178 <div id='pager_button_area'>
182 </div>
179 </div>
183 <div id="pager"></div>
180 <div id="pager"></div>
184 </div>
181 </div>
185 </div>
182 </div>
186
183
187 </div>
184 </div>
188 <div id='tooltip' class='ipython_tooltip' style='display:none'></div>
185 <div id='tooltip' class='ipython_tooltip' style='display:none'></div>
189
186
190
187
191 {% endblock %}
188 {% endblock %}
192
189
193
190
194 {% block script %}
191 {% block script %}
195
192
196 {{super()}}
193 {{super()}}
197
194
198 <script src="{{ static_url("components/codemirror/lib/codemirror.js") }}" charset="utf-8"></script>
195 <script src="{{ static_url("components/codemirror/lib/codemirror.js") }}" charset="utf-8"></script>
199 <script src="{{ static_url("components/codemirror/addon/mode/loadmode.js") }}" charset="utf-8"></script>
196 <script src="{{ static_url("components/codemirror/addon/mode/loadmode.js") }}" charset="utf-8"></script>
200 <script src="{{ static_url("components/codemirror/addon/mode/multiplex.js") }}" charset="utf-8"></script>
197 <script src="{{ static_url("components/codemirror/addon/mode/multiplex.js") }}" charset="utf-8"></script>
198 <script src="{{ static_url("components/codemirror/addon/mode/overlay.js") }}" charset="utf-8"></script>
201 <script src="{{ static_url("js/codemirror-ipython.js") }}" charset="utf-8"></script>
199 <script src="{{ static_url("js/codemirror-ipython.js") }}" charset="utf-8"></script>
202 <script src="{{ static_url("components/codemirror/mode/htmlmixed/htmlmixed.js") }}" charset="utf-8"></script>
200 <script src="{{ static_url("components/codemirror/mode/htmlmixed/htmlmixed.js") }}" charset="utf-8"></script>
203 <script src="{{ static_url("components/codemirror/mode/xml/xml.js") }}" charset="utf-8"></script>
201 <script src="{{ static_url("components/codemirror/mode/xml/xml.js") }}" charset="utf-8"></script>
204 <script src="{{ static_url("components/codemirror/mode/javascript/javascript.js") }}" charset="utf-8"></script>
202 <script src="{{ static_url("components/codemirror/mode/javascript/javascript.js") }}" charset="utf-8"></script>
205 <script src="{{ static_url("components/codemirror/mode/css/css.js") }}" charset="utf-8"></script>
203 <script src="{{ static_url("components/codemirror/mode/css/css.js") }}" charset="utf-8"></script>
206 <script src="{{ static_url("components/codemirror/mode/rst/rst.js") }}" charset="utf-8"></script>
204 <script src="{{ static_url("components/codemirror/mode/rst/rst.js") }}" charset="utf-8"></script>
207 <script src="{{ static_url("components/codemirror/mode/markdown/markdown.js") }}" charset="utf-8"></script>
205 <script src="{{ static_url("components/codemirror/mode/markdown/markdown.js") }}" charset="utf-8"></script>
206 <script src="{{ static_url("components/codemirror/mode/gfm/gfm.js") }}" charset="utf-8"></script>
208
207
209 <script src="{{ static_url("pagedown/Markdown.Converter.js") }}" charset="utf-8"></script>
208 <script src="{{ static_url("components/marked/lib/marked.js") }}" charset="utf-8"></script>
209 <script src="{{ static_url("components/highlight.js/build/highlight.pack.js") }}" charset="utf-8"></script>
210
210
211 <script src="{{ static_url("prettify/prettify.js") }}" charset="utf-8"></script>
212 <script src="{{ static_url("dateformat/date.format.js") }}" charset="utf-8"></script>
211 <script src="{{ static_url("dateformat/date.format.js") }}" charset="utf-8"></script>
213
212
214 <script src="{{ static_url("js/events.js") }}" type="text/javascript" charset="utf-8"></script>
213 <script src="{{ static_url("js/events.js") }}" type="text/javascript" charset="utf-8"></script>
215 <script src="{{ static_url("js/utils.js") }}" type="text/javascript" charset="utf-8"></script>
214 <script src="{{ static_url("js/utils.js") }}" type="text/javascript" charset="utf-8"></script>
216 <script src="{{ static_url("js/layoutmanager.js") }}" type="text/javascript" charset="utf-8"></script>
215 <script src="{{ static_url("js/layoutmanager.js") }}" type="text/javascript" charset="utf-8"></script>
217 <script src="{{ static_url("js/mathjaxutils.js") }}" type="text/javascript" charset="utf-8"></script>
216 <script src="{{ static_url("js/mathjaxutils.js") }}" type="text/javascript" charset="utf-8"></script>
218 <script src="{{ static_url("js/outputarea.js") }}" type="text/javascript" charset="utf-8"></script>
217 <script src="{{ static_url("js/outputarea.js") }}" type="text/javascript" charset="utf-8"></script>
219 <script src="{{ static_url("js/cell.js") }}" type="text/javascript" charset="utf-8"></script>
218 <script src="{{ static_url("js/cell.js") }}" type="text/javascript" charset="utf-8"></script>
220 <script src="{{ static_url("js/celltoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
219 <script src="{{ static_url("js/celltoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
221 <script src="{{ static_url("js/codecell.js") }}" type="text/javascript" charset="utf-8"></script>
220 <script src="{{ static_url("js/codecell.js") }}" type="text/javascript" charset="utf-8"></script>
222 <script src="{{ static_url("js/completer.js") }}" type="text/javascript" charset="utf-8"></script>
221 <script src="{{ static_url("js/completer.js") }}" type="text/javascript" charset="utf-8"></script>
223 <script src="{{ static_url("js/textcell.js") }}" type="text/javascript" charset="utf-8"></script>
222 <script src="{{ static_url("js/textcell.js") }}" type="text/javascript" charset="utf-8"></script>
224 <script src="{{ static_url("js/kernel.js") }}" type="text/javascript" charset="utf-8"></script>
223 <script src="{{ static_url("js/kernel.js") }}" type="text/javascript" charset="utf-8"></script>
225 <script src="{{ static_url("js/savewidget.js") }}" type="text/javascript" charset="utf-8"></script>
224 <script src="{{ static_url("js/savewidget.js") }}" type="text/javascript" charset="utf-8"></script>
226 <script src="{{ static_url("js/quickhelp.js") }}" type="text/javascript" charset="utf-8"></script>
225 <script src="{{ static_url("js/quickhelp.js") }}" type="text/javascript" charset="utf-8"></script>
227 <script src="{{ static_url("js/pager.js") }}" type="text/javascript" charset="utf-8"></script>
226 <script src="{{ static_url("js/pager.js") }}" type="text/javascript" charset="utf-8"></script>
228 <script src="{{ static_url("js/menubar.js") }}" type="text/javascript" charset="utf-8"></script>
227 <script src="{{ static_url("js/menubar.js") }}" type="text/javascript" charset="utf-8"></script>
229 <script src="{{ static_url("js/toolbar.js") }}" type="text/javascript" charset="utf-8"></script>
228 <script src="{{ static_url("js/toolbar.js") }}" type="text/javascript" charset="utf-8"></script>
230 <script src="{{ static_url("js/maintoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
229 <script src="{{ static_url("js/maintoolbar.js") }}" type="text/javascript" charset="utf-8"></script>
231 <script src="{{ static_url("js/notebook.js") }}" type="text/javascript" charset="utf-8"></script>
230 <script src="{{ static_url("js/notebook.js") }}" type="text/javascript" charset="utf-8"></script>
232 <script src="{{ static_url("js/notificationwidget.js") }}" type="text/javascript" charset="utf-8"></script>
231 <script src="{{ static_url("js/notificationwidget.js") }}" type="text/javascript" charset="utf-8"></script>
233 <script src="{{ static_url("js/notificationarea.js") }}" type="text/javascript" charset="utf-8"></script>
232 <script src="{{ static_url("js/notificationarea.js") }}" type="text/javascript" charset="utf-8"></script>
234 <script src="{{ static_url("js/tooltip.js") }}" type="text/javascript" charset="utf-8"></script>
233 <script src="{{ static_url("js/tooltip.js") }}" type="text/javascript" charset="utf-8"></script>
235 <script src="{{ static_url("js/config.js") }}" type="text/javascript" charset="utf-8"></script>
234 <script src="{{ static_url("js/config.js") }}" type="text/javascript" charset="utf-8"></script>
236 <script src="{{ static_url("js/notebookmain.js") }}" type="text/javascript" charset="utf-8"></script>
235 <script src="{{ static_url("js/notebookmain.js") }}" type="text/javascript" charset="utf-8"></script>
237
236
238 <script src="{{ static_url("js/contexthint.js") }}" charset="utf-8"></script>
237 <script src="{{ static_url("js/contexthint.js") }}" charset="utf-8"></script>
239
238
240 <script src="{{ static_url("js/celltoolbarpresets/default.js") }}" type="text/javascript" charset="utf-8"></script>
239 <script src="{{ static_url("js/celltoolbarpresets/default.js") }}" type="text/javascript" charset="utf-8"></script>
241 <script src="{{ static_url("js/celltoolbarpresets/slideshow.js") }}" type="text/javascript" charset="utf-8"></script>
240 <script src="{{ static_url("js/celltoolbarpresets/slideshow.js") }}" type="text/javascript" charset="utf-8"></script>
242
241
243 {% endblock %}
242 {% endblock %}
@@ -1,172 +1,190 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """
2 """
3 A multi-heart Heartbeat system using PUB and ROUTER sockets. pings are sent out on the PUB,
3 A multi-heart Heartbeat system using PUB and ROUTER sockets. pings are sent out on the PUB,
4 and hearts are tracked based on their DEALER identities.
4 and hearts are tracked based on their DEALER identities.
5
5
6 Authors:
6 Authors:
7
7
8 * Min RK
8 * Min RK
9 """
9 """
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Copyright (C) 2010-2011 The IPython Development Team
11 # Copyright (C) 2010-2011 The IPython Development Team
12 #
12 #
13 # Distributed under the terms of the BSD License. The full license is in
13 # Distributed under the terms of the BSD License. The full license is in
14 # the file COPYING, distributed as part of this software.
14 # the file COPYING, distributed as part of this software.
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from __future__ import print_function
17 from __future__ import print_function
18 import time
18 import time
19 import uuid
19 import uuid
20
20
21 import zmq
21 import zmq
22 from zmq.devices import ThreadDevice, ThreadMonitoredQueue
22 from zmq.devices import ThreadDevice, ThreadMonitoredQueue
23 from zmq.eventloop import ioloop, zmqstream
23 from zmq.eventloop import ioloop, zmqstream
24
24
25 from IPython.config.configurable import LoggingConfigurable
25 from IPython.config.configurable import LoggingConfigurable
26 from IPython.utils.py3compat import str_to_bytes
26 from IPython.utils.py3compat import str_to_bytes
27 from IPython.utils.traitlets import Set, Instance, CFloat, Integer
27 from IPython.utils.traitlets import Set, Instance, CFloat, Integer, Dict
28
28
29 from IPython.parallel.util import log_errors
29 from IPython.parallel.util import log_errors
30
30
31 class Heart(object):
31 class Heart(object):
32 """A basic heart object for responding to a HeartMonitor.
32 """A basic heart object for responding to a HeartMonitor.
33 This is a simple wrapper with defaults for the most common
33 This is a simple wrapper with defaults for the most common
34 Device model for responding to heartbeats.
34 Device model for responding to heartbeats.
35
35
36 It simply builds a threadsafe zmq.FORWARDER Device, defaulting to using
36 It simply builds a threadsafe zmq.FORWARDER Device, defaulting to using
37 SUB/DEALER for in/out.
37 SUB/DEALER for in/out.
38
38
39 You can specify the DEALER's IDENTITY via the optional heart_id argument."""
39 You can specify the DEALER's IDENTITY via the optional heart_id argument."""
40 device=None
40 device=None
41 id=None
41 id=None
42 def __init__(self, in_addr, out_addr, mon_addr=None, in_type=zmq.SUB, out_type=zmq.DEALER, mon_type=zmq.PUB, heart_id=None):
42 def __init__(self, in_addr, out_addr, mon_addr=None, in_type=zmq.SUB, out_type=zmq.DEALER, mon_type=zmq.PUB, heart_id=None):
43 if mon_addr is None:
43 if mon_addr is None:
44 self.device = ThreadDevice(zmq.FORWARDER, in_type, out_type)
44 self.device = ThreadDevice(zmq.FORWARDER, in_type, out_type)
45 else:
45 else:
46 self.device = ThreadMonitoredQueue(in_type, out_type, mon_type, in_prefix=b"", out_prefix=b"")
46 self.device = ThreadMonitoredQueue(in_type, out_type, mon_type, in_prefix=b"", out_prefix=b"")
47 # do not allow the device to share global Context.instance,
47 # do not allow the device to share global Context.instance,
48 # which is the default behavior in pyzmq > 2.1.10
48 # which is the default behavior in pyzmq > 2.1.10
49 self.device.context_factory = zmq.Context
49 self.device.context_factory = zmq.Context
50
50
51 self.device.daemon=True
51 self.device.daemon=True
52 self.device.connect_in(in_addr)
52 self.device.connect_in(in_addr)
53 self.device.connect_out(out_addr)
53 self.device.connect_out(out_addr)
54 if mon_addr is not None:
54 if mon_addr is not None:
55 self.device.connect_mon(mon_addr)
55 self.device.connect_mon(mon_addr)
56 if in_type == zmq.SUB:
56 if in_type == zmq.SUB:
57 self.device.setsockopt_in(zmq.SUBSCRIBE, b"")
57 self.device.setsockopt_in(zmq.SUBSCRIBE, b"")
58 if heart_id is None:
58 if heart_id is None:
59 heart_id = uuid.uuid4().bytes
59 heart_id = uuid.uuid4().bytes
60 self.device.setsockopt_out(zmq.IDENTITY, heart_id)
60 self.device.setsockopt_out(zmq.IDENTITY, heart_id)
61 self.id = heart_id
61 self.id = heart_id
62
62
63 def start(self):
63 def start(self):
64 return self.device.start()
64 return self.device.start()
65
65
66
66
67 class HeartMonitor(LoggingConfigurable):
67 class HeartMonitor(LoggingConfigurable):
68 """A basic HeartMonitor class
68 """A basic HeartMonitor class
69 pingstream: a PUB stream
69 pingstream: a PUB stream
70 pongstream: an ROUTER stream
70 pongstream: an ROUTER stream
71 period: the period of the heartbeat in milliseconds"""
71 period: the period of the heartbeat in milliseconds"""
72
72
73 period = Integer(3000, config=True,
73 period = Integer(3000, config=True,
74 help='The frequency at which the Hub pings the engines for heartbeats '
74 help='The frequency at which the Hub pings the engines for heartbeats '
75 '(in ms)',
75 '(in ms)',
76 )
76 )
77 max_heartmonitor_misses = Integer(10, config=True,
78 help='Allowed consecutive missed pings from controller Hub to engine before unregistering.',
79 )
77
80
78 pingstream=Instance('zmq.eventloop.zmqstream.ZMQStream')
81 pingstream=Instance('zmq.eventloop.zmqstream.ZMQStream')
79 pongstream=Instance('zmq.eventloop.zmqstream.ZMQStream')
82 pongstream=Instance('zmq.eventloop.zmqstream.ZMQStream')
80 loop = Instance('zmq.eventloop.ioloop.IOLoop')
83 loop = Instance('zmq.eventloop.ioloop.IOLoop')
81 def _loop_default(self):
84 def _loop_default(self):
82 return ioloop.IOLoop.instance()
85 return ioloop.IOLoop.instance()
83
86
84 # not settable:
87 # not settable:
85 hearts=Set()
88 hearts=Set()
86 responses=Set()
89 responses=Set()
87 on_probation=Set()
90 on_probation=Dict()
88 last_ping=CFloat(0)
91 last_ping=CFloat(0)
89 _new_handlers = Set()
92 _new_handlers = Set()
90 _failure_handlers = Set()
93 _failure_handlers = Set()
91 lifetime = CFloat(0)
94 lifetime = CFloat(0)
92 tic = CFloat(0)
95 tic = CFloat(0)
93
96
94 def __init__(self, **kwargs):
97 def __init__(self, **kwargs):
95 super(HeartMonitor, self).__init__(**kwargs)
98 super(HeartMonitor, self).__init__(**kwargs)
96
99
97 self.pongstream.on_recv(self.handle_pong)
100 self.pongstream.on_recv(self.handle_pong)
98
101
99 def start(self):
102 def start(self):
100 self.tic = time.time()
103 self.tic = time.time()
101 self.caller = ioloop.PeriodicCallback(self.beat, self.period, self.loop)
104 self.caller = ioloop.PeriodicCallback(self.beat, self.period, self.loop)
102 self.caller.start()
105 self.caller.start()
103
106
104 def add_new_heart_handler(self, handler):
107 def add_new_heart_handler(self, handler):
105 """add a new handler for new hearts"""
108 """add a new handler for new hearts"""
106 self.log.debug("heartbeat::new_heart_handler: %s", handler)
109 self.log.debug("heartbeat::new_heart_handler: %s", handler)
107 self._new_handlers.add(handler)
110 self._new_handlers.add(handler)
108
111
109 def add_heart_failure_handler(self, handler):
112 def add_heart_failure_handler(self, handler):
110 """add a new handler for heart failure"""
113 """add a new handler for heart failure"""
111 self.log.debug("heartbeat::new heart failure handler: %s", handler)
114 self.log.debug("heartbeat::new heart failure handler: %s", handler)
112 self._failure_handlers.add(handler)
115 self._failure_handlers.add(handler)
113
116
114 def beat(self):
117 def beat(self):
115 self.pongstream.flush()
118 self.pongstream.flush()
116 self.last_ping = self.lifetime
119 self.last_ping = self.lifetime
117
120
118 toc = time.time()
121 toc = time.time()
119 self.lifetime += toc-self.tic
122 self.lifetime += toc-self.tic
120 self.tic = toc
123 self.tic = toc
121 self.log.debug("heartbeat::sending %s", self.lifetime)
124 self.log.debug("heartbeat::sending %s", self.lifetime)
122 goodhearts = self.hearts.intersection(self.responses)
125 goodhearts = self.hearts.intersection(self.responses)
123 missed_beats = self.hearts.difference(goodhearts)
126 missed_beats = self.hearts.difference(goodhearts)
124 heartfailures = self.on_probation.intersection(missed_beats)
125 newhearts = self.responses.difference(goodhearts)
127 newhearts = self.responses.difference(goodhearts)
126 map(self.handle_new_heart, newhearts)
128 map(self.handle_new_heart, newhearts)
129 heartfailures, on_probation = self._check_missed(missed_beats, self.on_probation,
130 self.hearts)
127 map(self.handle_heart_failure, heartfailures)
131 map(self.handle_heart_failure, heartfailures)
128 self.on_probation = missed_beats.intersection(self.hearts)
132 self.on_probation = on_probation
129 self.responses = set()
133 self.responses = set()
130 #print self.on_probation, self.hearts
134 #print self.on_probation, self.hearts
131 # self.log.debug("heartbeat::beat %.3f, %i beating hearts", self.lifetime, len(self.hearts))
135 # self.log.debug("heartbeat::beat %.3f, %i beating hearts", self.lifetime, len(self.hearts))
132 self.pingstream.send(str_to_bytes(str(self.lifetime)))
136 self.pingstream.send(str_to_bytes(str(self.lifetime)))
133 # flush stream to force immediate socket send
137 # flush stream to force immediate socket send
134 self.pingstream.flush()
138 self.pingstream.flush()
135
139
140 def _check_missed(self, missed_beats, on_probation, hearts):
141 """Update heartbeats on probation, identifying any that have too many misses.
142 """
143 failures = []
144 new_probation = {}
145 for cur_heart in (b for b in missed_beats if b in hearts):
146 miss_count = on_probation.get(cur_heart, 0) + 1
147 self.log.info("heartbeat::missed %s : %s" % (cur_heart, miss_count))
148 if miss_count > self.max_heartmonitor_misses:
149 failures.append(cur_heart)
150 else:
151 new_probation[cur_heart] = miss_count
152 return failures, new_probation
153
136 def handle_new_heart(self, heart):
154 def handle_new_heart(self, heart):
137 if self._new_handlers:
155 if self._new_handlers:
138 for handler in self._new_handlers:
156 for handler in self._new_handlers:
139 handler(heart)
157 handler(heart)
140 else:
158 else:
141 self.log.info("heartbeat::yay, got new heart %s!", heart)
159 self.log.info("heartbeat::yay, got new heart %s!", heart)
142 self.hearts.add(heart)
160 self.hearts.add(heart)
143
161
144 def handle_heart_failure(self, heart):
162 def handle_heart_failure(self, heart):
145 if self._failure_handlers:
163 if self._failure_handlers:
146 for handler in self._failure_handlers:
164 for handler in self._failure_handlers:
147 try:
165 try:
148 handler(heart)
166 handler(heart)
149 except Exception as e:
167 except Exception as e:
150 self.log.error("heartbeat::Bad Handler! %s", handler, exc_info=True)
168 self.log.error("heartbeat::Bad Handler! %s", handler, exc_info=True)
151 pass
169 pass
152 else:
170 else:
153 self.log.info("heartbeat::Heart %s failed :(", heart)
171 self.log.info("heartbeat::Heart %s failed :(", heart)
154 self.hearts.remove(heart)
172 self.hearts.remove(heart)
155
173
156
174
157 @log_errors
175 @log_errors
158 def handle_pong(self, msg):
176 def handle_pong(self, msg):
159 "a heart just beat"
177 "a heart just beat"
160 current = str_to_bytes(str(self.lifetime))
178 current = str_to_bytes(str(self.lifetime))
161 last = str_to_bytes(str(self.last_ping))
179 last = str_to_bytes(str(self.last_ping))
162 if msg[1] == current:
180 if msg[1] == current:
163 delta = time.time()-self.tic
181 delta = time.time()-self.tic
164 # self.log.debug("heartbeat::heart %r took %.2f ms to respond"%(msg[0], 1000*delta))
182 # self.log.debug("heartbeat::heart %r took %.2f ms to respond"%(msg[0], 1000*delta))
165 self.responses.add(msg[0])
183 self.responses.add(msg[0])
166 elif msg[1] == last:
184 elif msg[1] == last:
167 delta = time.time()-self.tic + (self.lifetime-self.last_ping)
185 delta = time.time()-self.tic + (self.lifetime-self.last_ping)
168 self.log.warn("heartbeat::heart %r missed a beat, and took %.2f ms to respond", msg[0], 1000*delta)
186 self.log.warn("heartbeat::heart %r missed a beat, and took %.2f ms to respond", msg[0], 1000*delta)
169 self.responses.add(msg[0])
187 self.responses.add(msg[0])
170 else:
188 else:
171 self.log.warn("heartbeat::got bad heartbeat (possibly old?): %s (current=%.3f)", msg[1], self.lifetime)
189 self.log.warn("heartbeat::got bad heartbeat (possibly old?): %s (current=%.3f)", msg[1], self.lifetime)
172
190
@@ -1,18 +1,16 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008-2009 The IPython Development Team
5 # Copyright (C) 2008-2009 The IPython Development Team
6 #
6 #
7 # Distributed under the terms of the BSD License. The full license is in
7 # Distributed under the terms of the BSD License. The full license is in
8 # the file COPYING, distributed as part of this software.
8 # the file COPYING, distributed as part of this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
15
16 from IPython.parallel.apps.ipclusterapp import launch_new_instance
14 from IPython.parallel.apps.ipclusterapp import launch_new_instance
17
15
18 launch_new_instance()
16 launch_new_instance()
@@ -1,18 +1,16 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008-2009 The IPython Development Team
5 # Copyright (C) 2008-2009 The IPython Development Team
6 #
6 #
7 # Distributed under the terms of the BSD License. The full license is in
7 # Distributed under the terms of the BSD License. The full license is in
8 # the file COPYING, distributed as part of this software.
8 # the file COPYING, distributed as part of this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
15
16 from IPython.parallel.apps.ipcontrollerapp import launch_new_instance
14 from IPython.parallel.apps.ipcontrollerapp import launch_new_instance
17
15
18 launch_new_instance()
16 launch_new_instance()
@@ -1,20 +1,16 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008-2009 The IPython Development Team
5 # Copyright (C) 2008-2009 The IPython Development Team
6 #
6 #
7 # Distributed under the terms of the BSD License. The full license is in
7 # Distributed under the terms of the BSD License. The full license is in
8 # the file COPYING, distributed as part of this software.
8 # the file COPYING, distributed as part of this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
15
16 from IPython.parallel.apps.ipengineapp import launch_new_instance
14 from IPython.parallel.apps.ipengineapp import launch_new_instance
17
15
18 launch_new_instance()
16 launch_new_instance()
19
20
@@ -1,20 +1,16 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2008-2009 The IPython Development Team
5 # Copyright (C) 2008-2009 The IPython Development Team
6 #
6 #
7 # Distributed under the terms of the BSD License. The full license is in
7 # Distributed under the terms of the BSD License. The full license is in
8 # the file COPYING, distributed as part of this software.
8 # the file COPYING, distributed as part of this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
15
16 from IPython.parallel.apps.iploggerapp import launch_new_instance
14 from IPython.parallel.apps.iploggerapp import launch_new_instance
17
15
18 launch_new_instance()
16 launch_new_instance()
19
20
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (1319 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now