Merge lp:~vauxoo/web-addons/7.0-web_hideleftmenu into lp:~webaddons-core-editors/web-addons/7.0

Proposed by OscarAlca
Status: Rejected
Rejected by: Holger Brunn (Therp)
Proposed branch: lp:~vauxoo/web-addons/7.0-web_hideleftmenu
Merge into: lp:~webaddons-core-editors/web-addons/7.0
Diff against target: 24257 lines (+23454/-0)
108 files modified
.bzrignore (+3/-0)
multi_image/__init__.py (+25/-0)
multi_image/__openerp__.py (+50/-0)
multi_image/controllers/__init__.py (+25/-0)
multi_image/controllers/main.py (+61/-0)
multi_image/static/lib/lightbox/css/lightbox.css (+128/-0)
multi_image/static/lib/lightbox/js/jquery.lightbox.js (+501/-0)
multi_image/static/src/css/hoverbox.css (+52/-0)
multi_image/static/src/js/multi_image.js (+227/-0)
multi_image/static/src/xml/image_multi.xml (+126/-0)
multi_image_sample/__init__.py (+25/-0)
multi_image_sample/__openerp__.py (+39/-0)
multi_image_sample/product.py (+34/-0)
multi_image_sample/product_view.xml (+20/-0)
portal_public_documents/__init__.py (+2/-0)
portal_public_documents/__openerp__.py (+41/-0)
portal_public_documents/controllers/__init__.py (+1/-0)
portal_public_documents/controllers/main.py (+41/-0)
portal_public_documents/data/portal_public_document_data.xml (+52/-0)
portal_public_documents/data/ppd_scheduler.xml (+13/-0)
portal_public_documents/demo/portal_public_document_demo.xml (+18/-0)
portal_public_documents/model/__init__.py (+1/-0)
portal_public_documents/model/ir_attachment.py (+241/-0)
portal_public_documents/view/ir_attachment_view.xml (+34/-0)
web_allow_custom_root/__init__.py (+30/-0)
web_allow_custom_root/__openerp__.py (+86/-0)
web_binary_icon/__openerp__.py (+89/-0)
web_bootstrap3/__openerp__.py (+91/-0)
web_bootstrap3/static/src/css/bs3-lightbox.css (+91/-0)
web_bootstrap3/static/src/css/bs3-openerp.css (+6022/-0)
web_bootstrap3/static/src/fonts/glyphicons-halflings-regular.svg (+228/-0)
web_bootstrap3/static/src/index.html (+211/-0)
web_bootstrap3/static/src/index2.html (+89/-0)
web_bootstrap3/static/src/js/bootstrap-lightbox.js (+300/-0)
web_bootstrap3/static/src/js/bootstrap.js (+2001/-0)
web_bootstrap3/static/src/js/ekko-lightbox.js (+194/-0)
web_bootstrap3/static/src/less/bs3-openerp.less (+3/-0)
web_camera/__init__.py (+22/-0)
web_camera/__openerp__.py (+47/-0)
web_camera/static/src/css/base.css (+21/-0)
web_camera/static/src/js/view.js (+189/-0)
web_camera/static/src/xml/webcam_template.xml (+35/-0)
web_fancybox/__openerp__.py (+46/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/CHANGELOG.md (+125/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/README.md (+217/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/demo/ajax.txt (+15/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/demo/iframe.html (+26/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/demo/index.html (+312/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/lib/jquery-1.10.1.min.js (+6/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/lib/jquery-1.9.0.min.js (+4/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/lib/jquery.mousewheel-3.0.6.pack.js (+13/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/helpers/jquery.fancybox-buttons.css (+97/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/helpers/jquery.fancybox-buttons.js (+122/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/helpers/jquery.fancybox-media.js (+199/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/helpers/jquery.fancybox-thumbs.css (+55/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/helpers/jquery.fancybox-thumbs.js (+162/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/jquery.fancybox.css (+274/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/jquery.fancybox.js (+2020/-0)
web_fancybox/static/src/lib/fancyapps-fancyBox-18d1712/source/jquery.fancybox.pack.js (+46/-0)
web_flagicons/__openerp__.py (+47/-0)
web_flagicons/static/src/css/flags.css (+245/-0)
web_fontawesome/__openerp__.py (+83/-0)
web_fontawesome/static/src/css/font-awesome-ie7.css (+1203/-0)
web_fontawesome/static/src/css/font-awesome.css (+1479/-0)
web_fontawesome/static/src/font/fontawesome-webfont.svg (+399/-0)
web_fontawesome/static/src/xml/base.xml (+10/-0)
web_gmaps/__init__.py (+1/-0)
web_gmaps/__openerp__.py (+62/-0)
web_gmaps/model/__init__.py (+1/-0)
web_gmaps/model/partner.py (+54/-0)
web_gmaps/static/html/404.html (+11/-0)
web_gmaps/static/src/css/gmaps.css (+7/-0)
web_gmaps/static/src/js/lib.js (+45/-0)
web_gmaps/static/src/js/load_gmap_key.js (+8/-0)
web_gmaps/static/src/xml/lib.xml (+20/-0)
web_gmaps/view/partner_view.xml (+19/-0)
web_gmaps_action/__init__.py (+2/-0)
web_gmaps_action/__openerp__.py (+77/-0)
web_gmaps_action/controllers/__init__.py (+1/-0)
web_gmaps_action/controllers/main.py (+23/-0)
web_gmaps_action/data/gmaps_data.xml (+10/-0)
web_gmaps_action/doc/index.rst (+44/-0)
web_gmaps_action/gmaps_point.py (+125/-0)
web_gmaps_action/gmaps_point_view.xml (+90/-0)
web_gmaps_action/res_partner.py (+8/-0)
web_gmaps_action/res_partner_view.xml (+17/-0)
web_gmaps_action/static/src/css/gmaps.css (+26/-0)
web_gmaps_action/static/src/img/developers-logo.svg (+2243/-0)
web_gmaps_action/static/src/js/gmaps.js (+500/-0)
web_gmaps_action/static/src/xml/gmaps.xml (+155/-0)
web_gmaps_action/web_gmaps_demo.xml (+28/-0)
web_hideleftmenu/__openerp__.py (+52/-0)
web_hideleftmenu/static/src/css/lib.css (+6/-0)
web_hideleftmenu/static/src/js/lib.js (+10/-0)
web_hideleftmenu/static/src/xml/lib.xml (+10/-0)
web_many2many_attachments/__openerp__.py (+51/-0)
web_many2many_attachments/static/src/js/many2many_att.js (+210/-0)
web_many2many_attachments/static/src/lib/URI.js (+89/-0)
web_many2many_attachments/static/src/xml/many2many_att.xml (+19/-0)
web_process_prettyprint/__openerp__.py (+56/-0)
web_process_prettyprint/static/html/example.html (+97/-0)
web_process_prettyprint/static/src/css/lib.css (+48/-0)
web_process_prettyprint/static/src/js/lib.js (+3/-0)
web_process_prettyprint/static/src/xml/lib.xml (+356/-0)
web_url/__openerp__.py (+74/-0)
web_url/static/html/404.html (+11/-0)
web_url/static/src/js/lib.js (+52/-0)
web_url/static/src/xml/lib.xml (+19/-0)
To merge this branch: bzr merge lp:~vauxoo/web-addons/7.0-web_hideleftmenu
Reviewer Review Type Date Requested Status
Holger Brunn (Therp) Disapprove
OscarAlca (community) Disapprove
Pedro Manuel Baeza code review Needs Fixing
Review via email: mp+216796@code.launchpad.net

Description of the change

Merge Yanina's changes

To post a comment you must log in.
Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Hi, Oscar, thanks for the MP. Could you please clean MP with only the module web_hideleftmenu?

Regards.

review: Needs Fixing (code review)
Revision history for this message
OscarAlca (oscarolar) wrote :

Hello Pedro, Im sorry about this MP, I was making a merge on our own dev branches and wrongly sent the MP to web_addons, please skip this MP, sorry for the inconvenience

review: Disapprove
Revision history for this message
Pedro Manuel Baeza (pedro.baeza) wrote :

Well, although the MP is wrong, I see the module very interesting, so why don't you propose here?

Regards.

Revision history for this message
Holger Brunn (Therp) (hbrunn) wrote :

I reject this MP, but as Pedro said, a clean MP for just the module in question seems to be interesting.

review: Disapprove

Unmerged revisions

113. By Yanina Aular (Vauxoo)

[ADD] comments added

112. By Yanina Aular (Vauxoo)

[IMP] Comments and code improvements

111. By Yanina Aular (Vauxoo)

[ADD] deletePoint

110. By Yanina Aular (Vauxoo)

[IMP] Variable names from googlemaps API have changed

109. By Yanina Aular (Vauxoo)

[IMP] example for gmaps with partner hidden

108. By Yanina Aular (Vauxoo)

[IMP] points list in view is upgrade to the change ( when there is already a list of previous points)

107. By Yanina Aular (Vauxoo)

[IMP] points list in view is upgrade to the change

106. By Yanina Aular (Vauxoo)

[ADD] id added to the points in javascript

105. By Yanina Aular (Vauxoo)

[ADD] destroy and comment some functions

104. By Yanina Aular (Vauxoo)

[IMP] points of model on map charged

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file '.bzrignore'
2--- .bzrignore 1970-01-01 00:00:00 +0000
3+++ .bzrignore 2014-04-22 22:55:50 +0000
4@@ -0,0 +1,3 @@
5+^.DS_Store
6+*.DS_Store
7+portal_public_documents/static/files/*
8
9=== added directory 'multi_image'
10=== added file 'multi_image/__init__.py'
11--- multi_image/__init__.py 1970-01-01 00:00:00 +0000
12+++ multi_image/__init__.py 2014-04-22 22:55:50 +0000
13@@ -0,0 +1,25 @@
14+# -*- coding: utf-8 -*-
15+##############################################################################
16+#
17+# OpenERP, Open Source Management Solution
18+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
19+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
20+#
21+# This program is free software: you can redistribute it and/or modify
22+# it under the terms of the GNU Affero General Public License as
23+# published by the Free Software Foundation, either version 3 of the
24+# License, or (at your option) any later version.
25+#
26+# This program is distributed in the hope that it will be useful,
27+# but WITHOUT ANY WARRANTY; without even the implied warranty of
28+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29+# GNU Affero General Public License for more details.
30+#
31+# You should have received a copy of the GNU Affero General Public License
32+# along with this program. If not, see <http://www.gnu.org/licenses/>.
33+#
34+##############################################################################
35+
36+import controllers
37+
38+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
39\ No newline at end of file
40
41=== added file 'multi_image/__openerp__.py'
42--- multi_image/__openerp__.py 1970-01-01 00:00:00 +0000
43+++ multi_image/__openerp__.py 2014-04-22 22:55:50 +0000
44@@ -0,0 +1,50 @@
45+# -*- coding: utf-8 -*-
46+##############################################################################
47+#
48+# OpenERP, Open Source Management Solution
49+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
50+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
51+#
52+# This program is free software: you can redistribute it and/or modify
53+# it under the terms of the GNU Affero General Public License as
54+# published by the Free Software Foundation, either version 3 of the
55+# License, or (at your option) any later version.
56+#
57+# This program is distributed in the hope that it will be useful,
58+# but WITHOUT ANY WARRANTY; without even the implied warranty of
59+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
60+# GNU Affero General Public License for more details.
61+#
62+# You should have received a copy of the GNU Affero General Public License
63+# along with this program. If not, see <http://www.gnu.org/licenses/>.
64+#
65+##############################################################################
66+
67+{
68+ "name" : "Multi Image",
69+ "version" : "1.0",
70+ "author" : "Serpent Consulting Services Pvt. Ltd.",
71+ "category": 'Image',
72+ 'complexity': "easy",
73+ 'depends': ['web'],
74+ "description": """
75+ This module provides the functionality to store multiple images for one record.
76+ All images store in server directory. so database size doesnot increase.
77+ """,
78+ 'update_xml': [
79+ ],
80+ 'js':[
81+ "static/lib/lightbox/js/jquery.lightbox.js",
82+ "static/src/js/multi_image.js"
83+ ],
84+ 'css':[
85+ "static/src/css/hoverbox.css",
86+ "static/lib/lightbox/css/lightbox.css",
87+ ],
88+ 'website': 'http://www.serpentcs.com',
89+ 'qweb': ['static/src/xml/image_multi.xml'],
90+ 'installable': True,
91+ 'auto_install': False,
92+}
93+
94+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
95
96=== added directory 'multi_image/controllers'
97=== added file 'multi_image/controllers/__init__.py'
98--- multi_image/controllers/__init__.py 1970-01-01 00:00:00 +0000
99+++ multi_image/controllers/__init__.py 2014-04-22 22:55:50 +0000
100@@ -0,0 +1,25 @@
101+# -*- coding: utf-8 -*-
102+##############################################################################
103+#
104+# OpenERP, Open Source Management Solution
105+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
106+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
107+#
108+# This program is free software: you can redistribute it and/or modify
109+# it under the terms of the GNU Affero General Public License as
110+# published by the Free Software Foundation, either version 3 of the
111+# License, or (at your option) any later version.
112+#
113+# This program is distributed in the hope that it will be useful,
114+# but WITHOUT ANY WARRANTY; without even the implied warranty of
115+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
116+# GNU Affero General Public License for more details.
117+#
118+# You should have received a copy of the GNU Affero General Public License
119+# along with this program. If not, see <http://www.gnu.org/licenses/>.
120+#
121+##############################################################################
122+
123+from . import main
124+
125+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
126\ No newline at end of file
127
128=== added file 'multi_image/controllers/main.py'
129--- multi_image/controllers/main.py 1970-01-01 00:00:00 +0000
130+++ multi_image/controllers/main.py 2014-04-22 22:55:50 +0000
131@@ -0,0 +1,61 @@
132+# -*- coding: utf-8 -*-
133+##############################################################################
134+#
135+# OpenERP, Open Source Management Solution
136+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
137+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
138+#
139+# This program is free software: you can redistribute it and/or modify
140+# it under the terms of the GNU Affero General Public License as
141+# published by the Free Software Foundation, either version 3 of the
142+# License, or (at your option) any later version.
143+#
144+# This program is distributed in the hope that it will be useful,
145+# but WITHOUT ANY WARRANTY; without even the implied warranty of
146+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
147+# GNU Affero General Public License for more details.
148+#
149+# You should have received a copy of the GNU Affero General Public License
150+# along with this program. If not, see <http://www.gnu.org/licenses/>.
151+#
152+##############################################################################
153+
154+from web import http
155+from openerp.addons.web.controllers.main import Binary
156+openerpweb = http
157+import simplejson
158+import time
159+import openerp
160+import os
161+import StringIO
162+
163+class Binary_multi(Binary):
164+
165+ @openerpweb.httprequest
166+ def upload_image_multi(self, req, callback, ufile):
167+ # TODO: might be useful to have a configuration flag for max-length file uploads
168+ out = """<script language="javascript" type="text/javascript">
169+ var win = window.top.window;
170+ win.jQuery(win).trigger(%s, %s);
171+ </script>"""
172+ data = ufile.read()
173+ if data:
174+ current_dat_time = time.strftime("%d%m%y%H%M%S")
175+ file_name = current_dat_time + "_" + ufile.filename
176+ addons_path = openerpweb.addons_manifest['web']['addons_path'] + "/web/static/src/img/image_multi/"
177+ if not os.path.isdir(addons_path):
178+ os.mkdir(addons_path)
179+ addons_path += file_name
180+ buff = StringIO.StringIO()
181+ buff.write(data)
182+ buff.seek(0)
183+ file_name = "/web/static/src/img/image_multi/" + file_name
184+ file = open(addons_path, 'wb')
185+ file.write(buff.read())
186+ file.close()
187+ args = [len(data), file_name, ufile.content_type, ufile.filename, time.strftime("%m/%d/%Y %H:%M:%S")]
188+ else:
189+ args = []
190+ return out % (simplejson.dumps(callback), simplejson.dumps(args))
191+
192+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
193\ No newline at end of file
194
195=== added directory 'multi_image/static'
196=== added directory 'multi_image/static/lib'
197=== added directory 'multi_image/static/lib/lightbox'
198=== added directory 'multi_image/static/lib/lightbox/css'
199=== added file 'multi_image/static/lib/lightbox/css/lightbox.css'
200--- multi_image/static/lib/lightbox/css/lightbox.css 1970-01-01 00:00:00 +0000
201+++ multi_image/static/lib/lightbox/css/lightbox.css 2014-04-22 22:55:50 +0000
202@@ -0,0 +1,128 @@
203+#lightbox{
204+ position: absolute;
205+ left: 0;
206+ width: 100%;
207+ z-index: 100;
208+ text-align: center;
209+ line-height: 0;
210+ }
211+
212+#lightbox a img{ border: none; }
213+
214+#outerImageContainer{
215+ position: relative;
216+ background-color: #fff;
217+ width: 250px;
218+ height: 250px;
219+ margin: 0 auto;
220+ }
221+
222+#imageContainer{
223+ padding: 10px;
224+ }
225+
226+#loading{
227+ position: absolute;
228+ top: 40%;
229+ left: 0%;
230+ height: 25%;
231+ width: 100%;
232+ text-align: center;
233+ line-height: 0;
234+ }
235+#hoverNav{
236+ position: absolute;
237+ top: 0;
238+ left: 0;
239+ height: 100%;
240+ width: 100%;
241+ z-index: 10;
242+ }
243+#imageContainer>#hoverNav{ left: 0;}
244+#hoverNav a{ outline: none;}
245+
246+#prevLink, #nextLink{
247+ width: 49%;
248+ height: 100%;
249+ background: transparent url(../images/blank.gif) no-repeat; /* Trick IE into showing hover */
250+ display: block;
251+ }
252+#prevLink { left: 0; float: left;}
253+#nextLink { right: 0; float: right;}
254+#prevLink:hover, #prevLink:visited:hover { background: url(../images/prev.gif) left 50% no-repeat; }
255+#nextLink:hover, #nextLink:visited:hover { background: url(../images/next.gif) right 50% no-repeat; }
256+/*** START : next / previous text links ***/
257+nextLinkText, #prevLinkText{
258+color: #FF9834;
259+font-weight:bold;
260+text-decoration: none;
261+}
262+#nextLinkText{
263+padding-left: 20px;
264+}
265+#prevLinkText{
266+padding-right: 20px;
267+}
268+/*** END : next / previous text links ***/
269+/*** START : added padding when navbar is on top ***/
270+
271+.ontop #imageData {
272+ padding-top: 5px;
273+}
274+
275+/*** END : added padding when navbar is on top ***/
276+
277+#imageDataContainer{
278+ font: 10px Verdana, Helvetica, sans-serif;
279+ background-color: #fff;
280+ margin: 0 auto;
281+ line-height: 1.4em;
282+ }
283+
284+#imageData{
285+ padding:0 10px;
286+ }
287+#imageData #imageDetails{ width: 70%; float: left; text-align: left; }
288+#imageData #caption{ font-weight: bold; }
289+#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
290+#imageData #numberDisplay a { color: black; padding-left: 5px; padding-right: 5px;}
291+#imageData #bottomNavClose{float: right; padding-bottom: 0.7em; }
292+#imageData #helpDisplay {clear: left; float: left; display: block; }
293+
294+#overlay{
295+ position: absolute;
296+ top: 0;
297+ left: 0;
298+ z-index: 90;
299+ width: 100%;
300+ height: 500px;
301+ background-color: #000;
302+ filter:alpha(opacity=60);
303+ -moz-opacity: 0.6;
304+ opacity: 0.6 !important;
305+ display: none;
306+ }
307+
308+
309+.clearfix:after {
310+ content: ".";
311+ display: block;
312+ height: 0;
313+ clear: both;
314+ visibility: hidden;
315+ }
316+
317+* html>body .clearfix {
318+ display: inline-block;
319+ width: 100%;
320+ }
321+
322+* html .clearfix {
323+ /* Hides from IE-mac \*/
324+ height: 1%;
325+ /* End hide from IE-mac */
326+ }
327+
328+#lightboxIframe {
329+ display: none;
330+}
331
332=== added directory 'multi_image/static/lib/lightbox/images'
333=== added file 'multi_image/static/lib/lightbox/images/blank.gif'
334Binary files multi_image/static/lib/lightbox/images/blank.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/blank.gif 2014-04-22 22:55:50 +0000 differ
335=== added file 'multi_image/static/lib/lightbox/images/close.gif'
336Binary files multi_image/static/lib/lightbox/images/close.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/close.gif 2014-04-22 22:55:50 +0000 differ
337=== added file 'multi_image/static/lib/lightbox/images/closelabel.gif'
338Binary files multi_image/static/lib/lightbox/images/closelabel.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/closelabel.gif 2014-04-22 22:55:50 +0000 differ
339=== added file 'multi_image/static/lib/lightbox/images/loading.gif'
340Binary files multi_image/static/lib/lightbox/images/loading.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/loading.gif 2014-04-22 22:55:50 +0000 differ
341=== added file 'multi_image/static/lib/lightbox/images/next.gif'
342Binary files multi_image/static/lib/lightbox/images/next.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/next.gif 2014-04-22 22:55:50 +0000 differ
343=== added file 'multi_image/static/lib/lightbox/images/nextlabel.gif'
344Binary files multi_image/static/lib/lightbox/images/nextlabel.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/nextlabel.gif 2014-04-22 22:55:50 +0000 differ
345=== added file 'multi_image/static/lib/lightbox/images/prev.gif'
346Binary files multi_image/static/lib/lightbox/images/prev.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/prev.gif 2014-04-22 22:55:50 +0000 differ
347=== added file 'multi_image/static/lib/lightbox/images/prevlabel.gif'
348Binary files multi_image/static/lib/lightbox/images/prevlabel.gif 1970-01-01 00:00:00 +0000 and multi_image/static/lib/lightbox/images/prevlabel.gif 2014-04-22 22:55:50 +0000 differ
349=== added directory 'multi_image/static/lib/lightbox/js'
350=== added file 'multi_image/static/lib/lightbox/js/jquery.lightbox.js'
351--- multi_image/static/lib/lightbox/js/jquery.lightbox.js 1970-01-01 00:00:00 +0000
352+++ multi_image/static/lib/lightbox/js/jquery.lightbox.js 2014-04-22 22:55:50 +0000
353@@ -0,0 +1,501 @@
354+/**
355+ * jQuery Lightbox
356+ * @author Warren Krewenki
357+ *
358+ * This package is distributed under the BSD license.
359+ * For full license information, see LICENSE.TXT
360+ *
361+ * Based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
362+ *
363+ *
364+ **/
365+
366+(function($) {
367+ $.fn.lightbox = function(options) {
368+ // build main options
369+ var opts = $.extend({}, $.fn.lightbox.defaults, options);
370+
371+ $(window).resize(resizeOverlayToFitWindow);
372+
373+ initialize();
374+ showLightbox(this);
375+ /*
376+ # Initialize the lightbox by creating our html and reading some image data
377+ # This method is called by the constructor after any click events trigger it
378+ # You will never call it by itself, to my knowledge.
379+ */
380+ function initialize() {
381+ $('#overlay, #lightbox').remove();
382+ opts.inprogress = false;
383+
384+ // if jsonData, build the imageArray from data provided in JSON format
385+ if (opts.jsonData && opts.jsonData.length > 0) {
386+ var parser = opts.jsonDataParser ? opts.jsonDataParser : $.fn.lightbox.parseJsonData;
387+ opts.imageArray = [];
388+ opts.imageArray = parser(opts.jsonData);
389+ }
390+
391+ var outerImage = '<div id="outerImageContainer"><div id="imageContainer" style="height: 520px; width: 720px;"><iframe id="lightboxIframe"></iframe><img id="lightboxImage" /><div id="hoverNav"><a href="javascript://" title="' + opts.strings.prevLinkTitle + '" id="prevLink"></a><a href="javascript://" id="nextLink" title="' + opts.strings.nextLinkTitle + '"></a></div><div id="loading"><a href="javascript://" id="loadingLink"><img src="'+opts.fileLoadingImage+'"></a></div></div></div>';
392+ var imageData = '<div id="imageDataContainer" class="clearfix"><div id="imageData"><div id="imageDetails"><span id="caption"></span><span id="numberDisplay"></span></div><div id="bottomNav">';
393+
394+// var outerImage = '<div id="outerImageContainer"><div id="imageContainer" style="height: 520px; width: 720px;"><iframe id="lightboxIframe"></iframe><img id="lightboxImage" syle="vertical-align: middle;" /><div id="hoverNav"><a href="javascript://" title="' + opts.strings.prevLinkTitle + '" id="prevLink"></a><a href="javascript://" id="nextLink" title="' + opts.strings.nextLinkTitle + '"></a></div><div id="loading"><a href="javascript://" id="loadingLink"><img src="'+opts.fileLoadingImage+'"></a></div></div></div>';
395+// var imageData = '<div id="imageDataContainer" class="clearfix"><div id="imageData"><div id="imageDetails"><span id="caption"></span><span id="numberDisplay"></span></div><div id="bottomNav">';
396+
397+ if (opts.displayHelp) {
398+ imageData += '<span id="helpDisplay">' + opts.strings.help + '</span>';
399+ }
400+
401+ imageData += '<a href="javascript://" id="bottomNavClose" class="ui-dialog-titlebar-close ui-corner-all ui-state-hover" title="' + opts.strings.closeTitle + '"><span class="ui-icon ui-icon-closethick">close</span></a></div></div></div>';
402+
403+ var string;
404+
405+ if (opts.navbarOnTop) {
406+ string = '<div id="overlay"></div><div id="lightbox">' + imageData + outerImage + '</div>';
407+ $("body").append(string);
408+ $("#imageDataContainer").addClass('ontop');
409+ } else {
410+ string = '<div id="overlay"></div><div id="lightbox">' + outerImage + imageData + '</div>';
411+ $("body").append(string);
412+ }
413+
414+ //$("#overlay, #lightbox").click(function(){ end(); }).hide();
415+ $("#loadingLink, #bottomNavClose").click(function(){ end(); return false;});
416+ $('#outerImageContainer').width(opts.widthCurrent).height(opts.heightCurrent);
417+ $('#imageDataContainer').width(opts.widthCurrent);
418+
419+ if (!opts.imageClickClose) {
420+ $("#lightboxImage").click(function(){ return false; });
421+ $("#hoverNav").click(function(){ return false; });
422+ }
423+
424+ return true;
425+ };
426+
427+ /*
428+ # Get the document and window width/heigh
429+ #
430+ # Examples
431+ #
432+ # getPageSize()
433+ # # => [1024,768,1024,768]
434+ #
435+ # Returns a numerically indexed array of document width/height and window width/height
436+ */
437+ function getPageSize() {
438+ var jqueryPageSize = new Array($(document).width(),$(document).height(), $(window).width(), $(window).height());
439+ return jqueryPageSize;
440+ };
441+
442+ function getPageScroll() {
443+ var xScroll, yScroll;
444+
445+ if (self.pageYOffset) {
446+ yScroll = self.pageYOffset;
447+ xScroll = self.pageXOffset;
448+ } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
449+ yScroll = document.documentElement.scrollTop;
450+ xScroll = document.documentElement.scrollLeft;
451+ } else if (document.body) {// all other Explorers
452+ yScroll = document.body.scrollTop;
453+ xScroll = document.body.scrollLeft;
454+ }
455+
456+ var arrayPageScroll = new Array(xScroll,yScroll);
457+ return arrayPageScroll;
458+ };
459+
460+ /*
461+ # Deploy the sexy overlay and display the lightbox
462+ #
463+ # imageObject - the jQuery object passed via the click event in the constructor
464+ #
465+ # Examples
466+ #
467+ # showLightbox($('#CheesusCrust'))
468+ #
469+ # Returns a boolean true, because it's got nothing else to return. It should give visual feedback when run
470+ */
471+ function showLightbox(imageObject) {
472+ /**
473+ * select, embed and object tags render over the lightbox in some browsers
474+ * Right now, the best way to fix it is to hide them, but that can trigger reloading of some flash content
475+ * I don't have a better fix for this right now, but I want ot leave this comment here so you and I both
476+ * know that i'm aware of it, and I would love to fix it, if you have any suggestions.
477+ **/
478+ $("select, embed, object").hide();
479+
480+ // Resize and display the sexy, sexy overlay.
481+ resizeOverlayToFitWindow();
482+ $("#overlay").hide().css({ opacity : opts.overlayOpacity }).fadeIn();
483+ imageNum = 0;
484+
485+ // if data is not provided by jsonData parameter
486+ if (!opts.jsonData) {
487+ opts.imageArray = [];
488+ // if image is NOT part of a set..
489+ if ((!imageObject.rel || (imageObject.rel == '')) && !opts.allSet) {
490+ // add single image to Lightbox.imageArray
491+ opts.imageArray.push(new Array(imageObject.href, opts.displayTitle ? imageObject.title : ''));
492+ } else {
493+ // if image is part of a set..
494+ $("a").each(function() {
495+ if(this.href && (this.rel == imageObject.rel)) {
496+ opts.imageArray.push(new Array(this.href, opts.displayTitle ? this.title : ''));
497+ }
498+ });
499+ }
500+ }
501+
502+ if (opts.imageArray.length > 1) {
503+ for (i = 0; i < opts.imageArray.length; i++) {
504+ for (j = opts.imageArray.length - 1; j > i; j--) {
505+ if (opts.imageArray[i][0] == opts.imageArray[j][0]) {
506+ opts.imageArray.splice(j, 1);
507+ }
508+ }
509+ }
510+ while (opts.imageArray[imageNum][0] != imageObject.href) {
511+ imageNum++;
512+ if (imageNum < opts.imageArray.length) {
513+ break;
514+ }
515+ }
516+ }
517+
518+ // calculate top and left offset for the lightbox
519+ var arrayPageScroll = getPageScroll();
520+ var lightboxTop = arrayPageScroll[1] + ($(window).height() / 10);
521+ var lightboxLeft = arrayPageScroll[0];
522+ $('#lightbox').css({top: lightboxTop+'px', left: lightboxLeft+'px'}).show();
523+
524+ if (!opts.slideNavBar) {
525+ $('#imageData').hide();
526+ }
527+
528+ changeImage(imageNum);
529+ };
530+
531+ function changeImage(imageNum) {
532+ if (opts.inprogress == false) {
533+ opts.inprogress = true;
534+
535+ // update global var
536+ opts.activeImage = imageNum;
537+
538+ // hide elements during transition
539+ $('#loading').show();
540+ $('#lightboxImage, #hoverNav, #prevLink, #nextLink').hide();
541+
542+ // delay preloading image until navbar will slide up
543+ if (opts.slideNavBar) {
544+ $('#imageDataContainer').hide();
545+ $('#imageData').hide();
546+ }
547+ doChangeImage();
548+ }
549+ };
550+
551+ function doChangeImage() {
552+ imgPreloader = new Image();
553+
554+ // once image is preloaded, resize image container
555+ imgPreloader.onload = function() {
556+ var newWidth = imgPreloader.width;
557+ var newHeight = imgPreloader.height;
558+
559+ if (opts.scaleImages) {
560+ newWidth = parseInt(opts.xScale * newWidth);
561+ newHeight = parseInt(opts.yScale * newHeight);
562+ }
563+
564+ if (opts.fitToScreen) {
565+ var arrayPageSize = getPageSize();
566+ var ratio;
567+ var initialPageWidth = arrayPageSize[2] - 2 * opts.borderSize;
568+ var initialPageHeight = arrayPageSize[3] - 200;
569+
570+ var dI = initialPageWidth/initialPageHeight;
571+ var dP = imgPreloader.width/imgPreloader.height;
572+
573+ if ((imgPreloader.height > initialPageHeight) || (imgPreloader.width > initialPageWidth)) {
574+ if (dI > dP) {
575+ newWidth = parseInt((initialPageHeight/imgPreloader.height) * imgPreloader.width);
576+ newHeight = initialPageHeight;
577+ } else {
578+ newHeight = parseInt((initialPageWidth/imgPreloader.width) * imgPreloader.height);
579+ newWidth = initialPageWidth;
580+ }
581+ }
582+ }
583+ if (newWidth > 700) {
584+ newWidth = 700
585+ }
586+ if (newHeight > 500) {
587+ newHeight = 500
588+ }
589+ var line_height = (newHeight / 100) * 7 + 24
590+ $("#imageContainer").attr("style", "line-height:" + line_height)
591+ $("#lightboxImage").attr("style", "line-height:" + line_height)
592+ $('#lightboxImage').
593+ attr('src', opts.imageArray[opts.activeImage][0]).
594+ width(newWidth).
595+ height(newHeight);
596+
597+ resizeImageContainer(newWidth, newHeight);
598+ };
599+
600+ imgPreloader.src = opts.imageArray[opts.activeImage][0];
601+ };
602+
603+ function end() {
604+ $('#overlay, #lightbox, #outerImageContainer, #imageDataContainer').remove();
605+ };
606+
607+ function preloadNeighborImages() {
608+ if (opts.loopImages && opts.imageArray.length > 1) {
609+ preloadNextImage = new Image();
610+ preloadNextImage.src = opts.imageArray[(opts.activeImage == (opts.imageArray.length - 1)) ? 0 : opts.activeImage + 1][0];
611+
612+ preloadPrevImage = new Image();
613+ preloadPrevImage.src = opts.imageArray[(opts.activeImage == 0) ? (opts.imageArray.length - 1) : opts.activeImage - 1][0];
614+ } else {
615+ if ((opts.imageArray.length - 1) > opts.activeImage) {
616+ preloadNextImage = new Image();
617+ preloadNextImage.src = opts.imageArray[opts.activeImage + 1][0];
618+ }
619+ if (opts.activeImage > 0) {
620+ preloadPrevImage = new Image();
621+ preloadPrevImage.src = opts.imageArray[opts.activeImage - 1][0];
622+ }
623+ }
624+ };
625+
626+ function resizeImageContainer(imgWidth, imgHeight) {
627+ // get current width and height
628+ opts.widthCurrent = $("#outerImageContainer").outerWidth();
629+ opts.heightCurrent = $("#outerImageContainer").outerHeight();
630+
631+ // get new width and height
632+ var widthNew = 730;
633+ var heightNew = 520;
634+
635+ // calculate size difference between new and old image, and resize if necessary
636+ wDiff = opts.widthCurrent - widthNew;
637+ hDiff = opts.heightCurrent - heightNew;
638+
639+ $('#imageDataContainer').animate({width: widthNew},opts.resizeSpeed,'linear');
640+ $('#outerImageContainer').animate({width: widthNew},opts.resizeSpeed,'linear', function() {
641+ $('#outerImageContainer').animate({height: heightNew},opts.resizeSpeed,'linear', function() {
642+ showImage();
643+ });
644+ });
645+
646+ afterTimeout = function () {
647+ $('#prevLink').height(500);
648+ $('#nextLink').height(500);
649+ };
650+
651+ // if new and old image are same size and no scaling transition is necessary,
652+ // do a quick pause to prevent image flicker.
653+ if((hDiff == 0) && (wDiff == 0)) {
654+ if (jQuery.browser.msie) {
655+ setTimeout(afterTimeout, 250);
656+ } else {
657+ setTimeout(afterTimeout, 100);
658+ }
659+ } else {
660+ // otherwise just trigger the height and width change
661+ afterTimeout();
662+ }
663+
664+ };
665+
666+ function showImage() {
667+ $('#loading').hide();
668+ $('#lightboxImage').fadeIn("fast");
669+ updateDetails();
670+ preloadNeighborImages();
671+
672+ opts.inprogress = false;
673+ };
674+
675+ function updateDetails() {
676+ $('#numberDisplay').html('');
677+
678+ if (opts.imageArray[opts.activeImage][1]) {
679+ $('#caption').html(opts.imageArray[opts.activeImage][1]).show();
680+ }
681+
682+ // if image is part of set display 'Image x of x'
683+ if (opts.imageArray.length > 1) {
684+ var nav_html;
685+
686+ nav_html = opts.strings.image + (opts.activeImage + 1) + opts.strings.of + opts.imageArray.length;
687+
688+ if (opts.displayDownloadLink) {
689+ nav_html += "<a href='" + opts.imageArray[opts.activeImage][0] + "'>" + opts.strings.download + "</a>";
690+ }
691+
692+ if (!opts.disableNavbarLinks) {
693+ // display previous / next text links
694+ if ((opts.activeImage) > 0 || opts.loopImages) {
695+ nav_html = '<a title="' + opts.strings.prevLinkTitle + '" href="#" id="prevLinkText">' + opts.strings.prevLinkText + "</a>" + nav_html;
696+ }
697+
698+ if (((opts.activeImage + 1) < opts.imageArray.length) || opts.loopImages) {
699+ nav_html += '<a title="' + opts.strings.nextLinkTitle + '" href="#" id="nextLinkText">' + opts.strings.nextLinkText + "</a>";
700+ }
701+ }
702+
703+ $('#numberDisplay').html(nav_html).show();
704+ }
705+
706+ if (opts.slideNavBar) {
707+ $("#imageData").slideDown(opts.navBarSlideSpeed);
708+ } else {
709+ $("#imageData").show();
710+ }
711+
712+ resizeOverlayToFitWindow();
713+ updateNav();
714+ };
715+
716+ /*
717+ # Resize the sexy overlay to fit the constraints of your current viewing environment
718+ #
719+ # This should now happen whenever a window is resized, so you should always see a full overlay
720+ */
721+ function resizeOverlayToFitWindow(){
722+ $('#overlay').css({width: $(document).width(), height: $(document).height()});
723+ // ^^^^^^^ <- sexy!
724+ };
725+
726+ function updateNav() {
727+ if (opts.imageArray.length > 1) {
728+ $('#hoverNav').show();
729+
730+ // if loopImages is true, always show next and prev image buttons
731+ if(opts.loopImages) {
732+ $('#prevLink,#prevLinkText').show().click(function() {
733+ changeImage((opts.activeImage == 0) ? (opts.imageArray.length - 1) : opts.activeImage - 1);
734+ return false;
735+ });
736+
737+ $('#nextLink,#nextLinkText').show().click(function() {
738+ changeImage((opts.activeImage == (opts.imageArray.length - 1)) ? 0 : opts.activeImage + 1);
739+ return false;
740+ });
741+ } else {
742+ // if not first image in set, display prev image button
743+ if(opts.activeImage != 0) {
744+ $('#prevLink,#prevLinkText').show().click(function() {
745+ changeImage(opts.activeImage - 1);
746+ return false;
747+ });
748+ }
749+
750+ // if not last image in set, display next image button
751+ if(opts.activeImage != (opts.imageArray.length - 1)) {
752+ $('#nextLink,#nextLinkText').show().click(function() {
753+ changeImage(opts.activeImage +1);
754+ return false;
755+ });
756+ }
757+ }
758+
759+ enableKeyboardNav();
760+ }
761+ };
762+
763+ function keyboardAction(e) {
764+ var o = e.data.opts;
765+ var keycode = e.keyCode;
766+ var escapeKey = 27;
767+
768+ var key = String.fromCharCode(keycode).toLowerCase();
769+
770+ // close lightbox
771+ if ((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)) {
772+ end();
773+
774+ // display previous image
775+ } else if ((key == 'p') || (keycode == 37)) {
776+ if(o.loopImages) {
777+ disableKeyboardNav();
778+ changeImage((o.activeImage == 0) ? (o.imageArray.length - 1) : o.activeImage - 1);
779+ } else if (o.activeImage != 0) {
780+ disableKeyboardNav();
781+ changeImage(o.activeImage - 1);
782+ }
783+
784+ // display next image
785+ } else if ((key == 'n') || (keycode == 39)) {
786+ if (opts.loopImages) {
787+ disableKeyboardNav();
788+ changeImage((o.activeImage == (o.imageArray.length - 1)) ? 0 : o.activeImage + 1);
789+ } else if (o.activeImage != (o.imageArray.length - 1)) {
790+ disableKeyboardNav();
791+ changeImage(o.activeImage + 1);
792+ }
793+ }
794+ };
795+
796+ function enableKeyboardNav() {
797+ $(document).bind('keydown', {opts: opts}, keyboardAction);
798+ };
799+
800+ function disableKeyboardNav() {
801+ $(document).unbind('keydown');
802+ };
803+ };
804+
805+ $.fn.lightbox.parseJsonData = function(data) {
806+ var imageArray = [];
807+
808+ $.each(data, function() {
809+ imageArray.push(new Array(this.url, this.title));
810+ });
811+
812+ return imageArray;
813+ };
814+ $.fn.lightbox.defaults = {
815+ triggerEvent: "click",
816+ allSet: false,
817+ fileLoadingImage: '/multi_image/static/lib/lightbox/images/loading.gif',
818+ fileBottomNavCloseImage: '/multi_image/static/lib/lightbox/images/closelabel.gif',
819+ overlayOpacity: 0.6,
820+ borderSize: 10,
821+ imageArray: new Array,
822+ activeImage: null,
823+ inprogress: false,
824+ resizeSpeed: 350,
825+ widthCurrent: 250,
826+ heightCurrent: 250,
827+ scaleImages: false,
828+ xScale: 1,
829+ yScale: 1,
830+ displayTitle: true,
831+ navbarOnTop: true,
832+ displayDownloadLink: false,
833+ slideNavBar: false,
834+ navBarSlideSpeed: 350,
835+ displayHelp: false,
836+ strings: {
837+ help: ' \u2190 / P - previous image\u00a0\u00a0\u00a0\u00a0\u2192 / N - next image\u00a0\u00a0\u00a0\u00a0ESC / X - close image gallery',
838+ prevLinkTitle: 'previous image',
839+ nextLinkTitle: 'next image',
840+ prevLinkText: '&laquo; Previous',
841+ nextLinkText: 'Next &raquo;',
842+ closeTitle: 'close image gallery',
843+ image: 'Image ',
844+ of: ' of ',
845+ download: 'Download'
846+ },
847+ fitToScreen: false,
848+ disableNavbarLinks: false,
849+ loopImages: false,
850+ imageClickClose: true,
851+ jsonData: null,
852+ jsonDataParser: null
853+ };
854+})(jQuery);
855\ No newline at end of file
856
857=== added directory 'multi_image/static/src'
858=== added directory 'multi_image/static/src/css'
859=== added file 'multi_image/static/src/css/hoverbox.css'
860--- multi_image/static/src/css/hoverbox.css 1970-01-01 00:00:00 +0000
861+++ multi_image/static/src/css/hoverbox.css 2014-04-22 22:55:50 +0000
862@@ -0,0 +1,52 @@
863+.hoverbox a .preview
864+{
865+ display: none;
866+}
867+
868+.hoverbox a:active .preview
869+{
870+ display: block;
871+ position: absolute;
872+ top: 0px;
873+ left: 0px;
874+ z-index: 1;
875+}
876+
877+.hoverbox .list_image
878+{
879+ background: #fff;
880+ border-color: #aaa #ccc #ddd #bbb;
881+ border-style: solid;
882+ border-width: 1px;
883+ color: inherit;
884+ padding: 2px;
885+ vertical-align: top;
886+ width: 150px;
887+}
888+
889+.hoverbox
890+{
891+ background: #eee;
892+ border-color: #ddd #bbb #aaa #ccc;
893+ border-style: solid;
894+ border-width: 1px;
895+ color: inherit;
896+ margin: 1px;
897+ padding: 0px;
898+ position: relative;
899+}
900+
901+.hoverbox .preview
902+{
903+ border-color: #000;
904+ width: 320px;
905+}
906+
907+.oe-remove-image
908+{
909+ cursor: pointer;
910+ vertical-align: middle;
911+ text-align: right;
912+ height: 15px;
913+ width: 15px;
914+}
915\ No newline at end of file
916
917=== added directory 'multi_image/static/src/img'
918=== added file 'multi_image/static/src/img/icon.png'
919Binary files multi_image/static/src/img/icon.png 1970-01-01 00:00:00 +0000 and multi_image/static/src/img/icon.png 2014-04-22 22:55:50 +0000 differ
920=== added directory 'multi_image/static/src/js'
921=== added file 'multi_image/static/src/js/multi_image.js'
922--- multi_image/static/src/js/multi_image.js 1970-01-01 00:00:00 +0000
923+++ multi_image/static/src/js/multi_image.js 2014-04-22 22:55:50 +0000
924@@ -0,0 +1,227 @@
925+openerp.multi_image = function(openerp) {
926+ var _t = openerp.web._t;
927+ var QWeb = openerp.web.qweb;
928+openerp.web.form.FieldBinaryImageMulti = openerp.web.form.FieldBinaryImage.extend({
929+ template: 'FieldBinaryImageMulti',
930+ init: function(field_manager, node) {
931+ var self = this;
932+ this._super(field_manager, node);
933+ this.binary_value = false;
934+ this.useFileAPI = !window.FileReader;
935+ this.max_upload_size = 25 * 1024 * 1024; // 25Mo
936+ if (!this.useFileAPI) {
937+ this.fileupload_id = _.uniqueId('oe_fileupload');
938+ $(window).on(this.fileupload_id, function() {
939+ var args = [].slice.call(arguments).slice(1);
940+ self.on_file_uploaded.apply(self, args);
941+ });
942+ }
943+ },
944+ initialize_content: function() {
945+ var self = this;
946+ var dataset = new openerp.web.DataSetSearch(this, 'res.users', {}, []);
947+ dataset.read_ids([openerp.session.uid], ['name']).then(function(res) {
948+ if (res)
949+ self.user_name = res[0].name;
950+ });
951+ this._super();
952+ },
953+ on_file_uploaded_and_valid: function(size, name, content_type, orignal_file_name, date) {
954+ if (name) {
955+ var data_dict = {"size": openerp.web.human_size(size), "name": name, "content_type": content_type, "date": date, "orignal_name": orignal_file_name, 'user':this.user_name};
956+ var data = JSON.parse(this.get('value'));
957+ if (data)
958+ data.push(data_dict);
959+ else
960+ data = [data_dict];
961+ this.internal_set_value(JSON.stringify(data));
962+ this.binary_value = true;
963+ this.set_filename(name);
964+ this.render_value();
965+ this.do_warn(_t("File Upload"), _t("File Upload Successfully !"));
966+ }
967+ else{
968+ this.do_warn(_t("File Upload"), _t("There was a problem while uploading your file"));
969+ }
970+ },
971+ on_list_image: function() {
972+ var images_list = this.get('value');
973+ var self = this;
974+ if (!this.get('value')) {
975+ this.do_warn(_t("Image"), _t("Image not available !"));
976+ return false;
977+ }
978+ this.image_list_dialog = new openerp.web.Dialog(this, {
979+ title: _t("Image List"),
980+ width: '700px',
981+ height: '70%',
982+ min_width: '600px',
983+ min_height: '500px',
984+ buttons: [
985+ {text: _t("Close"), click: function() { self.image_list_dialog.close();}}
986+ ]
987+ }).open();
988+ this.on_render_dialog();
989+ },
990+ on_render_dialog: function() {
991+ var images_list = JSON.parse(this.get('value'));
992+ var self = this;
993+ var url_list = [];
994+ if (images_list) {
995+ _.each(images_list, function (index) {
996+ if (index) {
997+ if(index['name_1']){
998+ url_list.push({'name' : index['name_1'], 'path' : index['name']})
999+ }else{
1000+ url_list.push({'name' : index['orignal_name'], 'path' : index['name']})
1001+ }
1002+ }
1003+ });
1004+ }
1005+ else { return false; }
1006+ var image_list = [];
1007+ var start = 0;
1008+ for(var i=1; i <= Math.ceil(url_list.length/4); i++) {
1009+ image_list.push(url_list.slice(start, start + 4))
1010+ start = i * 4;
1011+ }
1012+ this.image_list_dialog.$el.html(QWeb.render('DialogImageList', {'widget': this, 'image_list': image_list}));
1013+ this.image_list_dialog.$el.find(".oe-remove-image").click(function() {
1014+ self.do_remove_image(this, true);
1015+ });
1016+ },
1017+
1018+ render_value: function() {
1019+ var self = this;
1020+ this.$el.find('.oe-image-preview').click(this.on_preview_button);
1021+ this.$el.find('.oe_image_list').click(this.on_list_image);
1022+ var images_list = JSON.parse(this.get('value'));
1023+ this.$el.find('#imagedescription').remove();
1024+ var $img = QWeb.render("ImageDescription", { image_list: images_list, widget: this});
1025+ this.$el.append($img);
1026+ this.$el.find(".oe_image_row").click(function() {
1027+ if (this.id) {
1028+ var clicked = this.id;
1029+ var name_desc = "";
1030+ _.each(images_list, function (index) {
1031+ if (index['name'] == clicked ) {
1032+ var title = index['name_1'] ? index['name_1'] : ''
1033+ var description = index['description'] ? index['description'] : ''
1034+ name_desc = 'Title:-' + title + '<br/>Description:-' +description
1035+ }
1036+ });
1037+ self.do_display_image(this, name_desc);
1038+ }
1039+ });
1040+ this.$el.find(".oe_list_record_delete").click(function() {
1041+ if (this.id) {
1042+ self.do_remove_image(this, false);
1043+ }
1044+ });
1045+ this.$el.find(".oe-record-edit-link").click(function() {
1046+ var self_1 = this;
1047+ var data = JSON.parse(self.get('value'));
1048+ _.each(data, function(d){
1049+ if(d.name == self_1.id){
1050+ self.name_display = d.name_1 ? d.name_1 : '';
1051+ self.description_display =d.description ? d.description : '';
1052+ }
1053+ });
1054+ self.select_mo_dialog = $(QWeb.render('edit_name_description', {widget:self})).dialog({
1055+ resizable: false,
1056+ modal: true,
1057+ title: _t("Image Description"),
1058+ width: 500,
1059+ buttons: {
1060+ "Ok": function() {
1061+ var new_list = [];
1062+ var data = JSON.parse(self.get('value'));
1063+ if (self_1.id && data) {
1064+ _.each(data, function (index) {
1065+ if (index['name'] != self_1.id ) {
1066+ new_list.push(index)
1067+ }
1068+ else {
1069+ index["name_1"] = self.select_mo_dialog.find('#name_1').val()
1070+ index["description"] = self.select_mo_dialog.find('#description').val()
1071+ new_list.push(index)
1072+ }
1073+ });
1074+ self.internal_set_value(JSON.stringify(new_list));
1075+ self.invalid = false
1076+ self.dirty = true
1077+ self.render_value();
1078+ $(this).dialog( "close" );
1079+ }
1080+ },
1081+ "Close": function() {
1082+ $(this).dialog( "close" );
1083+ }
1084+ },
1085+ });
1086+ });
1087+ },
1088+ do_display_image: function(curr_id, name_desc) {
1089+ this.$el.find('.oe-image-preview').lightbox({
1090+ fitToScreen: true,
1091+ jsonData: [{"url" :curr_id.id, "title": name_desc}],
1092+ loopImages: true,
1093+ imageClickClose: false,
1094+ disableNavbarLinks: true
1095+ });
1096+ },
1097+ do_remove_image: function(curr_id, dialog) {
1098+ var self = this;
1099+ var images_list = JSON.parse(this.get('value'));
1100+ if (images_list) {
1101+ var new_list = [];
1102+ if (confirm(_t("Are you sure to remove this image?"))) {
1103+ _.each(images_list, function (index) {
1104+ if (index['name'] != curr_id.id ) {
1105+ new_list.push(index)
1106+ }
1107+ });
1108+ self.internal_set_value(JSON.stringify(new_list));
1109+ this.invalid = false
1110+ this.dirty = true
1111+ if (dialog) {
1112+ this.on_render_dialog();
1113+ }
1114+ else{
1115+ this.render_value();
1116+ }
1117+ }
1118+ }
1119+ },
1120+ on_preview_button: function() {
1121+ console.log(this.get('value'))
1122+ var images_list = JSON.parse(this.get('value'));
1123+ var url_list = [];
1124+ var self = this;
1125+ if (images_list) {
1126+ _.each(images_list, function (index) {
1127+ if (index) {
1128+ var title = index['name_1'] ? index['name_1'] : ''
1129+ var description = index['description'] ? index['description'] : ''
1130+ url_list.push({"url" :index['name'], "title": 'Title:-' + title + '<br/>Description:-' +description})
1131+ }
1132+ });
1133+ }
1134+ else {
1135+ this.do_warn("Image", "Image not available !");
1136+ return false;
1137+ }
1138+ this.$el.find('.oe-image-preview').lightbox({
1139+ fitToScreen: true,
1140+ jsonData: url_list,
1141+ loopImages: true,
1142+ imageClickClose: false,
1143+ disableNavbarLinks: true
1144+ });
1145+ },
1146+});
1147+
1148+openerp.web.form.widgets = openerp.web.form.widgets.extend({
1149+ 'image_multi' : 'openerp.web.form.FieldBinaryImageMulti',
1150+});
1151+}
1152
1153=== added directory 'multi_image/static/src/xml'
1154=== added file 'multi_image/static/src/xml/image_multi.xml'
1155--- multi_image/static/src/xml/image_multi.xml 1970-01-01 00:00:00 +0000
1156+++ multi_image/static/src/xml/image_multi.xml 2014-04-22 22:55:50 +0000
1157@@ -0,0 +1,126 @@
1158+<?xml version="1.0" encoding="UTF-8"?>
1159+<templates id="template" xml:space="preserve">
1160+
1161+ <t t-name="HiddenInputMultiFile">
1162+ <div t-attf-class="oe_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style">
1163+ <form class="oe_form_binary_form" t-att-target="fileupload_id"
1164+ method="post" enctype="multipart/form-data" action="/web/binary/upload_image_multi">
1165+ <input type="hidden" name="session_id" value=""/>
1166+ <input type="hidden" name="callback" t-att-value="fileupload_id"/>
1167+ <t t-raw="__content__"/>
1168+ <input type="file" class="oe_form_binary_file" name="ufile" accept="image/*"/>
1169+ </form>
1170+ <iframe t-att-id="fileupload_id" t-att-name="fileupload_id" style="display: none"/>
1171+ </div>
1172+ </t>
1173+
1174+ <t t-name="FieldBinaryImageMulti">
1175+ <table class="oe_form_field oe_form_field_binary" cellpadding="0" cellspacing="0" border="0" t-att-style="widget.node.attrs.style">
1176+ <tr>
1177+ <td class="oe_form_binary" nowrap="true">
1178+ <table cellspacing="0" cellpadding="0" border="0">
1179+ <tr>
1180+ <td>
1181+ <t t-if="!widget.get('effective_readonly')">
1182+ <t t-call="HiddenInputMultiFile">
1183+ <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
1184+ <t t-set="fileupload_style" t-translation="off">width: 83px;</t>
1185+ <button class="oe_button oe_field_button" type="button">
1186+ <img t-att-src='_s + "/web/static/src/img/icons/STOCK_ADD.png"'/>
1187+ <span>ADD</span>
1188+ </button>
1189+ </t>
1190+ </t>
1191+ </td>
1192+ <td>
1193+ <button class="oe-image-preview oe_button oe_field_button oe_form_binary" type="button" title="Preview">
1194+ <img t-att-src='_s + "/web/static/src/img/icons/gtk-zoom-fit.png"'/>
1195+ <span>Image Preview</span>
1196+ </button>
1197+ </td>
1198+ <td>
1199+ <button class="oe_image_list oe_button oe_field_button oe_form_binary" type="button" title="All Image">
1200+ <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DND_MULTIPLE.png"'/>
1201+ <span>List All Image</span>
1202+ </button>
1203+ </td>
1204+ </tr>
1205+ </table>
1206+ </td>
1207+ <td class="oe_form_binary_progress" style="display: none" nowrap="true">
1208+ <div class="oe_form_binary_progress" style="display: none">
1209+ <img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16"/>
1210+ <b>Uploading ...</b>
1211+ </div>
1212+ </td>
1213+ </tr>
1214+ </table>
1215+ </t>
1216+
1217+ <t t-name="DialogImageList">
1218+ <table id="DialogImageList">
1219+ <tr t-foreach="image_list" t-as="row">
1220+ <td t-foreach="row" t-as="column" >
1221+ <table class="hoverbox">
1222+ <tr background-color="white">
1223+ <t t-if="!widget.get('effective_readonly')">
1224+ <td style="height:17px;">
1225+ <span class="oe-remove-image oe_i" t-att-id="column.path" title="Delete Image" style="float:right;margin-top: -4px;">d</span>
1226+ </td>
1227+ </t>
1228+ </tr>
1229+ <tr>
1230+ <td>
1231+ <a style="cursor: default;" href='#' id="image_preview">
1232+ <img class="list_image" t-att-src="column.path" t-att-title="column.name"/> <img t-att-title="column.name" t-att-src="column.path" class="preview list_image" /></a>
1233+ </td>
1234+ </tr>
1235+ </table>
1236+ </td>
1237+ </tr>
1238+ </table>
1239+ </t>
1240+
1241+ <t t-name="ImageDescription">
1242+ <div id="imagedescription" class="openerp oe_list oe_view" style="display: block; height:160px;width:100%;overflow: scroll">
1243+ <table class="openerp oe_list_content">
1244+ <thead>
1245+ <tr class="oe_list_header_columns">
1246+ <th class="oe_list_header_char" t-if="!widget.get('effective_readonly')" style="width:3%;"></th>
1247+ <th class="oe_list_header_char" style="width:12%;">File Name</th>
1248+ <th class="oe_list_header_char" style="width:12%;">Title</th>
1249+ <th class="oe_list_header_char" style="width:25%;">Description</th>
1250+ <th class="oe_list_header_char" style="width:10%;">Size</th>
1251+ <th class="oe_list_header_char" style="width:20%;">Date</th>
1252+ <th class="oe_list_header_char" style="width:15%;">User</th>
1253+ <th class="oe_list_header_char" t-if="!widget.get('effective_readonly')" style="width:3%;"></th>
1254+ </tr>
1255+ </thead>
1256+ <tbody>
1257+ <tr t-foreach="image_list" t-as="row">
1258+ <td width="1" t-att-id="row.name" class="oe-record-edit-link" t-if="!widget.get('effective_readonly')" style="width:3%;">
1259+ <img t-if="!widget.get('effective_readonly')" src="/web/static/src/img/pencil.gif" />
1260+ </td>
1261+ <td class="oe_image_row" t-att-id="row.name" style="width:12%;"><t t-esc="row.orignal_name" /></td>
1262+ <td class="oe_image_row" t-att-id="row.name" style="width:12%;"><t t-esc="row.name_1"/></td>
1263+ <td class="oe_image_row" t-att-id="row.name" style="width:25%;"><t t-esc="row.description"/></td>
1264+ <td class="oe_image_row" t-att-id="row.name" style="width:10%;"><t t-esc="row.size"/></td>
1265+ <td class="oe_image_row" t-att-id="row.name" style="width:20%;"><t t-esc="row.date"/></td>
1266+ <td class="oe_image_row" t-att-id="row.name" style="width:15%"><t t-esc="row.user"/></td>
1267+ <td class='oe_list_record_delete' width="3%" t-att-id="row.name" t-if="!widget.get('effective_readonly')">
1268+ <button t-if="!widget.get('effective_readonly')" type="button" name="delete" class="oe_i">d</button>
1269+ </td>
1270+ </tr>
1271+ </tbody>
1272+ </table>
1273+ </div>
1274+ </t>
1275+
1276+ <t t-name="edit_name_description">
1277+ <div>
1278+ <h3>Title : <input t-att-value="widget.name_display" type="textbox" class="name_textbox" id="name_1" style="display: block; height:20px; width:450px;overflow: scroll"/></h3>
1279+ <h3>Description : <textarea type="textarea" class="field_text" id="description" style="display: text; height:160px;width:450px;overflow: scroll"><t t-esc="widget.description_display" /></textarea></h3>
1280+ </div>
1281+ </t>
1282+
1283+</templates>
1284\ No newline at end of file
1285
1286=== added directory 'multi_image_sample'
1287=== added file 'multi_image_sample/__init__.py'
1288--- multi_image_sample/__init__.py 1970-01-01 00:00:00 +0000
1289+++ multi_image_sample/__init__.py 2014-04-22 22:55:50 +0000
1290@@ -0,0 +1,25 @@
1291+# -*- coding: utf-8 -*-
1292+##############################################################################
1293+#
1294+# OpenERP, Open Source Management Solution
1295+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
1296+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
1297+#
1298+# This program is free software: you can redistribute it and/or modify
1299+# it under the terms of the GNU Affero General Public License as
1300+# published by the Free Software Foundation, either version 3 of the
1301+# License, or (at your option) any later version.
1302+#
1303+# This program is distributed in the hope that it will be useful,
1304+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1305+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1306+# GNU Affero General Public License for more details.
1307+#
1308+# You should have received a copy of the GNU Affero General Public License
1309+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1310+#
1311+##############################################################################
1312+
1313+import product
1314+
1315+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1316\ No newline at end of file
1317
1318=== added file 'multi_image_sample/__openerp__.py'
1319--- multi_image_sample/__openerp__.py 1970-01-01 00:00:00 +0000
1320+++ multi_image_sample/__openerp__.py 2014-04-22 22:55:50 +0000
1321@@ -0,0 +1,39 @@
1322+# -*- coding: utf-8 -*-
1323+##############################################################################
1324+#
1325+# OpenERP, Open Source Management Solution
1326+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
1327+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
1328+#
1329+# This program is free software: you can redistribute it and/or modify
1330+# it under the terms of the GNU Affero General Public License as
1331+# published by the Free Software Foundation, either version 3 of the
1332+# License, or (at your option) any later version.
1333+#
1334+# This program is distributed in the hope that it will be useful,
1335+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1336+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1337+# GNU Affero General Public License for more details.
1338+#
1339+# You should have received a copy of the GNU Affero General Public License
1340+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1341+#
1342+##############################################################################
1343+
1344+{
1345+ "name" : "Multi Image Sample",
1346+ "version" : "1.0",
1347+ "author" : "Serpent Consulting Services Pvt. Ltd.",
1348+ 'website': 'http://www.serpentcs.com',
1349+ "category": 'Image',
1350+ 'complexity': "easy",
1351+ 'depends': ['multi_image', 'product'],
1352+ "description": """
1353+ This module is used for added multi image widget in product.
1354+ """,
1355+ 'update_xml': ['product_view.xml'],
1356+ 'installable': True,
1357+ 'auto_install': False,
1358+}
1359+
1360+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1361
1362=== added file 'multi_image_sample/product.py'
1363--- multi_image_sample/product.py 1970-01-01 00:00:00 +0000
1364+++ multi_image_sample/product.py 2014-04-22 22:55:50 +0000
1365@@ -0,0 +1,34 @@
1366+# -*- coding: utf-8 -*-
1367+##############################################################################
1368+#
1369+# OpenERP, Open Source Management Solution
1370+# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
1371+# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
1372+#
1373+# This program is free software: you can redistribute it and/or modify
1374+# it under the terms of the GNU Affero General Public License as
1375+# published by the Free Software Foundation, either version 3 of the
1376+# License, or (at your option) any later version.
1377+#
1378+# This program is distributed in the hope that it will be useful,
1379+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1380+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1381+# GNU Affero General Public License for more details.
1382+#
1383+# You should have received a copy of the GNU Affero General Public License
1384+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1385+#
1386+##############################################################################
1387+
1388+from openerp.osv import fields, osv
1389+
1390+class product_product(osv.osv):
1391+ _inherit = "product.product"
1392+
1393+ _columns = {
1394+ 'multi_images': fields.text("Multi Images"),
1395+ }
1396+
1397+product_product()
1398+
1399+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1400\ No newline at end of file
1401
1402=== added file 'multi_image_sample/product_view.xml'
1403--- multi_image_sample/product_view.xml 1970-01-01 00:00:00 +0000
1404+++ multi_image_sample/product_view.xml 2014-04-22 22:55:50 +0000
1405@@ -0,0 +1,20 @@
1406+<?xml version="1.0" encoding="utf-8"?>
1407+<openerp>
1408+ <data>
1409+
1410+ <record id="product_normal_multi_imageform_view" model="ir.ui.view">
1411+ <field name="name">product.normal..multi.image.form.inherit</field>
1412+ <field name="model">product.product</field>
1413+ <field name="priority">5</field>
1414+ <field name="inherit_id" ref="product.product_normal_form_view"/>
1415+ <field name="arch" type="xml">
1416+ <notebook position="inside">
1417+ <page string="Images">
1418+ <field name="multi_images" widget="image_multi"/>
1419+ </page>
1420+ </notebook>
1421+ </field>
1422+ </record>
1423+
1424+ </data>
1425+</openerp>
1426
1427=== added directory 'multi_image_sample/static'
1428=== added directory 'multi_image_sample/static/src'
1429=== added directory 'multi_image_sample/static/src/img'
1430=== added file 'multi_image_sample/static/src/img/icon.png'
1431Binary files multi_image_sample/static/src/img/icon.png 1970-01-01 00:00:00 +0000 and multi_image_sample/static/src/img/icon.png 2014-04-22 22:55:50 +0000 differ
1432=== added directory 'portal_public_documents'
1433=== added file 'portal_public_documents/__init__.py'
1434--- portal_public_documents/__init__.py 1970-01-01 00:00:00 +0000
1435+++ portal_public_documents/__init__.py 2014-04-22 22:55:50 +0000
1436@@ -0,0 +1,2 @@
1437+import model
1438+import controllers
1439
1440=== added file 'portal_public_documents/__openerp__.py'
1441--- portal_public_documents/__openerp__.py 1970-01-01 00:00:00 +0000
1442+++ portal_public_documents/__openerp__.py 2014-04-22 22:55:50 +0000
1443@@ -0,0 +1,41 @@
1444+#-*- encoding: utf-8 -*-
1445+{
1446+ 'name': "Portal Document Public",
1447+ 'website': 'http://www.vauxoo.com',
1448+ 'category': 'Portal',
1449+ 'author': 'Vauxoo',
1450+ 'description': """
1451+With this module we will intend to build a "Public Link" to be served as public via http with and
1452+without allow the indexing of it.
1453+
1454+The plan: Extend document module adding a field "Public Link" which will be relative to the url
1455+base.
1456+
1457+Extend the ir_config parameters to configure the public folder and serve it as werkzeug is doing
1458+inside openerp.
1459+
1460+Share the link extending the "many2many tag widget."
1461+ """,
1462+ 'category': 'Tools',
1463+ 'depends':[
1464+ 'web',
1465+ 'base',
1466+ 'document',
1467+ 'portal_anonymous',
1468+ ],
1469+ 'data': [
1470+ 'view/ir_attachment_view.xml',
1471+ 'data/portal_public_document_data.xml',
1472+ 'data/ppd_scheduler.xml',
1473+ ],
1474+ 'demo': [
1475+ 'demo/portal_public_document_demo.xml',
1476+ ],
1477+ 'js': [
1478+ ],
1479+ 'css': [
1480+ ],
1481+ 'qweb': [
1482+ ],
1483+ 'installable': True,
1484+}
1485
1486=== added directory 'portal_public_documents/controllers'
1487=== added file 'portal_public_documents/controllers/__init__.py'
1488--- portal_public_documents/controllers/__init__.py 1970-01-01 00:00:00 +0000
1489+++ portal_public_documents/controllers/__init__.py 2014-04-22 22:55:50 +0000
1490@@ -0,0 +1,1 @@
1491+import main
1492
1493=== added file 'portal_public_documents/controllers/main.py'
1494--- portal_public_documents/controllers/main.py 1970-01-01 00:00:00 +0000
1495+++ portal_public_documents/controllers/main.py 2014-04-22 22:55:50 +0000
1496@@ -0,0 +1,41 @@
1497+# -*- coding: utf-8 -*-
1498+
1499+from web import http
1500+from openerp.addons.web.controllers.main import Binary
1501+openerpweb = http
1502+import simplejson
1503+import time
1504+import openerp
1505+import os
1506+import StringIO
1507+import xmlrpclib
1508+import base64
1509+'''
1510+class Binary(Binary):
1511+ @openerpweb.httprequest
1512+ def upload_attachment(self, req, callback, model, id, ufile):
1513+ Model = req.session.model('ir.attachment')
1514+ ModelXML = req.session.model('ir.model.data')
1515+ group_folder_id = ModelXML.get_object_reference(
1516+ 'portal_public_documents',
1517+ 'portal_public_mail_groups_folder')
1518+ out = """<script language="javascript" type="text/javascript">
1519+ var win = window.top.window;
1520+ win.jQuery(win).trigger(%s, %s);
1521+ </script>"""
1522+ try:
1523+ attachment_id = Model.create({
1524+ 'name': ufile.filename,
1525+ 'datas': base64.encodestring(ufile.read()),
1526+ 'datas_fname': ufile.filename,
1527+ 'res_model': model,
1528+ 'res_id': int(id),
1529+ }, req.context)
1530+ args = {
1531+ 'filename': ufile.filename,
1532+ 'id': attachment_id
1533+ }
1534+ except xmlrpclib.Fault, e:
1535+ args = {'error':e.faultCode }
1536+ return out % (simplejson.dumps(callback), simplejson.dumps(args))
1537+'''
1538
1539=== added directory 'portal_public_documents/data'
1540=== added file 'portal_public_documents/data/portal_public_document_data.xml'
1541--- portal_public_documents/data/portal_public_document_data.xml 1970-01-01 00:00:00 +0000
1542+++ portal_public_documents/data/portal_public_document_data.xml 2014-04-22 22:55:50 +0000
1543@@ -0,0 +1,52 @@
1544+<?xml version="1.0"?>
1545+<openerp>
1546+<data>
1547+ <record model="document.directory.content.type" id="png">
1548+ <field name="code">.png</field>
1549+ <field name="name">PNG Image</field>
1550+ <field name="mimetype">image/png</field>
1551+ </record>
1552+ <record model="document.directory.content.type" id="jpg">
1553+ <field name="code">.jpg</field>
1554+ <field name="name">JPG Image</field>
1555+ <field name="mimetype">image/jpg</field>
1556+ </record>
1557+ <record model="document.directory.content.type" id="jpeg">
1558+ <field name="code">.jpeg</field>
1559+ <field name="name">JPEG Image</field>
1560+ <field name="mimetype">image/jpeg</field>
1561+ </record>
1562+ <record model="document.directory.content.type" id="jpeg">
1563+ <field name="code">.jpeg</field>
1564+ <field name="name">JPEG Image</field>
1565+ <field name="mimetype">image/pjpeg</field>
1566+ </record>
1567+ <record model="document.directory.content.type" id="gif">
1568+ <field name="code">.gif</field>
1569+ <field name="name">GIF Image</field>
1570+ <field name="mimetype">image/gif</field>
1571+ </record>
1572+</data>
1573+<data>
1574+ <!-- Pre Create a public Folder. -->
1575+ <record model="document.directory" id="dir_public_root">
1576+ <field name="name">Public</field>
1577+ <field name="user_id" eval="False"/>
1578+ <field name="group_ids" eval="[(6,0,[ref('share.group_share_user')])]"/>
1579+ <field name="publish" eval="True"/>
1580+ <field name="ressource_id">0</field>
1581+ </record>
1582+ <!-- Pre Create a public Folder for mail.group. -->
1583+ <record model="document.directory" id="portal_public_mail_groups_folder">
1584+ <field name="name">Mail Group Folder</field>
1585+ <field name="user_id" eval="False"/>
1586+ <field name="group_ids" eval="[(6,0,[ref('share.group_share_user')])]"/>
1587+ <field name="publish" eval="True"/>
1588+ <field name="type">ressource</field>
1589+ <field name="parent_id" eval="ref('dir_public_root')"/>
1590+ <field name="ressource_type_id" eval="ref('mail.model_mail_group')"/>
1591+ <field name="resource_find_all" eval="False"/>
1592+ <field name="ressource_id">0</field>
1593+ </record>
1594+</data>
1595+</openerp>
1596
1597=== added file 'portal_public_documents/data/ppd_scheduler.xml'
1598--- portal_public_documents/data/ppd_scheduler.xml 1970-01-01 00:00:00 +0000
1599+++ portal_public_documents/data/ppd_scheduler.xml 2014-04-22 22:55:50 +0000
1600@@ -0,0 +1,13 @@
1601+<?xml version="1.0"?>
1602+<openerp>
1603+<data>
1604+ <record model="ir.cron" id="run_autovacuum_public">
1605+ <field name="name">Reset Public Files</field>
1606+ <field name="interval_number">60</field>
1607+ <field name="interval_type">minutes</field>
1608+ <field name="numbercall">-1</field>
1609+ <field name="model">ir.attachment</field>
1610+ <field name="function">run_autovacuum</field>
1611+ </record>
1612+</data>
1613+</openerp>
1614
1615=== added directory 'portal_public_documents/demo'
1616=== added file 'portal_public_documents/demo/portal_public_document_demo.xml'
1617--- portal_public_documents/demo/portal_public_document_demo.xml 1970-01-01 00:00:00 +0000
1618+++ portal_public_documents/demo/portal_public_document_demo.xml 2014-04-22 22:55:50 +0000
1619@@ -0,0 +1,18 @@
1620+<?xml version="1.0"?>
1621+<openerp>
1622+<data>
1623+ <record id="public_folder_paremeter" model="ir.config_parameter">
1624+ <field name="key">ir_attachment.plocation</field>
1625+ <field name="value">file:///static/files</field>
1626+ </record>
1627+</data>
1628+<data>
1629+
1630+ <record id="public_attachment_demo" model="ir.attachment">
1631+ <field name="parent_id" ref="dir_public_root"/>
1632+ <field name="datas">/9j/4AAQSkZJRgABAgAAAQABAAD/4AAcT2NhZCRSZXY6IDIwMTkzICQAAAAAAAAAAKj/4QC4RXhpZgAASUkqAAgAAAAGABoBBQABAAAAgAAAABsBBQABAAAAiAAAACgBAwABAAAAAgAAADEBAgALAAAAkAAAADIBAgAUAAAAnAAAAGmHBAABAAAAVgAAAAAAAAADAAGgAwABAAAA//8AAAKgBAABAAAALAEAAAOgBAABAAAALAEAAAAAAACA/AoAECcAAID8CgAQJwAAUGhvdG9TY2FwZQAAMjAwODowNzoxNSAxMDo1NjoxMAD/2wCEAAIEBAYIBggICAgICAgICAgKCgoKCgoKCgoKCgoKCgoKCgoKCgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBAggIEBAQEBAQECAgICAgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQP/AABEIAYYA3AMBIgACEQEDEQH/xADLAAAABgMBAQAAAAAAAAAAAAAABQYHCAkCAwQBCgEAAgIDAQEAAAAAAAAAAAAABQYEBwABAwIIEAABAgQDBQQFAw0JCg0FAAACAQMABAURBhIhBxMiMUEUMlFhI0JScYEIcpEVFiQzQ2KCobGywdHwVXOSlKLU4eTlGCU0U1RjZpWl1RdFRlZkdISFo6TE0vE1NkSzwhEAAQMDAgQDBQcDBQAAAAAAAgABAwQREgUhEzFBURQiMgZCUmFxFSORscHR8HKBoSQzotLh/9oADAMBAAIRAxEAPwC/yBAgRixCBAgRixCBGKrGN4xYtkalXWCSfqcvKsG/MOtsMtpcnHCQRT4rECsebcGZdpoKOUnMuzFh3zjvA1m0E92iap4qpWD106RBkkYd3dNNLRSzEwxjdWATMy002Tjpg2A6kZkginvUoiniXbRh6nsi6KvTyGbjYrLBnbVxtBUx3q2D1k5X/EsVM1ZrFFeqTMu9PNVJ99SyNsTInLtW9pGvRtX9XOnF4xKai7BsStEbBVcJWTNOIWs5qSkKIdmroH3ua91RLwqeJMvQCvz7FpoWEqipa/ZeO/KUnXH0CXpbQgRCg531Vxbrb1W8vXzhnsSbaK64/MM55uUMTcBBbmRDdki6XRJZCK3ztYsRwrsNoFMcF8Tm35gb+kN3ImvNMjdkt9PviVK0iSuhLLsEXtE2JF/CVL3849NDK7eaRaPUaCM/uaXJl8+9HxFiaZmmLuVJ/Kj98zs2ou3Au9lVUT7zKnOEd2DFq67qsr8JmPpTBoB7oiPuRE/JHR8Y4+BvzkdEh9qRF3caQF87tJPEUs1OlNSdZdbWWWxoUy2Uu5mTdviXv0JLKpDCfPGuLqeYCtVnwIm2zsTpGOVwUJLi5dLp1TpH0fKMFT9OlXUVHWWnUX22wL8qRngn6SOuI+0wOTudID3VOmG9tOJshuGrU2zYwBs2lJ7M0wrpObxoQQguPHfu5oeChfKVkXFQajT3mC6uS5b0P4B5S/LE3JnZ5Q3FzBL9mNN4iHKkUuqI7ZHNGlQeNERCXLdbRGuubGZ1G/711ycl8qIgNTGV1tETkm8RENPjmjthKPvXQzxWnzO+UOF1KHD2OaHUwFZOcacIr2ArtuLbnYHEFVt1y3h2rpFCGPMG4xlWJQp1qZmeyLML2lg96AoZCQ5d2iG3bL6w/GOnAu2jEElMMy0zNNTcnmQS7WpZmh62eEVc06ISHddIxqyz4mK6n7NOcby00okr6RjbEdcJbTaJV8jbLyNzRNiay7nC4l/C6Ih/gxIVChyEmfkvmyWEgfExs62wIxj2OqgL2BAgRixCBAgRixCBAgRixCPIEaYxaWarEZse7TKbQ2Hcy9onAbzpKtkmaxEgCTq+oOZU816JCD2n7R3ZBkpOlib1Rd9G2YMk82Li3u2iitt+g8WVb26peK48F4JexAM59kTxTcwo9pmXWEJht0XEcUTdV3OR2Hkg9bJaywqTVG+Ac1funaSJBx6ksQummxNjKv4lnmxd3jpKqCxKS6EoIviLfrF4kv4kidWE9ghzEvJOVtw2kl2SHsrRcXE6blnXfVSxIiiGvPiibeB9m9JoUvllg3kwSelmnE9K57vYH70fjeH95RAipPeke7pp1D2i2aKkHABSQouHqZTmEZkpVmWb00AURV+cXeJfNVWFkopBS3PS7jhtA6But2zgJIphm5Zx5jfpeK9MS7VKnN4jWgUQ2Jd1Cdb7U8GdCfEFLdCPIRumXPYlv0hmOQRZUdT0ks5F8mu91ZFeI3Yh2r4bpk0UrNTRJMhlzNg04ZJm5Xsltb+MQewVtKxWxixKJUiSofZJsO5Wx3jSj91AgEfRpzLMndXxho9vVNSTxa1Od7tTUu+or3czJZFG/wB8gpeAElV5Mh7q4KPQW8Q0MxeoLtZWHYy2yUqjTzUkbEzNzDrYGosZODefawXMSLnPoMSvknydl2nSbJonAElbKykCql8pZdLp1ihLB2KWpvHktUqm2KjNPrlzpwNEo5JckvoqNrlFC8dYv/HlE+nmzyf5pb1rThpuDHj5sd3TL4rx7SKJuFqDxMpMZ0bytk5fJbN3U80g4ouMKVUJBZ+WmgKUBVQ3CXdoCjzRzNbL8fGK5vlOOcdHDymy/G0kRZp1dk28LV2VlTJtmYGSIpZ3jcF7egJG24iIJtmidUEhWya84FHVOJkKdKbQBlpYZmcsiL9bL6BJaaadBCbcBwfECQk/FeO0oprwbisML4IbnEb309V5x5ZdslXIgNJu94evdG3TmqpCjpW1THQ0g65MS0g/SweyapuXCuat+iyqS5RLS5JrBFqodrpRk0CW54E2OVm6XVtuVIivi3ZNRKm3MKALIzL4ZTflxEd5ZcyI6Fsp2JEW+hffQ5OCcYydapQT8vmASIhcbPvNOB3wL8qL1FUWHZbdEkQhXMK9U1T6Ug07CbKrBOWA3s7iTOqLdoWBKjRGnHF3zrRN04G5loTyCsuhZzM1MiaW9kBOWt0WHK2a7d35e0pW3d5LCHo5qxE8Nu6DiCi7z53e98XCPtA6BNmIkBJYhJLiSL0VF5xXFjzYrIA0c3SKa2+7nU3JUph5q6c17PkXKi/er8IUDgMHyjJfR9Lq0FRHwasN+6sNptSl5thuYlnW3mHRzAYKhCSL5/lTmkKCKEaFtBLDdRXsBPHKE6oTdNeBwEZIVymTbjjh+lvflZF9aLq8N4lkKrItzsk6jrLn8IC9YHB5iSdfp5QwQzsf1VQ6lpMlPYrPi6cWPY1xsg6qrQgQIEYsQjFVjKNaxixYqUQW2r7S+xMu0ymuotXcBrhFM5ALhZcoW+7W4kRe6PEvSHO2n7QmKBTt59smpgsku0JWL793VF0BNdUVFKyRU/grCsriaqviKT6OZt/MzDsyBLxnZSS0tqa9BzDpy5QpVE3uDzX0Fo+ms4vUzs+Aor2Y4DqdbqyPZnmpaVmM8zM3JD3l7qDRc1eLqXqc1i9yiUKRp8o3LSjQtMh0TVSJeZmXMjLmRLqqxhQKFJ02Sak5RtGmGRsKdV8SJepEuqrDO7Rto8lQJS5pvpx4S7PL3tnVPWNfVbH1l5ryHWOsUTRDcnUHUK+WumEIx26MnwqtYlJGWcmZt5thhpLm4a2RP1r5JdYLHybqNMNZeYVG5uWLdPtLayOBwOCXil7xXbjZgcY4WYqtONxZuR1ekd4uVF+6ju/8YneaL1h05wvfk6VF13D8wy48452abIRA1T0QKAqgh62W9+fJeUdGnueNtnZQJNMwp3mz84nZ27KJuyCqTNHxs9ITxHvJonJR1TVVUnwJTZNVW68Wtl++SGfxp2ij45mnkQs7FRSZbv64ESOon4QqqRKT5QOGnZOoSlfk13ambYOkPqTDfEy7p7SJlX5qeMS2KiyGMcJyr0y3un5loXBeAU3jT4cCqi9RVUW4roorChwnfKPqzr6R+0QB4qxx8sg4l9Un6njeTl8NjiqQpDL782raPd0XW0W7aq66IKSoCigry84hjtWrMzU6Jh6v5BaccSbaMA42gND4bI5f2V538odug7E8Vy6HJnWW2qWauC4y0rho6DqZXPREKAJEnjmylxc4nHU9nVEm6RK0p6XJZOUVtWgEyFUUEtdSHVb3XN7V7wYeMzF77bKsQqqWlljICz8//Hsql9omHA+tfDtalzMs0q3LPKWUbHxOASZUS1nM4p5ZYt8wBiBKlh+nznMnJYEc/fG+Bz+Ul/jB9J4UpTVMCnDKtFIt2ysOJvQSy5vumbrrCskadKyrKMyzLbDQ3s22KAKXW62FPFYMxQ4lf5Ku6/UxmiGPF7ib2+jqs3b7TCn6nRmGClzeFTE2jfabcyvON5PRmSEollLlDG7a9nklSOzTdPXctzpbg5VFW29FM+cfvL2uPQrKkXAzuGqXMzTUzMScu9MMatOm2JGCpysSp06eENhjLZrTK3Myb82cwhSa8Agdmy40NcwKiprbUk1tpECalyz7umvTtc4XhxcnYQZ7qrvbLS3pZvDtOaaM+zUjUQEi9IRJn7qc1trDk7UHBpeA6FRuTr4tOOJy0Ad6eZPFXDT6FiYG1LAk9VJRXKc5MDOjkQQSbNhhRBc3csqKfTmHO6rER8R4LxLiedlO2SL1LKWaFn0pC6wsuJ5XXUdHXfX1RsvtgWIS0KA8sTtnZuasmh1CMxpXkNmGMnd/qivDFVdoOzWamroMxVpp0JUV04SHdbxEXnYRMvohvNls9jBinzk5TDcflJQ2A7I4m8aeccLjykZjukbDjMxW2uqQkto9SSqVuUotLQnJSm7uQlATVHHdBcd080tm9kVWFVSKRVajPzmFaRUDbpktnJ83NQccbsLpXbTNkcdvlDNbTrAdn8zM19lZBxNwZCNhvI+T36CrVsAY3brMq9mRoJuTeViabaPeNC50Jpz12y6L4oqQ/iaxR9jd9jC9MTD1MfIp2Y3b9TmwXKV0+1Mt2W4ePig89SiSGBNr82xLyEviBsg7Y3mlJsUzE40JbvPMtpxCl/uvdJOJfGHSOpa+Jc18x1miFhx4fS77N1Tv7Sdk0lVSWfl2Wu3A24hCWYW5lFAkHPu9d4C8QF6yplLRYhTsxpOLaMcxMNSZLlfYCYlnZlloTasauETanwujpkNbeyt0i6fS3T4RDHaTs8k5neVNmTWYmgHM/Lg92cJoWxKymqAWYw6J6yaeEepYGvmPNR6DVSwemle4v/O7KVtKqrM3LNvtLcTTVLopAXVs8qqiEPJdYV8UCbIto7dDn3GphXRp00YCoXRRYNStvSvxcI6FbnzXlF97TokKEJZhJEUVTkqKl0VPfE+CdjZKmraWVLJi/J+S7IEeR7BxVchCeqlQYlZZ2ZfNG2WGzccNfVAUuSwdqUV8bZ8fPyjzFLkllSeNl+YmUmMitbkQJBbITVBUj1JBXnl5cogyni13TPR0pTSDGKq8xhiWexJX1dADcV5wWJNhPVbvZsbdFLvGvjF4+zfA7FCpISw5SmTs5Mu+26qck+8Duj9PNYh3sLofbjdrc1ISTWRdzKKyzulzJ9scQc2TS+TNlzc9dIskqlSlpKVcmpl0GGGRzG4XdFP26QqUsXOQuqv/AF+vvhRxDYQ/NNjtCxi3QqM7PG2rpXFtoOhPOaAhL0HqqxXfJYqpOMaQ/I1s5eRqkqDj0tN6AGVNV5+HJxu/EPGOsSdldqWEsRTS0U2n3hmswBvWbNOqiX4dVIF0VRJUFUWK+tqWyB6hp2yUJ2YpxGubMl3JZeiOEneBeSH9MRqiQn8w7iimj0kQvwZmKOW92dNBs/xq/QKyMyBK9L5lbmGgVcrrS8OcU6qPfC6X6dYmji3BM+3MDiDCROPytREzmGGS4V3ne9EipmbK65x7zZXtaG/oTlJxXRgpTwsSVekm1WUfERbCbyp3DUUS5KicSc78Y+tEydieDK7SJB4ai7kafNSbk9CVkr8TmdFsmf2R966wLgjv5eisPVqwY3Ka2MjbOL+8yY/DuDMX1yny8hXFWXpLIjlQiUJzMJFkvzUsqcPpOHLZUXPrFndKpcvJyrMrLgjbDDYttgnQR/bXzg/QUjdlixI4mFfG9ZXnN0YWvyZC0Zx5GgygkklanHhAcxKginNV0RPNViLU7tnwu1PhJhMOTT5nk+xmidBC68acOnW14aTFVfr1Yrf1HpKyiU9Adbm3ycZeuhiomatg5nEW+6N04nOfKH+wdsuoFGabWWlkOZAbLMu8TyqqWKy8gRfZGyQDzIn8qtEaaGIMp3dydtmb9Uo8M7QaHV0PsU0hG2WU2zRW3BW6p3Ttztpa94ehFvEWKjs97P2h+gkxTpuYJDcRxrfS7hiuYS3al6M734xTrqkMHJ412iU2YcbqlJl5xgST07bjcuOvLduKWQvcQoUb4uPqZcvBBLkUBt9HfdWSLGg+UQ9PaXUHpQzlKfLi+hKO7enWTPuKQkLbGZSRSsFswr63KGUGm7Ta5Lp2l2VooKumQnW37Xv3G3C93Evwjq83ZndR4tOd7ucghb5p6arsrkZdydqNGYbl6q5LPAxmVdwDjl8zwB6jipdELupe8Q3w/wBswRQ52cn2wSrVQhalGMyGSI2KqTrpJdLIpZiG972TrEjA2a4qlpWXCXqsm67KkRiZhOA44ZLclddGaXMi8sqjl8oQxTs5PTb9DxhKSysk7eXnQdalzazdwmsx51BV4UMUVfVcRYWzHltZ1ctLM+JAUrSB1+KzfVVySNOdmWJyt1B4t008llMc6zs4a5kYG6pw9XS9QNE5xKybmsdYnGVbl6c1I0+ZlUaF1sAFrccizPkiuoC2+1ha6dF5we4q2fV2exHJ0luS3VCk1bFhWtGBlysTrhnpmfOyoXNb2ssO5tP2ty9IYWj0ZR7S0CMm4P2uUBByoAdFdRPgHXWF0Y8WLJ7N+auSasKYoODGJm/4CykbM47otB+plJnZxXZogYYI01yWFA30wqr6MSLxuvXlEn0VC5R882FNndQq4u1KfmOw0sVU5iembqTiX4t3n1NV5Zu7flflF2WAajR3qQy3SpspuWlU3KG4RG5we2p2L3KqWty0hxp5nLm1l83azpscLDw5HIve7Krrbps7bp0+lWl21GQm3ESYFtPtLy81FOSI7qqdM/viVOxXGzDqv0I3XjORT7EN9Q3rrCd5tci5VVpe74tqnsxNWv0KVqMhMycyOZmZaUC8UX1STzFdU84pSpuGqxQMSTLjPZGTlQc3CvzLWV9FyKgCrhCd3QzJmURyEtlW2sCjDhnkPJ0/U9UNZSFBMXnBtlfIKxthKUaptzco1MtqhA6KLoqEiL6w5hVRXKtx0VUukKe6w/r5JdrbOiybm2mWHHnCQW2myMy8BFMyr9EfNjWp2axFiVxwEUnajOC20Psgq5Gk9whZV+MXJ7ccRrT8MuAGrs861LgnK4qWd3lr3By6e1EdtlDCVbETtRmac/KvU6WbsrjpEm8dRRGzRsgWo5iQlJdOUItU2ZCF19V6Eb00M1U4X2srIMPURinU2VkWU9HLMg2nmqd4veRXVYra28Ynl0q9Opc6D500W0mJoWTyGZEeUFTmhbsUVcvXNzRbLFq48ohLtg2XlXJZuZlMg1CVEkBC0F9rUt1foWbUS+CwbqBfB2FVXo88bVQnO+zpL4G2c4V+qzNdpM3vJfIW5ls10adJLEt1XPcRv6MuS9bQhXcQ4ulcaCFVlf7z1KY7C20tjld2V90Ql/jF9bMiZ7qPRIr8lMC4xY+yJen1FsmJhUzNoQkDoc1EUXXwzWVF8VSJ97NsHYoqFXarOIHJkRlcu5Ze4ScMboBE0nCItqqldRzEWsKUZuVhYHbdfRVZThHxJTqgkbC2/P5WT20bYhSJHES1RpVVkONiVJLiy+q99CvqI/cw9VevKJqikdUexYQRsPpZfHVTVSTOzyHezLCApJAJdIhztM2lTNIdkZSQlEnZ+ecIQbVVyplypl4dc6qSW6InEukejPFruudNTnKbADbqYJLEDtqu1AZNg6bSyWaqkxZr0PpOzZ+Hiy39KXIAX5y8o7WMIYym55ZqbrHYZdxwHFp7JG8IaJcd8uVRut+5y6RJGiYRkpA3Tazkby5jzrmRTuq59U72veVVLzgc+RNtsm+IYYSEzJpLdP3TRbI8AfUOkrv0QqhNkjsyfVFXus3+8vxeJqSxLRI0iMdMEhDFmZkm1FQUplIb7usI1k2i80RY6IESEHRa3LtD3WwFfIUT8kdloyVY1iV4xbutloittZwK3W6G6AAnbJZCeljtxZkTibv4OJp77LErY5T5RHIcmdnRWnnKIxkB92dQ12V4gdqdCWnzbhDOyku206QqQuK0836F1FJEJHEThJehjziNkrsdpVCbnKxXn/qgxKqbjbI5uPi9HvVJbm6S6Ze7fUoccKhUadtMNgzccp88y33hRRaV5F3Qby2bLvgJAC9kUlskSS2m4Yfq+HJuSYWz5IDjSdCNo0NAX51rQr45Dy3FXl4gopmxPAJrO6iltar8pU9n7M5IFll3JqUu2Nh3ds92XBHRMhW4eV7LEVKdRvqPhKSxHKVN2WqLr/CxmTdzAC4oKzu/WyomYlW+i9NIwnsUySYJZw61ImzVTnMj7QJclcZcRd44i8Wd3uoPl7NomDhrZg7U8Ay1NqILKTYPPPS5GF3JfM6qjcefEN8w+aQvestueKuTIaWBgN7C8/4ipxYVrY1KkSU8I5O1S4OZfZJe8l/IrxBjbhhgW0OttsE4fYX5R8gWyhnyoy8vtWuQF96qeETvw3QmaZS5WQaIiblWhbQi7xW5kvmqqqxuxDIuTNNmmGyUHHWHBAvA1FcvPz535w9mGQWdfKtLVNDUZx+nL/Crp+TfireSs1SDNFWWXtDCX+5uLZwU+aev4UWjXj57cAY2n5HEkl2g2xDtKS74iyy3wmW6K5ACLwlYufSPoQTlAqikuFuyf/aWk4dRnjse6qE+UPNTkxVJCUl2n3RlGSeNWm3DyOulw6gi5SQQunviW+w6nTjeHe0zpTBTU6+44Svqe93YLu2hXecSIiDoPS8V9bUXm3a3PTSz81J/3xckczecmxCVlmSH0bZCREROEnPL5axc5h6VFmnSrQ6oEuyl+V+BLrZVW1/esRYWvKZI7qUmFDTQ90tbRiopGcew6r5hWrIkDKkbI1LGli9vHDMTAtgRmWUAFSIl5CIpdVWK6sd7T6rMVVaDhpveziFlemERFRtfWEM3AmT13C7q8IpeFtT9jSnNSk7PVGdN1thvfMi+44Lj9j3xE64V1Es1hFBHKiQF413sLXVl/Z2Agc8mOTcuqIMU7blIdxh6Tfqb7iq2EwjLiywnyuHD6RUX5o+Kwq9n+zqbYnPqvV33ZmdNFcabdUT7M4+AdoJVFLZ1UcooOjYIiJrdYkxhzCdLpLG5kJYWA9a2pF5kRKqqsORaNDE97m6yWtAQeOAMWfr1deCmkbbQEj1YOKs1rvGaQzuMqggSzMmDm7mKk+MqyuVS73E6VkVO60J8XRbQ7LACLYiPdEUFPcmiR4upThszrrgQIEe1GRc+8LYGZLYQFSXromqwwmAKhM1DtlUebdZGZfJuVacEgIJVhcoEQFZUJ08xrp1ROkJLbTKE9hac+yilG2zZccMQI1UBNLgqAqEqKtuS9IdbZ+oLh2mKGbKUkyqZs2ZeFNVzXXXnrA2/nsnNo2an4nVysnjjSXKN0algiktV37TKTOFiyiTcrxIwUsUy2N1cVsZoRbcy5VuDZGt19W94sKFIgRtbCUCqUeYdemWHEflxAmwzN5Umm1IHSExy7y+VFXMOkT5GA8fqNWJVk7w030dNDP7PsPzNRCoPyDLk2FrOaouYVRRMkRURSG2hLqkPEgxtgQUYUknIRWyK9ljaNJR0RqJI6qCvnn2rYYm5bFdQGXlnjB1xJlrdtmf2xEIsuVF0E7+7SLzsJVBycoshMmhA47KsqYkKiQnlRDQkXVFzXvFa/wAoiUVqrU2a7Q7Ki7JzDSm3nVc7RZxGwEi8Wa1+XjElNg9Vcfwo1vVdcJmZmW8xXJV4kc7yqqr3/wBEV/D5ZZBX1xqrlNQUsz+7t/PwVflVnpp2snTTkaS83M1Z2aEjdFXCI3spETiPjlLJw7pcq8NsixeywKINk5CiIieFo+dSjUSefxIE02wRS41qxOcKChDMZlTiVLqiL0vH0Yh1iVRvfNBfaSMQ8MIu3pW+BAgQ7L5iWCwzWPsR/UqgT08mVTZZJG0Lkrh8AItteaw8RRBTbfLzFQpYUuUJsphyYYcVvOgmSZ8oIgqli9YrZkXg5LA+Z7C9k3UEQnNGJ8rrs2H0JkKL9UylWZeaqRGZKGe6tIa5NXDJeJbmvjeJwDCRoVNCTkJWUBLDLS7TX8AUS/0wsY9xjYWZRayfiSyH3dZQIEeRNS2vYwKM4wWMWlHysyyO4no5E2we4lqi4hK56Zs1RoEVtrNxIt1Qiyll5aXiQAd2IsVckTHlFRfXpVVT6DYKJUjyiGPvfVM9Q3lh/p/V1sgQIETEsqLG2J5BwnULg04hI2OVwsoldwdO8KqvgiLqsPph+WFmnSbQpo3KsD7rNjpDA7ZG5osNu9mTM72mV9ju7yx9/h5L1+GsSbk09E3+9h+RIGt63+iczf8A08f9T/ojaMFSM48gkkxQz20y019SGXpZqReJmab3iTeQUy8x3bpmG7LeIPIrrEpKPOdokZZ/hu6w2a5SQhuQoqohDdC16pDMbWqUc5hSpMNhnc3OcB01JshL1tPjHHshJ7606cDyZXGWzaJLovccJE7qr0tAdvW/0VkELPSAV9xNScgQIEGFW6EeR7AjFigTt3pYTMhJ5kkhUXH7PTbhNA0qtcOQkVEUyKyIJXSI57MqpV6ZSDlUSWUUmnTHLMyx98W+ai7zvf4Wh9PlJIn1ty//AF9r8xyIW7O5CcOk5m6dKugr7lnHDyk5oHEqK6PLuaJbhiupX++5dF9mUMWWnjk+2aSrjVOZq8ufapxxpuuqWUpLdtDME+CPNi+rq3yoiLy6co+gMI+e/aFMNSk/Oyuf00tiOcmd3qnozbYMD8OJbxf3Tpjey7TqcnGmjT8IUWCFJ6jZKHtA146U+7OjyBAgQ6r5iRROzLTLRuullbaAjMl5IIoqkqxArZ+5K4grM9WEN51pieBWkdZ3YpkZyS4trnK+7RSM7ohZyRdEWHe20TbjeFpoGxdMpk5eXUWhzOKDriZ0BPFRRU+MKXZfRpaSw5T22BMRcZR8t4iI4pu8ZbzLpmTu/CApbmzKz4mEKY5PeIrfupDWjKPYEGlWCwLlCPCqNrUSk7rvBlhfVMvqE4raLm96Lp8YWBcojDLT5Ljybl1y5RokqY6cV1mHc1y6py06RHIrWRiGLLP5CpPpAWPBjKJCDqHuM3GWcX4ZeOYFoyKdYFtQMle3oilhIUyjYrLxLEvg5RA7bR6GZw/P5BLsk+8pKSXRE3BHy8bhdPNInPKvC4y24K3FwBNF8iTMkCgfzGye6kPuac/k/wCa74ECBBVIijjtUprE3heotPETbYs75TFvekKMkjlxbumZeHxh2MPTLT1Nk3miU23JVggK1swqA2W3S/h0g1qMkExLPsGlxfacbL3GKj+mIJbHtoNPCRSiTsw2xPU1x2XFHiQEdbbNUBRItMyJoo84FO9j+qfo4ikpyx3wL81YZeBeOYXBJLoqLfqnKEvUa3ISYEc1NS8uI6rvXBDT4rBO6RmF32ZlqxHJjM0ucly5PSr7a8OZeICTQeq+XWIkbCJqkDQ3JKRm3Zg5aYcJ5HmtyYk57DWYuDTvX71+sba7tCeq059RMPcTzzSG/UFRdzLS583G+pmSaByTNDXYo2OT0jMBVMMzBy800DaOMZvtuVEQiBV0VTtcmz4SW9lRVhXM/NkLXsrvp6dmiKCeTBz3b/1WcXj28RE2d7TW6vMTMhMAMvUpM3BNtLoLwAWVXG0Liunrj0vfurEuRhiE2fdlUlRTnEWBtutkeLHseRIQZV+fKIGXOgyzbr4sXnBIMwGedRbPhTJyXzXSIj4FOgN0zdqUxNmDzmd0GkbDMqCWUUcuS2RU4ltfwiRPyiKqABISZE1ldannVQwA1zA2It5cyKoqpKtiGywiNh+FlmsPuvacU++iadBbZH8qLFeHvN/ZfY9MWGmiRE/rRPthpjQVx9HZpWW51kDyb2UazaZDy71snFuqarm56JFhmzefbmMOyJNnvEaZFlSzi5qz6PUwRBVeHWyRCr5SdDzyVPqQpxMOnLuL946mYP5Qr9MbPk04gQpGeppFxMOpMNJ/m3dDt7jS/wCFEkCxmce6BVEHF02OZi9Dq0aPYwzRnD0vlVNjiumtzUiYGLx7om3wFk926rjBbwMhryXT4wwGCMbSn1IcM5hXWqepg+ZPpMuttiV23Xd22hlmRcprlumS5dbTGNIqhxvJHhPFjFbYS9MqTpNzbCckVxPTaWtlVPSDf1sydYBTPj5laenQjNnC/Pm37Ky2h4gp9SlkmZGYbmmVVUztrdMycxXqi+SwtkitnZ84zR8ZVCksnen1WXCoSKJ3dUzKIfg5vgCRZIMTIjyZLVdTNEdhfZ2uyyXlEG1m0b2p7tfu9BEU94Omf5LxOMuUVz4/eZkdoWG525IcwJy7vLJkXMA+d7uLEed9mf5o1pg5FKHeN1YsHKNixrHlGxYMqt1Ffa+wwuH3H3pd6ZblHAdJtlzduZVu0ZISgfdFxVtbpGWybE8tU8Oyyskd5ROzGLhIribpLAp5dLkFlv1iRU/ItzEu6w5q280bZ9FymmVYprkKTXcE4oaAVV6mzrotbyyq2836omidx8OSL8dR0hXlJwJi6K8aGEKinkhy847srrUWNkRXw5tfw1UGVc7T2Um0Tetviobu/tOW3fPS+bWF7M7R8MMjmcq0ig2v9uAtPcKqsG2kHnkq0OimEsXiK6eIoo8x5uvrjnRSdABCZcLJvZICF3TRANlVVBuV0O5XWLkpOpNz0nv5YjBt4VVszbUVy9HBA7LZeY5k18IbmkYKw9T3DcBmXOadInHZiYUHX3DJcxERnyuq8hRETpECePOybtMrGpykIhe9lWnSJWtHLsN0l+ukZm9vhCZbJpRGxq4BkyjTSHdRbES4j6Q5YbDJ6rudpqkxOybmQUEXZhufct5ubsfoVdItObyqPDbL0ty/FHciRG8KPV0ZLXZW3jFhdMhgvAkhRWCBjO664DIuvOWzmjIIAJpoIomuVNLw9+VIzjKGARtsyqCWUjJyN7uqzMelKUbG9KqAI+2tSytOoxu0Q3BdFvM7nRVykB2LIoquWLK279YrD2oAk/j/AA5T81hayOlz6uK50Tmotfriz0ICw+qT6qytRH7qkd/U4frst8cxLHTHA+8ANkZLYQFSJfBBS6r9EHlU6pr2+1tt2uNSrjpLKy7Qi620bW93i+kFbEOYU1TvLYvCLBNk9KZlMLU8WBdEHm1mPSZVNVeJTuWSw3tb4WijarTDtdxM8YXI6lP5G/mm5u20+AIkfSXIyTbEsywHcZabbH3AKCkIVI+Rma+tvaCPg0tJT33tdN3jigBUqHOyito4RtZmxK6IrjfG2lx11JLaa6xS/gPFspSsUME3KBKskfZZjK687wO5RVVVxfubmvLxi/leUUdbUMMTFKxTMvSlmpeqyk26N1QR+1r2ptMwql0X0gjzXpEmsH0myCezsok01MfvCrwx8o6oiDscxkNYoDOc7zcmgsTCX4lyp6Nz8Mfx3iX0NgHkzOvn6ppyikOM+bOsFhosZ4Xl6xSn5J5E4+IFXkLocQFfna+hW1yqsO/GKppHZ2uoEcjgQkL7sqL5PEjko9Ko/T0aqWG5jIIbx9byJOWeyKpXNWlK6IuZFaJFTlF4ku4hgJDqJIhJ7lS6RCPa/gmpzbQVOkOPhPyoEJNtGo75ldTQf85onz0052gk2T7Q8zY0SrTIpVWMu7Iy1fbMUMQUlt6ZtFymK66dYU4nwLF1fteLVMIzxcx5t/OisEWKyflIS+7k6VOgib5icURPW4aI4NraakGt/hFliF+OKzvlLVNtKVT5XN6R6bJ3LpdG2wVFX6S0ghVf7ZJT0C/jILd1YBhqq9tpkrM2yk6yCuAtlUHMqZwWyrqhXhexRRsf2sFSphZGdJx2SmnRynfMbDxqgXt/iy0zez3vGLKX9seFG0fvOmXZVVHsjLxIC5smqoNtS4RXqscoakSFnupepaLNDMQNG7spWxGHapPMMUgRcZamFmJyVZbB0jAc5FmQs7fGmXLe6e7lDcTe2+lC5LAzKz7qzjTrrN293mAM+VcqrnsZDYdIjRMOYxxdUJBw6X9T6dKv730qmAqq6Z1I0EzLLyQB0jck7WsO63RaZIxtJL5BZRQpmKJNqjVZr6jyi9oclwX0kyXrn1UvUtcOIVuvWOzAQU2o4ipkqdJlm2zmBzELkyqLuxVy5Z3FFV4db6RN+i/J2AJV5mfqJnvzacIZYMiIreeyZnM1+/7MIbHmEncIN02oUh+c7I3Nj2to3VISK6ZVVEGyIaIQL52hF4JtYibZl9TfadMbyRQE+Z8ufZWQi6k1UJqUJsVlZVphC7yKrryHcdFThRq3xXyjd9ZtD60+VLpxNia2TzK6wicP1qWfqJPtPZ5ary0vMSpX4c7I5Hmk6CaJlJR59/2ViQGkWo1nXwjI5A9t2TWT7H1OkjOny7SCyW+cZRFTeNp9tRqy2RzKlx6KqZbaw5UtMg8026C5m3QExLxEkzCvxSEPiCsS8qwYkWZ5xs0ZYHideNUVBEATVbr17qdVjvw9TylKbJy5qqmzLtAXzkFM3449KGXpu6XcYxpUk8YjXjradR6IwW8fbem10blgLM4pdFPKvACdVX4axhEzbushgOQmABu6jWkyy/tbRpWAM5WUuL2dzMNpflkzZNM9uXXxiysYr82S4Mnxqc/X6ouabnDcBjhUfRKXE7lXURPKKNiuqAl+sWBQLgvZ3fq6edVIcwAHvgDMtsRc2r4hWQw/N5G0eefaMAaXPxN6I+XBxJkbJVvfSJOKsU1bUMQyVVrU6yNSdbGQlH5dtpuWmXPSZh7U46rXqWTJ1S3OMqDsK3pFLxZhv6R3RRsJpEvP15ZkZBtlunN7zeI48fpj4AD0hKPLMXjF1ycoi7sfwgNIw+02S53polmHCykPfT0aZS1HKGXTxvEp4500eINdSdbq2mqDIfS2zLWoww+0TD0zPUl3sZo3UJdDdlXMoEWfLYm0zotkdC4F74f2NJJBkhu1lW0UjgQk3RUM7MNocxTaq6c5lCWQPsgG5dptftoN5jURQvRKSlb3pF7rMwDgCYKhAYoQki3RRVLoqe+Ks9smBnJVx+oU6mtvtT2s6oIauiQGDnCiHwtu5ePdjnzQ72xjE889JtyT9PdlGG2lWWPK+oZBPLuzcfVSVVW6hr3Ut5qm07uD8Ml9I6vHHURDVxDbup+R7GoVjbDwvmBaCC8M3WsFSky/2pguwz6LftbDbW9LhyoLimBZw8U0XTnD1Q0OMsYU+iyJTc45ZOTbafbHj6ACefVeQpqsRztbdGafiZs0d7uoorhPaFJXNmuhNACllZGUb1G+ZFUDMBuq+yUMNiPDOPag81aXemdSUlnm6fu2lVB0Zsp5BW18t/C911jmw5t+rKVRBn5RH5aedbVhtpMrrLbhZA3f+NFfPVVuqRb+OsKgCEjbE6v+pmqKMxeWGO7t2/ZVZ03YDUZlyVeqU/LMo3lMmZWWabMSvfIpgiAXzsqxN2mbMsNyu93dPYInwUHicu4rqEWcs6Etl4uLlzh+UTSNsGwpwHoqrqdWqJfVJskbIUCQlREZeWl2kBLDkbEcqc7Itr81vCqyax0wILJAInfm61ZYS9Zo8tPyb0pNAjjD4KBj5L1TwVOaL0WFbHkYtC7s7OyqsLAeIcOgrUg49UJBHnZi26BwmSAF3O7HMjoOqWhON8Ot1BbrCQHGm1Wcb3MvTHWL/dllxFxE8zcUQv8AfZE+mLe8qRiqaQvPT/CTsriHWfekgAy7uqsZDB207hfCdk5V55C32fITya8KK6gOKd+9bMiD4Qo3sL7WEWw1qTJPG6D/AOnWJKbTsdOYfpYzLcqcy46e6BfuTZW0J4vD2U9ZdIrDdxHjT6nNYkl6wc01viSZZBPRybnsPMFwbtbjZU08+sAZMR28ytWi4848TCEWd7NceqmNJ4K2jvgrc7iGWabJLEIso8qp4agEPRhrZRTJI0emd3PzCLdDclpdsRK90IRAL5k8SJVgj2ZbV5OvNqwY9nqLQXNq9wcRObjPil+Y8xiYg8oY4gB2Z23VPV9VUgZRGLB9GsggxmsZwicQVyWp0i7NzClumRVbCOYzX1WwHmRkugpBx1VYi5PZkwW1fHbFHppN9oWXnJsSCXIA3ph7T2TMOg8kW/etziCmx+ardaxE7MG6nZWWl7S+rDG+dEtG2HHUbzFvLXOypwousRuxXWKviOqia01wZp54W2OF/Ru9mmlQ/RDlvmMkRMy3WLzMGYWlqTIpLtACOGu9fIUREN0k1tlREyj3R8k84RAd5JL9GX1fUxx0VJg4s8kn+E7jaWS3hHRGCRnD6vkpCMYygRixEc7JNTDLjLo5m3BUSTyXTRei+C+MUqY+wlWKR2veVJezNkDtPedm3gmHlz51ARUlQ3WQ4emmvVYvFhucS4ZkarIOyc43vGXf4QF6rgF0Ien0LpAeaLJlY+mV7wSM7+lRN2Q7WG6uwMjOkIVNkea6JNAn3QP857YfhJE78yRTO1soSi1+UNx2eebYfbdbfFJRho1RVJEzuzKLmH1xyXLppE4MDY8edA5er7iWfbe3LDxTMuXa0UlQLA24tnbd5O6vSB0EhWxNN+rUkRG8tK9xdOTjzH1OoMjv5kszp3RiXH7Y+fgPgKesXIYprka63iXFDLtfmCCW49zLtoWQ7LwSjVu7vF4SPmS8N0VYuJxzg9auzLgKyY7l9CLtMsL6E0v2wB1QgJU6iv64hNt9Gn02k0uSkmWpU9+RtI22ImDbetwc74cap3V4lveB9Uxbu77MnDQZYmxiAX4h9eyavZTTX6pjp+dmZcmRkEcc3JAopLqnopVnIqcO7DkniN4djattRqEpiaSlKWWY5FV3wLfdvvPjlRkxRUzZAW/3pLeMpDFs5SNnQz8xMm9U6mrgyzh6vChcALnXiLdAiuXK+qxHmVwXW6uy1XKY2DswUkRTJmopvZtSdYd3KL93yJnO9hzqmTWAt3YcQ5vurJEAknKaoYcB8jdrqzLZ3tLla7JPubvs0xJ/4Q1mzIiZVVHALqC2X3W1h6aFiOnVKXCYk5ht4DG/CqZx8jDvCvviqTD+Fqhh7ClYmnxVqq1KW3MvKook6MuipvHFBNcw5iI7dwUvEFpCbcp7ErOyUwbU52h1eA1RRbaQEBTT74lLQuaQQ8W44ZMlJvZ6Kc53gkszFsvp+zJe0DOkU37RMe4hCvUpiWnJiSOYkKbv2m7ZRemSua5SRUUkQvxQ8+FsUVuQxadGqE+s+PZpqYmTNB9BkzONbshEebKCrg8sxfSxNUjeyqE9EkaMTyH03VlClCcqtakZGXKYnJhqWZHmbhZR15J718OcVQt7RcX146tNUuabkZOlMk8DYtiTjoXXKhKSLclESLoicocKhYhcxrhGpSE0Lf1TlAFwVBLC4Q8TLqD6qqQqBInw5xz8Sz7CpRaGYWKUmsztl8rqT+KdqtIptHl6oG8nZebcUGFYtYiRCVcynbL3V6X05QyG03bBP0lZRmSk21WelGphqZeK4JvOiAPMg0upFbyiuyRq/aMEVKlu/bafOMTjKFzFsy3UwKeGUyuvzliwaepmHqrgGlT9XV4W5KUZ9LLXJ0O6yYWRFzCqoma6ac9ICccjZ7PbZWcWlwUxx8UHL7x2/wCqcXCmBavMSc/9cNRSpN1Vlr0A6ts+shtHoiLqlsgomiLrFddEqD+EcTTdPqDe8p0wStTIGOYXZUs26fFORLbvWTXiHpE3tmFSnp6Y3dNqueh0wkaRuYa3k7MIQ50zkqDugDuNql14YVe2jCLU/Te3NSYzk5ICvAjhgRMFqSWb4jUF4xC6etHoguLEPNlGp6vhzyQT2xk/tbsq+MYYecw3XZKr0gidpzyjNSphmJADTOwZeyorYc3qrbmMXryEyj0sy8iKKPNg4groqZxQrKnjrFTWz7BOJqwEoc88/SqPJf4PKtZ2SdFSz5cpFmyL1NzMvNBS0WnVCqSslLq4+4DbYJ6xCOZUS+UMypcvjE+lG2RcmSvrs2bwxZMZj1RhUKjLS0ub8w6DLLaZiM1yiKeKqsUe7RsfzFXrrDXaTlKewa7hZZ0XDuV03xbs7bwuQjmuAr4lBnj7EeIsTkHZ2Uapeb0DPaZdDdW9kN5FdRVL2Qtw+a6xJXY7sYWUUKpVm07UmstLLYkY8HXOiueyPIOfe5C5TKV8RbZOtFSw0UbzzmznbknS2O4GqMjJ9vqj8y7OTSIQMuumSS7a8swkSpvSTvL6qcPjE6o15Y2w8AGLWXy7VVJSyFIXVCBAgRLQFCBAgRixCNaxsgRi0kFX8P0+pShys6wD7LiaiSXUV6GC8xNOhJrFJu0fZNOUKWVxgTmpLtJuI+IcbAZAEUfVOXFexpw9VssX3xxOtIYkJIJCSKiiSXRU8FRdIBzwMatHTNVkpjZx3bsqVNnm2+o08G5Wqg/OyPCITCCpPtIuiJe3pR/l+CrFoJy+HMS07VJeoSxotl9dtfz2jT4LEace7F3Jtq9HnHJLKQn2InD7HmQs2ZsU+1FfXkoX6DFfBU2s0KtS7Lc4VLnTF5X5lwnkl3jR01RSRQVDEhT2Vv3lhXYzj8ptdlexwU1Y/Fpz4cnb+forR8b7IKbV5GVZacdk3JBjcSyiudtA00Nte985LFEhcOUGXptNlZFkfRyzQhf2l9Y18yK5RCmkbcJaVaEKxNyEwaW9LTt65m6XJom0QfFcp8ukTLoeMKNUwE5KdYfzJ3UNEcT5za8SL8IZYyjd7jzVH1kdWMbRy5YM6ql2vYsdfxxIsyfpCpTku0I80OYdcFXBVPCyiBfGJtS+w7C6LLOOyxuPMmRmudRR8yIjs8A8KoJLw2y8kiQc7hSkTE41OPSUuc0waONvZER1DHkuZLKv4V4cO90jwEG5OW6mVGrPw4I4bhiO/wA1RJiwvqptK3IuE0Iz8vLAYWuHZ0HUPcSL8YevY1JsVFcRzUwpv1ZQfaR9w1It282Y/NupBZV+EOlQ9h89K4pGruz7Ew0MzMTChkMXFNzOo9VHQive/SMtkuzOvUeuz0zOq0Eu40YCLbmdHiNzOhKluHJ5+1CsER53Ieqvur1CAqco45fTGP57qNPydyVatU5MkLLMU4wLThQgPLr05EsF2wmZORxk9Iki2dampckXoTJZxVf4P44l5Vdm1ekKrLz9DeF1RmHXTlnFalJRBczIQkLSZ3CXN3iva0KfAuzOdlqqVYqYyIzp788sqJjkN1VQsx58jiKP3ia687x1jgJnjbs6h1WqRGNUeTfeA34soVbQpWlYcxBPnLgb89OCrjLLjI9il2pjV3eId0mLki5BtlBeesTn2azjlewWQTaNKTyTksYtti2GXVARADQbIqQusebMqZiA5U5snWjlc9iayoTgFzbVSRdM2t4cPDOGKXQqestKIrMuhk4SuuZuIrZiIiW3TySDMcLiZfCqwq9Sikpom83FZ+f0VNez7DOPGJubbpLTknnzS78w8ORpN2feFXE1JNcpAJaL7os/2c4AmaP2h+bqL89OTmRX1IlVpCG9lBCuV9VTNpp0jzEO2TDMg4LazgTDh5rbm5tiqf4x0LoOummZfKIJ4q2jVarbxuXr1Kpsrp6Ns5gHTRehvEyhF81vLA0cI/eunWYqqsvlE0Ylze3NTix1tXptHYfRr7MnGFASZBeFsnFJA3znIe6tw70VB4mrlexLMSSuNPzMw8sxuGWwXdW3n3EOVgThMy1vzKJESexSpVV5p9mqK9JTAtOPzDwPi4TuTiIG3BHe+AGvJOcWe4OwDS6JLCzKNqp2VDfc4nSvqWvqoq65RskeHCSX1bMu8VVSUIs8X3kijFst2JStMVufqYNTFQ7wN2QmpZeel04nfEuQ+r4xYckZx7DrHGwtZl8zVdXJObySFd0IECBE1LSECBAjFiECKIGflrGfLDA/62X/AHZHC58t/Ktlwwn+tv7MjtivF1fbAighflx/6L/7V/syMP7uX/Rf/av9mxxXtX9QIoE/u5v9F/8Aa39mx7/dy/6L/wC1f7NjFiv2UYSNXoMhPMKxOMNTDS+q4KFb5q8xXzFUWKNf7ub/AEX/ANrf2bGxPlxqv/Jb/a39mxpdBJ2e7OpX4r+TjJuKblImilTVFsw/dxq/gLnfFF889ohFWtk+JaYTrqtKjbAIu/bI0zcNyRpQRT0XTXLeFqny3FX/AJLp/rX+zI8/u3F/5rp/rX+zIVZKEH+Sv+k9p6qNsSLNvmkXRdruLZV4AGoEaZwHdTKCQJyGyqSZg89dOcSiD5R1Vln3Gpumyb2Q1HMw+ScvArGJW8UTWIjVX5V1FnlzTWCZR4kVCzlUEzoqetnSmIV/jDf1vHmG3Xd4mFzaJ0s6qzXHcpEa5lRUcpR/itaB/h5R9MidvtfT5X++pLfT+MrVaX8pClvui25TpppVQlUs7RCmUVJeqL00g4b+Udh47IMrUSJfVRoFL4Ih6xTJP4uozptPM0JWGkQkWXbqxkTi66qZ05SRU07tr25a3jlLHEozUWXwo4A3L29CzUCRHb37zhyBmq66r4aJaO+NR8kLItJfdhNtldIXyjaBu3DCUniVsc2UkaBSuSDYbnzhtJ75TjWvZqS4q9FeeFE+gBL8sVsSmK5fsbjDeGpdXHQQUmXJx03hReaipSSgh29YRSy62WMJByWRfS0CcmP+90bFdPH6j9Y4O0/dlOiPSWvkBup8yW3uuT2+BJdiWBGZs940hHl3cs4YgiuXTeZ0QtfVTuxCF+q4lrruUnahUjL1A3hh/ADgRPhD103aXJS7ih9ZTZ8QqqzFYMxIhb3WbJ9TMq8Gi8EO8z8popQhYbwxJsDe1m6koBztew0nlHjwxnbKRbj12ngcip6Rlw0bYJW52TkO1G3ThbF/eiY7x5EN3MPCK5bqP33DE+8I7GcN0nI4jHbJofu8zY1RfEG+4H8G/nEF5/5V8yxbPhxkr35VU+i2X/iqCSc+WE6wGdcNtkP3tVLlZFv/APS/CGMKUR3sqkq9cqZriUlmV2IhaM7RTUx8rR1xeCgMLysv1WPW/halQef3Uk3/AM3mP9auf7qibxB7quWhLsrfYEVDJ8qKb/5vsf61d/3THhfKinET/wC3mF/71c/3VHPjD3XvgH2VvUCKaj+VjMjzw61/rU/91wbf3U8xlQvqDLWVL3+qrv8AumJolfkoRg481b/AimQ/lbOItkoDBL5VVz/dUJaofLJelzECwyK5gzf/AFU+VyH9y/KJNlDuvnqbCZVOED6dI3dhmV1yFbz5w/csHoWr/wCKb/NGOlRT3wP4im4KLxgqLZUVI8h08Qyq7tt5B4cxCXzuY/ihrIlKOvLRlAjG8el5XkbxVekaY3pG1pdYlHTeOIY705ft7o7rgtJEqfGFR9XppctyTh/ZP26wkz/X+WFFRqbv3FI+FoEUiVeS/e38+vhHN3XZmupN4YcztIcwPPuimq+/4w9MlLSLZoS9nQl5Z8yn+esRyKqgZIxLinRCIfBPZ/WsKlqdZYH0Qbw+q5iRf4f/ALYUJJSTmEYqaLM40DaWM1O2mUsvPyVVT4fRHPOVXONl7Uxoq5iRN31Tqq8/HSIYN1t/KqOk2ALeyGjrhD7kFbfSsIacxEhFYRcJB9q+vuRF4YB4u6Kck/U9XWm3LBNKrqJ3u8JJ4KlrQnSqJTCpdboOa1v2+mI1TVefPTK20F+SAmvne14cHCtTIJxkiHMBEQkPtJ3dINAzjuhRWJPbX7EyBIml/fbNr+yw2MwglKWIdCb/AP6VFh8MQqw2uURbVDS9kIlVPd0hngsrRDl0TMKX1XVL/ihvjlYkryR4uo+U+oPS0xkIlyItk8LdP6YlZKzxFbN0T6U8YiXU2kXM4nql8YczClVzBuDXUEuC/e+HnaF+ePqmCmlUomXc0duX4whxNQK/TWFowaLCMn1JqYDW8IYmDV4Ws6iBL3fvvD3Q682wVtIQj7fDZdFTrBKKTF1DljzFK9mnMtDEd8YvtLON5cvCwif+I7BtO1zs63dOYJSXTuE2qeaLZUWGprFZlXnWyb3mjSIXCKcWY101XoqRarGzsqfIMXTvMN/Y7K/5pr8wY1k3B1K6yjP701+YMaCSExNNkkaqolTJhu3JRNF8xWI0JE0ZFtsldbcT0bgZV689LxD+aY3bxt3RchqOnvg0CEGyL4wjrEbrHXukibZQrrgyrHTkgxtHq+cdbLldcS6RuNOn7c40lqUeFqsaWIF+PT8sLh57dy4Sw8KJxH5kvNIQd1zj85Pyw6jLAvTXH4jdOnhA2R0ViZctMReO17qnPy8E/XDqU+lTJgrgplFNVv5fp90O/JYel22hQR8FXzvDyycsABltw25QlGasCOJQpJp4yL0RuWS3LS6fCMXJJxEERl+fO9/6In72Rrc5hbzL4Jpe8FQ0QPtjiorhKunMRjjkinDZQMcw88RZ0bEfp/b6YTRjMSzqKXDrotrInjyif8zKIifC8MvVaawWe4c7/TEhpFDKFkws5OluxJCXTpdV1/XHg15ttoVsqq54L1D1r+cIOcztOEC+PL8hfRClorQOgbRCK2W/LXWGiFkkTukJMTokpcNkP42TnbzhPsTKtPo43plLSHpdooI0ZoF+KyeEMrNs5HSGDpMlwXUuaPVWpplFXQr5V8l8P1eMLVp0ml4tU6LEH5CoOy7mYF09YehRLOjVqWmgRM1j6gvNPd4whyxWViwTX5p52XRIfGOGZlhVFggFDaVLLcYWkqhOCq65R7xdB/JC5ZM10yFSoyvCTWW+ZdPL4xG6pYcmpZwQd3YqQZ04k7qkSa+ekTfm6m20+jYCTprzQBzKieOkMJjB0u2NqSaqwOnh6RzSD0RuyCSxM+6V8kl5Zn95a/8A1isaiSOmRb+xmf3ln8wYzcTWCKWljI3zGniBfiiJ9TbRJp63JSv+SJbyn24PO6L8YiTUV+zHk8HFH6NILxoRIuYEjpjmBY64NoKtdoOKZLtuzjDTl8jjzYl80iTMifCCqN7JqMw0qc0cb/PSObrqPNTUx1hCl9jJ2TlQlnWURU3eaxjb1kVV4vWzeMQRTkqxZfVX1KTLzbK/8FbxWeq6e+F+Er3unCqjZsXZYML6YL+1+mHmpIocypJyRzT8UNtRpRH56WZXi3rzYLr7RWiWlSw+2zMtk00ksKvIKtgRGF/aAj1VFtr4L4xuZ1HgDqnwkUVVt5aQtgyiVkMCLqiEkIwmC3KCJEhF1TnaGleYkd9lXtQueIia31tqsJqfVLFCJETW6+f/AMR4Sl1ho6a+bLYiqqQXtn1Vfo56wpZyoE04g2JbpdE5+6NKUu9+/WGgqXNesGEzUKprkl28vmXF8fCENOTTq8LzeQ16pqK/RG15d1HXFLSIW8TnyX3QocISyrLG6qa5iFPh1+mEZiCZuaB3v1xI2n04GJJtsdOC6/OXiWLBgHZVRUFutjzQpKoK2tnv8c0RYxMwgvXTxUPimt4kVUJxwQyKrWXRLXRD81/TEf6yhkJKuUuLN+hUgxigLEmrjc26YFmBVFfKNMCIKnKRlExlb0Ux8Ch43Hpp5Mss82LCpdepa+CRA6HCw9OODNtBvCFtS116eEAZIerJriqH5OpbMNo0Po1W6lcnC1Iv1QzuKnkOZbXwYRP/ABHIdp1zhyDovXyt0hisRtkkw3qqehT89yFwOacjdPJJf4Mz+8s/mDGTvOOeSX7HZ/eWfzBjocgyklcjS8d/OI1YlYyVWYT2jzp+Gmb9MSU6wyGNQ+zGnPbZHXzFVT8kT4+agSJtmvGDGCpvnBlDElxeLCoolIm5ycaal2Hni3jebdgR5EzDxFbknvtCSPlFsOB6c5IUKV4ciTQ71wh0IyXXjVLLZPVTl5QPkKzIrFHk6ymaQ9uCaykpFdMqc9UVIrXrGDK3J59/ITQNgRek3RKFk63TRPjFt5PsXvdR+MGTlSZBgkV48poqEJLwqPXMK3SFOOTFP00WTMqRZBwmX2Xx0VtwDT8Fc0Wb1t8XWJMktlzg6nudS9vxxXdWVZWemd1wtK6WW2mnlE25GfCZw9Kvj32d024nsm2qAt/nJZYITb2dC6Z7OQpzJY2jFMyawpQlBvcLJ8P0Q2kuK6L0hzQnMofpSFRObMip9UBFFEDVU1QUS/6oJZvdrMih63btztytGY2cO6GhWXl4e+OGrWEhc8LfRHhdkVTWHZUiVxreAa39defjCPrDO6ZtmutrXh6QeE27xHLEs0tyRE5fqjuy4OmmptLSYmFMguObUl8ugp1VdYf9+yD5Qm5IhbZAU9kM3z7KpfljtdK6WizYG2VPVL7pOzkgTm7y+sQr3UsqZV+PPlDaVCnIuVNMy508Olrw4T9XMBaFBVbKCcPNfvUhpazPJuyERymakN0JVsmikXl9MEs0HYUwJJZVTqi2+iNd46nBsUc0CkSQjYhqi36xrj1YxbUosP1Nspdu7uZ3VFRV4s17wQ4mVO0t/vKfnuQwLbhASEK5SFbovhComaw++ok4oqQhl5eCqv6YAPFvdNgz7WdSjkv8HZ/eWvzBg0OCeTX7HZ/eWvzBjuIojLktCw2GMkzMSxeBmP0on6oc5VhHYmDNTjXqBtF7uir+OJIc1wLko5t84M+kEgLBnm0hoSqu5htTdbD23BH+EtotspL73ZWx1yoG7TW9kGycoq0w9Lk9VJZtP8aCp17uvL4RYjQKpcyataxHz584W6h060fNPGS39kU8dEjgVZfKqOE2QqNr87aRzq+RJlUbL4ePjCOnezZSR1BQVA0X6F1v+tYUE9Oq6cWbj6qzKMZUbRzTLy5dIUeFZ+YRp6XEk3JJndT74O7b48/KGhmiHeu5bqG8LKvlC+wiKuThN35sPL71tDyQ+RVex+dTClJ5Dbsun6YNCqyJoGqlyhlJWdyllXRf2vCuYk2zDMjmQ7rZeeW/zv1wguytEXWucaVSzgSNvc0INFvfkqclhKTKTThIj00bgD6ojkQre1a8O8zS28npEeNV9dsm7eaqKjCQqcglvRuPB4q5kL+Ta2vq8Wkd2W8UeyVVzZW+6vd8Pd+3jDY1ssz45upa+7VYOgRhoswXLd3Vcy+ta14bd59XXz1ug3G/iq69fCJsQXJC55MRSqZnf6YORev+35IQmZINGz15xZ6pl93Wc423nXMBWCxqorbVCvbXndFt74ZTEBgMwAglk3V0S914iW94dSbnh3yjoqci/CSy/tpDS15ngbc55LgX6Iirsm/c1XwgujNV1jBYjqWhAjyBHlbXsa1jZGtVja2plSf+Ds+TLX5qR3lHBI/4O1+8tfmpHYXOFZNK6LaWhOVfWSfG33I/xa/ohSJBdMBmEh9sTT3cBdY6MubqHox2ituccI/kiW2AcDG86k5PMkEqC3EC03xpysnspzXxhmckssyWuAcP9mlFqMwFnnbpLCQ6iFtXdfavpCqlKo03NarxJDkVepKLgKaoumUAFNGw6Qxk80Iuby28FV1vzhIMsnVixBiykb9UkcG5WXNz/b9ukNpWXpEmXkML3BUsilmVVRUSyX8f6YbkHnHk3TZGA/fFZE/C5rDf1aSfZfQVedUStZCy8XRcuXX6Y2Ea6STsmtPDioCk9MMM+A3Jwvcu74UX4wsMKyws1O+beDZwc2VQuqjddC1TLCtnGQZmGCRE0Atbc1TuaWt5RpojBblt/mRtE7mv6yuZj/TDEb7JJj9SVNelVadRxU4XNb+Bf0pHZJKqhclW3v0+MOf2ZqbliAvZSy/BLQwD7j8kasuIu7RdC6QlKyuW6cMxeQbIq2tdNVhOEjyqucl4YLG8Rt9fC3xhOzNZaPVOI/L9MYwru5ryZnSJSRFtyRE816QiJZos7ymeUUyW0JU1unTzS0K1mTLJvnNHDugJ7/1QWC9u58m0HgVhoVReSpcvy3hkh5pHqF1FLFYVQ0ISS+i6/FFssaSNGxI1L9H44MX3c6oLfDa+Xpy6e9Y3fW+sx/hCkAoqapZL+V76/CGniJLwTKS0/YzzcWYiVF669IXs282TJiSIvD9HgsKZ7BcsWrTht+GbiS/4lj13DM1u7I62587h+HKNMS24qO5M2jhhdVGkzrSZjb4PaFcw/SkIZUjwuy8tGqM4xtGLaF41rG6MI8rFMWSL7Ha/emvzBjt5rBVJL9jtfvTX5iQdgkK6amW+OB3ontGI/TpHcvP6IOKbKC9ONgf2pFIz+YGv9EaXpJrBGBGz+z6jmGWFwty0vN9RLvL4Noqc/WXl4xJefrSlYR4Ub0G3h4QmZ6qK6SCnA2KZRBOQiOiCkEeW5aRAkkui8UNkVvEpkpr3lWC92WsKmSrCxNoEhvaxMlkUUXSILI26bkqhxOZffaDGXnVdRWnNTTuEqcvFIZ3tfp1VPDL9CwcPTaKgOiuqd60OgsqtN9048/dxkfab7vn1t+LWN+HCz08de4rwfBSX9CwWNv5miPx6dbpCdolSCT7Y273RLeImmuce6n4tI7WXMX3UnKQ/u8gqvJERYX8/INO3zCi3TqnKIbyeLZg3RXs4o2RplHOqEutrCtufvibrBoTAn96nwv8AphOkCysuGXJkxM3hOnKF7GJX1RF5+a3jklcNSbSK7k5cr/t+SH5KVFS1uvwhIVZwGWTNdAbRVVfyfSsRbuitmTGTtydTy5eCJy+Kw084tqmqpr6AOfvyw5COEa51SynZVT3+cI6fl17U24nd3Tgl+DZYbo22Vazld11SAN5lMhRbfFPohaduW4p06Jyy/RCFb8OSJ4QY31/JE1BUsVnOtl8ukFLkwZOo1msLY7w1XqtroN4Lc3pBG+icX64TJOZlLXV47rb2R5W9/wCONrEtmlJy590F9rVMsMNWZFhDIpcrii2Nuy8Pjl8f0dYc+bmCy5BXIuTmPqp4J5+ME7cu2qLfQU59foj1daTDR5B3UJbdPGHq8x/C5QSRJXhexhHqxqjFisyo+zusPSrBN9jXPLy5ona2c1ibEtRvdFtzReUH57Paw3/kSr4JOMXX3IpQutmEsMsy0qk3vHWGlt1RMiKifFPf8ITeJpZjtCuOCr2clG4rfJfTl4+CLDINCLvbNQyqSFr4Js6jherMjvDlTUU6goOCnvUCWCanGQtPl1UWwv7y1SCyca7OaA0Rpcs3CSoXdtlunSDGTAllzW+guD9NlhQqafhva6YKefNdTa/GDZo1S6wkx8184U8uqcoRHVjijKYvlhoqwWQDv7P5dId11FUYZPFPCwfwjsHNQ5H2Ua23i3pe9V+N4MMy5UT8UFQcTnS+WDZsVt5/tyh1VaJVSTl7BdfFOeixyvS5vqWa3G+rl9eVsuSOqXYTJ3eesGjPdHrpGl7RDItq26KF6TIucc3Qh5Wix6n5ciDdcpIheNhNEJCHx5+6IFi36a9vV8P25xJ7C87vGABTIUaJGyVOJUb56D1VAXhS+pCiQHmTPSvun2MUHLnE2yXRMyZS8V4Fsul9VsiXXRViI2MKhvHdwTyNModzTUnniTkjbKcQthzu5kQl1h5Mc4nMXFGUNwTNSFk1Tjl5YeAFS6qSOmiW1Jci3IdbZYutU81FLJdS1JUzEWvtL4+8lWOMMamzTdEe1Nh2Tl2nheE962pgTqJxII3QUACuBfemt9UW+sIdZhx5ttXCAlshcCKKjm6Gl1iQLUlMTcpulk3XzA1LeC4gA2uQRzILTakRIIhcTcy8ltdYTD+HSbYIyAx7yXUVRMwpmXvcV+fv6Q0DEXZKJEmzbjZm4/yxzDe19O8sZIfj5/iiKuK2EdkcXra0cIrc9ERco8/dHrzlgstkuWtuflGsVtyXnzROkYsWZW1Xlm5W/JHEZ3sI++/n8IzOykuqWtf4QWkpWsPXur181jFpJGs5SyGPmH6oQsODVByy4JbXNmX9EN9EllxXkYxnGCx7WK2nZ0y44cuIiRIkuHjouRNE+jrBhWcPVhh517skxusx34VIcniVvjr+FyiROENp1Kap0jLycqSvDJSomSiLQ7wGAE1uPEXFfXrrDdVDbbUGpo0OTljZ3llEScE8t/VLkq6dU+EAYtNlyyZXLLrMdrYbKDtRdE5sR14SzInhotv2vBnLzSNoebpZfxEn6Y24gmRerbr4tq0L+ZwRX1R0tyRE8YTDhAhkq8siwyV13drqo6W27t3WRTF3EXoqQqZdyywgyFN0Lg6iSRqGpAPeW0V1ZWEzp3HZsMvOI64pnhJtRvqRae6O+crVhLpDTMyc1PkZN5bBzzLbnBKMeqGSFfZkWUwFV26+z8OkLuTZ58u8UGMhh2YbUVLJfyL+iFNLUt4DvwWW9+d/yQW4g90E8OfwrXum0Avdz6fCNEpyHz56QqnJNy2iWXkmv7XjmYp7ooN8vnHJ5G7r3wD+FERL6TL7SWRSW364eXBEpMOzpMMgpE5Lunl9rcjvcoX5ko5rD1WG8ORPx636QtsLzExT6rKzbbu6Jl0VzpzRCTIf8lV0jkRj3UoIjZ/S6JMSbz6pzKGJATR7lRNLFdvhUV+N7wcYQa3k0jVhNFVLCXdJULr9MEE4My/MPPuHncefddMlW6mThKV1X4/CDSg55adYdVUytmql81b30+iJsUrDbdcTgMvddSZqEqW9FpozaRl0gQGxVARO9nHUeL1Vte9khS7ntIkJZibJS4swrlcyInIdCG2q+F4KXq3SDTKag4nK5ByTXu+H6POCuYxdINh6IDOyWQGgsKW6IRKgp7+sS8hZ3LNGizIBDh8lDKbllafcbL1TIfoghNOE1vz6Q8+KAafnieYJFB9G3FT2TIE3g/gr9PSGwOReVEtlXXx5xC4g90AeA/hSYdJUyrqSar5rblGS6e8kuv8ARB+VPd3iFpa3LNAWQdUkWyfTGZt3XHgl8KIelrJZf2tHAIpxEScPu19yLBy5LqJbvkuW6r4dbxyGOezYjdBTT9cSUNdIt8DcF1VXXLon6obmHymGsqCiIt+v7WhnJppW3jHz0/REgVwXDGCxnGCx1WKznBlLNOzEDzJ5m2Fy3VDS7Y3RU/ZevlHJVZBqXnXCeeAjRxbANlQV8eVl8IWezmQbFqXdLMpm00qa5UEctra+Pj0hoq+Uos46gpMD6Rb5iAvx2TpH0ePP+yqouSR7r4uTmcc1kbJOL3/tyhBVB1SfFsfaFV90KUmwbecISUk3SfSvuhOy7PHmJUuWt/0R8/V3+46tOl9Cbh6pzUk+6whcGa6IuvCuukEJVAiLMpreF/itgVabdtxoeVC9sVFV/k/ihk8ml/O0BMWRTN0cTU3nSHnwa39jvr/nAT+SsR5iUGC217BMl/nwT+REGb0OmCje8oqUeDsNpUpwm3CUGmm8525r5c+cKqoPYcJzsstJuI5vgBHiPReNEW6ftzhC4ZxC5TZxHwHeIQ5XAX1h8IXtSruHnF3zEk+3Mq4BoufhSxIRRXbK6JMsk5OJdnaOzJLJEwygMCW6uuYsqXUv/mGD+s+b7FLzedvJMPoyia5hLMo69LaQ9H/CNLfVUpvcO7spTc5dL5vG0E1MxxTxp4y81LOu7qYV1vKVtcykil7rx6UMTkbokp/wfVFZ9yUzNeibFw3bruxEvfC8w3g+TWYnGXTZnlCVzgrarlQlv+O8ZLtFllqT7pSxrLTTDbZhfjRR90EdLxdSafNvuyks+LbzOWykhKh872WNLwRSJqq7hl2QFrfON53ERd0Opin314faj4Kp85Q2nbZJx3eZC8SBboPxhscTYlk6kwyasmE62ljcumU0jc1jAWqTKyrKGkxKzG9Q9Mtr3tHnZSXc3Fko6xgtEYpYMAXaplCRy5dURb+6ElUcAzjUu4+DzMwjS+lFtdW/nJDkVDaW2b8k+2x6SXUlcReRZksv6V+MF87jinjKzgyUu4Lk8Sq6ri8KX8I6bKKxSdkhpnZ/PNMA8bsuKOI3kHNxEproiadOsKFjALstPS4zW4eF1xBVpHFQiul83jaCiu4tZmzkFBtwexiKFmtrl8I7Z7GUu7XmZ8W3N22gXTrwpZbR52UrKRFzmBJmYnJzc7qWZl3cq5zuiKvS/OGJnJNWXTbUhNQLLcVuK+6JV0/HFPbnZuYNJtBmHt4IBlUCS3IkWI516pNTc6682yjQOFdBTp5xjqRGRdWTUzI+kW3NbX05xwCojp3fiiL+WHxp9GlnU3jnpC5ZVWwpb3c4cxqjNINkEQDyEbQ2hLZrKqZqe5PuocmqXupL+j4w19eZ1BxPm/8At/FEva1RW9Vyar1tZf5On4oijUwJN40XTX3+FvdBgJLpTkhxTYRgsZRh9MGUFVsOGGJqXlJchelzQpdhRRyVMsl2hVUuk4n5E8YcUpgiTjlqS4eqqZyJqq/+cgQIKlMfxKEMY9lrF9U//FpHK3+AH/PI1OE+t7S9FTnb+9x6X/7bAgQF5oio81XAjk4ak7NsJrdACTIQH5qds6wm/wDgsDLl7Y3Zf+hl/PIECPS0uX/goa/ywP4oX88hcyGCHZdk2gnW8pmhr9iFzT/tkCBEcm2U2MnZ2sjZcJvf5Y1/FS/nka1wi/8A5a3/ABQv53AgQJ4Q9k1vVSfEtH1oTP8Alzf8UX+dxoXBs1+6AfxP+tQIESOGPZQ3qZPiWn6y5v8AdIf4p/Wo2fWbN/uiH8T/AK1AgR34Q9lz8QfxILguatb6oB/E/wCtRh9ZM1+6Q/xP+tQIEc+EPZZ4g/iXiYJmv3SH+Kf1qMlwXN/ukmv/AET+tQIEb4Y9l345/E61Lgmb/dIf4n/WoxXBM2v/ABkKf9j/AK1AgR74Q9lH8QfxOuVcCTf7qL/Ff61Hn1hzf7qf+V/rUCBHThj2ULjn8SOJfCNRaSwVdUT/AKon85g0+t+sfu0X8UT+cwIEe2BuygvKXddiUSr5dao2XzpFF/8AUxw/WvUL3Wfli+dTxX/1MCBHpmXJydNzPbLimHzeOebQjX1JPKPwFJmGDxFgzsEyDXaEdzNId91k5mY2tvS9nx6wIESVFX//2Q==</field>
1633+ <field name="datas_fname">HelloWorld.png</field>
1634+ <field name="name">HelloWorld.png</field>
1635+</record>
1636+</data>
1637+</openerp>
1638
1639=== added directory 'portal_public_documents/i18n'
1640=== added directory 'portal_public_documents/model'
1641=== added file 'portal_public_documents/model/__init__.py'
1642--- portal_public_documents/model/__init__.py 1970-01-01 00:00:00 +0000
1643+++ portal_public_documents/model/__init__.py 2014-04-22 22:55:50 +0000
1644@@ -0,0 +1,1 @@
1645+import ir_attachment
1646
1647=== added file 'portal_public_documents/model/ir_attachment.py'
1648--- portal_public_documents/model/ir_attachment.py 1970-01-01 00:00:00 +0000
1649+++ portal_public_documents/model/ir_attachment.py 2014-04-22 22:55:50 +0000
1650@@ -0,0 +1,241 @@
1651+# -*- coding: utf-8 -*-
1652+##############################################################################
1653+#
1654+# OpenERP, Open Source Management Solution
1655+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
1656+#
1657+# This program is free software: you can redistribute it and/or modify
1658+# it under the terms of the GNU Affero General Public License as
1659+# published by the Free Software Foundation, either version 3 of the
1660+# License, or (at your option) any later version.
1661+#
1662+# This program is distributed in the hope that it will be useful,
1663+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1664+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1665+# GNU Affero General Public License for more details.
1666+#
1667+# You should have received a copy of the GNU Affero General Public License
1668+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1669+#
1670+##############################################################################
1671+
1672+import hashlib
1673+import itertools
1674+import logging
1675+import os
1676+import re
1677+from shutil import copyfile, rmtree
1678+
1679+from openerp import tools
1680+from openerp import addons
1681+from openerp import SUPERUSER_ID
1682+from openerp.tools.translate import _
1683+from openerp.osv import fields, osv
1684+_logger = logging.getLogger(__name__)
1685+
1686+
1687+class document_directory(osv.osv):
1688+ _inherit = 'document.directory'
1689+ _columns = {
1690+ 'publish': fields.boolean('Allow Publish',
1691+ help='If you want allow files under this directory be published '
1692+ 'directly as an http file.'),
1693+ }
1694+
1695+
1696+class ir_attachment(osv.Model):
1697+
1698+ '''OverWrite Document Class to ensure add the new coputeb field to know the public link'''
1699+
1700+ _inherit = 'ir.attachment'
1701+
1702+ def _get_anonymous_id(self, cr, uid, ids, context=None):
1703+ ir_model_data = self.pool.get('ir.model.data')
1704+ users_obj = self.pool.get('res.users')
1705+ anonymous_data_id = ir_model_data.get_object_reference(
1706+ cr, SUPERUSER_ID, 'portal_anonymous',
1707+ 'anonymous_user')
1708+ anonymous_id = ir_model_data.browse(cr, SUPERUSER_ID, [
1709+ anonymous_data_id[1]], context=context)
1710+ anonymous_brw = users_obj.browse(cr, SUPERUSER_ID, [
1711+ anonymous_id[0].id], context=context)
1712+ return anonymous_brw and anonymous_brw[0] or False
1713+
1714+ def _full_url_plocation(self, cr, uid, location, path):
1715+ # location = 'file:filestore'
1716+ assert location.startswith(
1717+ 'file:'), "Unhandled filestore location %s" % location
1718+ location = location[5:]
1719+
1720+ # sanitize location name and path
1721+ location = re.sub('[.]', '', location)
1722+ location = location.strip('/\\')
1723+
1724+ path = re.sub('[.]', '', path)
1725+ path = path.strip('/\\')
1726+ # TODO: Change for url manipulation lib
1727+ base_url = self.pool.get('ir.config_parameter').get_param(cr, uid,
1728+ 'web.base.url')
1729+ return os.path.join(base_url, 'portal_public_documents', location, cr.dbname, path)
1730+
1731+ def _get_public_path(self, cr, uid, ids, name, arg, context=None):
1732+ if context is None:
1733+ context = {}
1734+ res = {}
1735+ doc_brw = self.browse(cr, SUPERUSER_ID, ids, context=context)
1736+ a_id = self._get_anonymous_id(cr, SUPERUSER_ID, ids, context=context)
1737+ plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
1738+ 'ir_attachment.plocation')
1739+ for d in doc_brw:
1740+ if not d.store_fname:
1741+ res[d.id] = False
1742+ else:
1743+ if d and d.user_id == a_id:
1744+ res[d.id] = self._full_url_plocation(
1745+ cr, uid, plocation, d.store_fname)
1746+ else:
1747+ res[d.id] = False
1748+ return res
1749+
1750+ _columns = {
1751+ 'public_path': fields.function(_get_public_path, 'Public Path', method=True, store=False,
1752+ fnct_inv=None, type='char', size=1024, fnct_search=None,
1753+ help='''Public path for this file, if "Allow Public access is checked in the Folder and it
1754+ is owned by Anonymous."'''),
1755+ }
1756+
1757+ def _full_path_plocation(self, cr, uid, location, path):
1758+ # location = 'file:filestore'
1759+ assert location.startswith(
1760+ 'file:'), "Unhandled filestore location %s" % location
1761+ location = location[5:]
1762+
1763+ # sanitize location name and path
1764+ location = re.sub('[.]', '', location)
1765+ location = location.strip('/\\')
1766+ path = re.sub('[.]', '', path)
1767+ path = path.strip('/\\')
1768+ return os.path.join(addons.portal_public_documents.__path__[0], location, cr.dbname, path)
1769+
1770+ def publish_document(self, cr, uid, ids, context=None):
1771+ '''
1772+ Make Public a list of attachments.
1773+ A file is public IF the user_id is anonymous
1774+ '''
1775+ a_brw = self._get_anonymous_id(cr, uid, ids, context=context)
1776+ doc_brw = self.browse(cr, uid, ids, context=context)
1777+ location = self.pool.get('ir.config_parameter').get_param(cr, uid,
1778+ 'ir_attachment.location')
1779+ plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
1780+ 'ir_attachment.plocation')
1781+ dict_write = a_brw and {'user_id': a_brw.id} or {}
1782+ for d in doc_brw:
1783+ if d.parent_id.publish:
1784+ # Write in db first, if something happend, nothing happen
1785+ d.write(dict_write, context=context)
1786+ # TODO: This copy process must be done,
1787+ # 1.- With an user different and secure.
1788+ # 2.- Maybe this files will be accessed by a web-server too!
1789+ # explain clearly in documentation how to do that.
1790+ # 3.- Is secure use the same name?
1791+ # 4.- TODO: Always is insecure be in touch of make public a file, maybe sincronize
1792+ # with external tools like Gdocs, Dropbox or even put on a scp or ftp public server
1793+ # is a better approach
1794+ if not d.store_fname:
1795+ raise osv.except_osv(_('Security!'), 'Store Fname no setted Try to recreate'
1796+ ' the file or use an export/import script to convert this'
1797+ 'file in a file saved on the file system. '
1798+ '%s ' % d.store_fname)
1799+ if not plocation:
1800+ raise osv.except_osv(_(
1801+ 'Security!'), 'Public location not setted go to Setting')
1802+ destiny = self._full_path_plocation(
1803+ cr, uid, plocation, d.store_fname)
1804+ origin = self._full_path(cr, uid, location, d.store_fname)
1805+ try:
1806+ dirname = os.path.dirname(destiny)
1807+ if not os.path.isdir(dirname):
1808+ os.makedirs(dirname)
1809+ copyfile(origin, destiny)
1810+ except IOError:
1811+ _logger.error("Making public error writing from %s to %s" % (
1812+ origin, destiny))
1813+ #(location and plocation) and shutil
1814+ else:
1815+ raise osv.except_osv(_('Security!'),
1816+ _('You can not make public a File in a folder that is not '
1817+ 'explicitally marked as '
1818+ '"Allowe Publish" it is happening sharing the file'
1819+ '%s in the folder %s' % (d.name, d.parent_id.name)))
1820+ return True
1821+
1822+ def unpublish_document(self, cr, uid, ids, context=None):
1823+ doc_brw = self.browse(cr, uid, ids, context=context)
1824+ plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
1825+ 'ir_attachment.plocation')
1826+ for d in doc_brw:
1827+ dict_write = d.create_uid and {'user_id': d.create_uid.id} or {}
1828+ super(ir_attachment, self).write(cr, uid, ids, dict_write, context)
1829+ if not d.store_fname:
1830+ raise osv.except_osv(_('Security!'), 'Store Fname no setted Try to recreate'
1831+ ' the file or use an export/import script to convert this'
1832+ 'file in a file saved on the file system. '
1833+ '%s ' % d.store_fname)
1834+ if not plocation:
1835+ raise osv.except_osv(_(
1836+ 'Security!'), 'Public location not setted go to Setting')
1837+ destiny = self._full_path_plocation(
1838+ cr, uid, plocation, d.store_fname)
1839+ try:
1840+ os.remove(destiny)
1841+ except IOError:
1842+ _logger.error('I cant delete file %s' % destiny)
1843+ except OSError:
1844+ _logger.error('This file was already deleted. %s' % destiny)
1845+ return True
1846+
1847+ def unlink(self, cr, uid, ids, context=None):
1848+ plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
1849+ 'ir_attachment.plocation')
1850+ if plocation:
1851+ for attach in self.browse(cr, uid, ids, context=context):
1852+ destiny = self._full_path_plocation(
1853+ cr, uid, plocation, attach.store_fname)
1854+ try:
1855+ os.remove(destiny)
1856+ except IOError:
1857+ _logger.error('I cant delete file %s' % destiny)
1858+ except OSError:
1859+ _logger.error(
1860+ 'This file was already deleted. %s' % destiny)
1861+ return super(ir_attachment, self).unlink(cr, uid, ids, context)
1862+
1863+ def write(self, cr, uid, ids, vals, context=None):
1864+ self.check(cr, uid, ids, 'write', context=context, values=vals)
1865+ for i in self.browse(cr, uid, ids, context=context):
1866+ if i.public_path:
1867+ self.unpublish_document(cr, uid, [i.id], context=context)
1868+ return super(ir_attachment, self).write(cr, uid, ids, vals, context)
1869+
1870+ def run_autovacuum(self, cr, uid, context=None):
1871+ if context is None:
1872+ context = {}
1873+ def location_p(f):
1874+ return self._full_path_plocation(cr, uid, plocation, i)
1875+ a_brw = self._get_anonymous_id(cr, uid, [], context=context)
1876+ public_ids = self.search(cr, uid, [('user_id', '=', a_brw.id)], context=context)
1877+ _logger.info('Running Autovacuum Files all your public files will be reseted %s ' %
1878+ str(public_ids))
1879+ #I make no public, and then make public again, in this way we ensure all public information
1880+ #is reseted.
1881+ self.unpublish_document(cr, uid, public_ids, context=context)
1882+ plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
1883+ 'ir_attachment.plocation')
1884+ destiny = self._full_path_plocation(
1885+ cr, uid, plocation, '')
1886+ p_files = os.listdir(destiny)
1887+ _logger.info('Destiny folder %s was empty totally' % destiny)
1888+ if os.path.isdir(destiny):
1889+ [rmtree(location_p(i)) for i in p_files]
1890+ self.publish_document(cr, uid, public_ids, context=context)
1891+ return True
1892
1893=== added directory 'portal_public_documents/static'
1894=== added directory 'portal_public_documents/static/files'
1895=== added directory 'portal_public_documents/view'
1896=== added file 'portal_public_documents/view/ir_attachment_view.xml'
1897--- portal_public_documents/view/ir_attachment_view.xml 1970-01-01 00:00:00 +0000
1898+++ portal_public_documents/view/ir_attachment_view.xml 2014-04-22 22:55:50 +0000
1899@@ -0,0 +1,34 @@
1900+<?xml version="1.0" encoding="utf-8"?>
1901+<openerp>
1902+ <data>
1903+ <record id="view_attachment_public_form" model="ir.ui.view">
1904+ <field name="inherit_id" ref="base.view_attachment_form"/>
1905+ <field name="model">ir.attachment</field>
1906+ <field name="arch" type="xml">
1907+ <xpath expr="//sheet" position="before">
1908+ <header>
1909+ <button type="object" string="Publish" class="oe_highlight oe_inline" name="publish_document"
1910+ attrs="{'invisible': [('public_path', '!=', False)]}"
1911+help="This document actually is private and you can access it trought and http link if you click this button, to be able to share this kind of document you must ask access to administrator to be sure you have the correct acces rights to share internal documents, You must be part of 'Share User' group to put publically your own documents and you must be part od 'Share Manager' to share documents owned by others, 'All this is true if the folder allow Share Public Access'."/>
1912+ <button type="object" string="Unpublish" class="oe_highlight oe_inline" name="unpublish_document"
1913+ attrs="{'invisible': [('public_path', '=', False)]}"
1914+help="Stop share this document, If it is owned by you or if you are part of 'Share Manager' users.'"/>
1915+ <div class="oe_form_box_info oe_text_center" attrs="{'invisible': [('public_path', '=', False)]}">
1916+ <p>You can access to this file publically in the following link</p>
1917+ <field name="public_path" widget="url"/>
1918+ </div>
1919+ </header>
1920+ </xpath>
1921+ </field>
1922+ </record>
1923+ <record model="ir.ui.view" id="view_document_directory_publish_form">
1924+ <field name="inherit_id" ref="document.view_document_directory_form"/>
1925+ <field name="model">document.directory</field>
1926+ <field name="arch" type="xml">
1927+ <xpath expr="//field[@name='name']" position="after">
1928+ <field name="publish"/>
1929+ </xpath>
1930+ </field>
1931+ </record>
1932+ </data>
1933+</openerp>
1934
1935=== added directory 'web_allow_custom_root'
1936=== added file 'web_allow_custom_root/__init__.py'
1937--- web_allow_custom_root/__init__.py 1970-01-01 00:00:00 +0000
1938+++ web_allow_custom_root/__init__.py 2014-04-22 22:55:50 +0000
1939@@ -0,0 +1,30 @@
1940+from openerp.tools import config
1941+from openerp.addons import web
1942+
1943+web.controllers.main.html_template = """<!DOCTYPE html>
1944+<html style="height: 100%%">
1945+ <head>
1946+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
1947+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
1948+ <title>OpenERP</title>
1949+ <link rel="shortcut icon" href="""+config.get('favicon', '/web/static/src/img/favicon.ico')+""" type="image/x-icon"/>
1950+ <link rel="stylesheet" href="/web/static/src/css/full.css" />
1951+ %(css)s
1952+ %(js)s
1953+ <script type="text/javascript">
1954+ $(function() {
1955+ var s = new openerp.init(%(modules)s);
1956+ %(init)s
1957+ });
1958+ </script>
1959+ <script src='"""+config.get('gmaps_api_key', '')+"""' type="text/javascript">
1960+ </script>
1961+ </head>
1962+ <body>
1963+ <!--[if lte IE 8]>
1964+ <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
1965+ <script>CFInstall.check({mode: "overlay"});</script>
1966+ <![endif]-->
1967+ </body>
1968+</html>
1969+"""
1970
1971=== added file 'web_allow_custom_root/__openerp__.py'
1972--- web_allow_custom_root/__openerp__.py 1970-01-01 00:00:00 +0000
1973+++ web_allow_custom_root/__openerp__.py 2014-04-22 22:55:50 +0000
1974@@ -0,0 +1,86 @@
1975+
1976+#-*- coding: utf-8 -*-
1977+###################################################################################################
1978+#
1979+# OpenERP, Open Source Management Solution Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
1980+# All Rights Reserved
1981+# Financed and Planified by Vauxoo
1982+# developed by: nhomar@vauxoo.com
1983+# This program is free software: you can redistribute it and/or modify it under the terms of the
1984+# GNU General Public License as published by the Free Software Foundation, either version 3 of
1985+# the License, or (at your option) any later version.
1986+# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
1987+# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
1988+# the GNU General Public License for more details.
1989+# You should have received a copy of the GNU General Public License along with this program.
1990+# If not, see <http://www.gnu.org/licenses/>.
1991+###################################################################################################
1992+
1993+{
1994+ 'name': "Custom Init Template Parameters",
1995+ 'author': "Vauxoo",
1996+ 'category': "Hidden",
1997+ 'description': """
1998+Make customizable your html_template:
1999+=====================================
2000+
2001+Some things in the html_template variable are wired in the code.
2002+
2003+With this module we can pass them as parameters.
2004+
2005+1.- Favicon.
2006+------------
2007+
2008+Add the key: favicon in your config file mapping to your public available path, and it will be taken.
2009+
2010+i.e:
2011+
2012+code::
2013+
2014+ Relative:
2015+ favicon = /path/to/your/favicon.ico
2016+ Absolute:
2017+ favicon = https://url.com/path/to/your/favicon.ico
2018+
2019+ default:
2020+ '/web/static/src/img/favicon.ico'
2021+
2022+2.- Extra js Scripts.
2023+---------------------
2024+
2025+Add a key: script_extra_`NAME`
2026+
2027+code::
2028+
2029+ script_extra_addwords = '<script type="text/javascript"> <!--//--><![CDATA[//><!-- GA_googleFetchAds(); //--><!]]> </script>'
2030+
2031+3.- Gmaps API loaded.
2032+---------------------
2033+
2034+i.e:
2035+
2036+code::
2037+
2038+ gmaps_api_key = "https://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=SET_TO_TRUE_OR_FALSE"
2039+
2040+In this way you can put your customize loading stuff and/or namespace all your client to use your
2041+own css.
2042+
2043+If you put this module available in your addons path the variable will be overwritten and this
2044+options will be availables, change your config file and all will work smothly.
2045+
2046+This is used in http://www.vauxoo.com see how it loads all this information very quickly.
2047+ """,
2048+ 'version': "0.1",
2049+ 'depends': [
2050+ 'web',
2051+ 'base',
2052+ ],
2053+ 'js': [
2054+ ],
2055+ 'css': [
2056+ ],
2057+ 'qweb': [
2058+ ],
2059+ 'installable': True,
2060+}
2061
2062=== added directory 'web_allow_custom_root/static'
2063=== added directory 'web_allow_custom_root/static/src'
2064=== added directory 'web_allow_custom_root/static/src/img'
2065=== added file 'web_allow_custom_root/static/src/img/icon.png'
2066Binary files web_allow_custom_root/static/src/img/icon.png 1970-01-01 00:00:00 +0000 and web_allow_custom_root/static/src/img/icon.png 2014-04-22 22:55:50 +0000 differ
2067=== added directory 'web_binary_icon'
2068=== added file 'web_binary_icon/__init__.py'
2069=== added file 'web_binary_icon/__openerp__.py'
2070--- web_binary_icon/__openerp__.py 1970-01-01 00:00:00 +0000
2071+++ web_binary_icon/__openerp__.py 2014-04-22 22:55:50 +0000
2072@@ -0,0 +1,89 @@
2073+# -*- coding: utf-8 -*-
2074+##############################################################################
2075+#
2076+# OpenERP, Open Source Management Solution
2077+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
2078+# Financed and Planified by Vauxoo
2079+# developed by: nhomar@vauxoo.com
2080+#
2081+# This program is free software: you can redistribute it and/or modify
2082+# it under the terms of the GNU General Public License as published by
2083+# the Free Software Foundation, either version 3 of the License, or
2084+# (at your option) any later version.
2085+#
2086+# This program is distributed in the hope that it will be useful,
2087+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2088+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2089+# GNU General Public License for more details.
2090+#
2091+# You should have received a copy of the GNU General Public License
2092+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2093+#
2094+##############################################################################
2095+
2096+{
2097+ 'name': "Web Binary Icon",
2098+ 'author': "Vauxoo",
2099+ 'category': "Hidden",
2100+ 'description': """
2101+Binary Icon plugin.
2102+===================
2103+
2104+When you are using a binary field, it is cool, if depending of the extension
2105+the field show the icon of the app, something like the plugin for gmail does,
2106+recognizing the extension and showing the correct icon.
2107+
2108+Files to consider TODO:.
2109+
2110+All openoffice extensions:
2111+
2112+ * .odt
2113+ * .odp
2114+ * .odf
2115+
2116+All Ms Office extensions:
2117+
2118+ * .xls, xlsx
2119+ * .doc, docx
2120+ * .ppt, pptx
2121+
2122+All text extentions:
2123+
2124+ * .txt
2125+ * .rst
2126+ * .xml (Usefull for electronic invoices.)
2127+
2128+Links as attachments should be cool of recognize too!.
2129+
2130+ * .googledoc
2131+
2132+Images should be usefull, probably working in thumbnails feature.
2133+
2134+ * .jpg
2135+ * .png
2136+ * .gif
2137+ * .jpeg
2138+ * .svg
2139+ * .gimp
2140+
2141+Other Formats usefull in the middle.
2142+
2143+ * .project
2144+ * .planner
2145+ * .Xmind
2146+ * .log
2147+""",
2148+ 'version': "1.0",
2149+ 'depends': ['web'],
2150+ 'js': [
2151+ 'static/src/js/lib.js',
2152+ ],
2153+ 'css': [
2154+ ],
2155+ 'qweb': [
2156+ 'static/src/xml/lib.xml',
2157+ ],
2158+ 'installable': True,
2159+ 'auto_install': False,
2160+ 'web_preload': False,
2161+}
2162
2163=== added directory 'web_binary_icon/i18n'
2164=== added directory 'web_binary_icon/static'
2165=== added directory 'web_binary_icon/static/src'
2166=== added directory 'web_binary_icon/static/src/css'
2167=== added directory 'web_binary_icon/static/src/img'
2168=== added directory 'web_binary_icon/static/src/js'
2169=== added directory 'web_binary_icon/static/src/xml'
2170=== added directory 'web_bootstrap3'
2171=== added file 'web_bootstrap3/__init__.py'
2172=== added file 'web_bootstrap3/__openerp__.py'
2173--- web_bootstrap3/__openerp__.py 1970-01-01 00:00:00 +0000
2174+++ web_bootstrap3/__openerp__.py 2014-04-22 22:55:50 +0000
2175@@ -0,0 +1,91 @@
2176+#-*- coding: utf-8 -*-
2177+###################################################################################################
2178+#
2179+# OpenERP, Open Source Management Solution Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
2180+# All Rights Reserved
2181+# Financed and Planified by Vauxoo
2182+# developed by: nhomar@vauxoo.com
2183+# This program is free software: you can redistribute it and/or modify it under the terms of the
2184+# GNU General Public License as published by the Free Software Foundation, either version 3 of
2185+# the License, or (at your option) any later version.
2186+# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
2187+# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
2188+# the GNU General Public License for more details.
2189+# You should have received a copy of the GNU General Public License along with this program.
2190+# If not, see <http://www.gnu.org/licenses/>.
2191+###################################################################################################
2192+
2193+{
2194+ 'name': "Bootstrap 3.0 for OpenERP",
2195+ 'author': "Vauxoo",
2196+ 'category': "Hidden",
2197+ 'description': """
2198+Bootstrap 3.0 in OpenERP
2199+========================
2200+
2201+Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web
2202+development.
2203+
2204+Openerp have embeded partially Bootstrap 2.x but the new version is so powerfull.
2205+
2206+With this module you will be able to design cool views with this documentation, all what you need
2207+is namespace your views with a delimiter with class .bs3
2208+
2209+i.e.:
2210+
2211+::
2212+
2213+ <form version="7.0">
2214+ ...
2215+ ...
2216+ <pre>
2217+ <div class="bs3">
2218+ <field name="text" widget="html"/>
2219+ </div>
2220+ </pre>
2221+ ...
2222+ ...
2223+ ...
2224+ </form>
2225+
2226+Now all the content of the field ``text`` with widget ``html`` bellow will be rendered with all the
2227+power of bs3
2228+
2229+We include the original less files to allow you compile this when you need but you can download and
2230+compile by your self the original sources, just need to compile the bs3-openerp.less again pointing
2231+the bs3 original files.
2232+
2233+The most interesting part of this way to work is that our specific modules in terms of look and
2234+feel will be prepared for version 8.0.
2235+
2236+The bootstrap documentation can be found here_
2237+
2238+You will find a directory called bootstrap3 with the bootstrap's source code, the main objective of
2239+do that is be able to just pull from original bootstrap project and commit in this module almost
2240+directly.
2241+
2242+Is you want compile your own version of bootstrap_ download the source code in the link_
2243+
2244+.. _here http://getbootstrap.com/
2245+.. _bootstrap https://github.com/twbs/bootstrap/
2246+.. _link https://github.com/twbs/bootstrap/
2247+ """,
2248+ 'version': "1.0",
2249+ 'depends': [
2250+ 'web'
2251+ ],
2252+ 'js': [
2253+ 'static/src/js/bootstrap.js',
2254+ 'static/src/js/bootstrap-lightbox.js',
2255+ #'static/src/js/ekko-lightbox.js',
2256+ ],
2257+ 'css': [
2258+ 'static/src/css/bs3-openerp.css',
2259+ 'static/src/css/bs3-lightbox.css',
2260+ ],
2261+ 'qweb': [
2262+ ],
2263+ 'installable': True,
2264+ 'auto_install': False,
2265+ 'web_preload': False, #set to True if you want this module be available always without ask.
2266+}
2267
2268=== added directory 'web_bootstrap3/static'
2269=== added directory 'web_bootstrap3/static/src'
2270=== added directory 'web_bootstrap3/static/src/css'
2271=== added file 'web_bootstrap3/static/src/css/bs3-lightbox.css'
2272--- web_bootstrap3/static/src/css/bs3-lightbox.css 1970-01-01 00:00:00 +0000
2273+++ web_bootstrap3/static/src/css/bs3-lightbox.css 2014-04-22 22:55:50 +0000
2274@@ -0,0 +1,91 @@
2275+/*!
2276+* bootstrap-lightbox.css v0.6.1
2277+* Copyright 2013 Jason Butz
2278+* http://www.apache.org/licenses/LICENSE-2.0.txt
2279+*/
2280+.lightbox-open {
2281+ overflow: hidden;
2282+}
2283+
2284+body.lightbox-open, .lightbox-open .navbar-fixed-top, .lightbox-open .navbar-fixed-bottom {
2285+ margin-right: 15px;
2286+}
2287+
2288+.lightbox {
2289+ position: fixed;
2290+ top: 0;
2291+ right: 0;
2292+ bottom: 0;
2293+ left: 0;
2294+ z-index: 1040;
2295+ display: none;
2296+ overflow: auto;
2297+ overflow-y: scroll;
2298+}
2299+
2300+.lightbox .fade .lightbox-dialog {
2301+ -webkit-transform: translate(0, -25%);
2302+ -ms-transform: translate(0, -25%);
2303+ transform: translate(0, -25%);
2304+ -webkit-transition: -webkit-transform 0.3s ease-out;
2305+ -moz-transition: -moz-transform 0.3s ease-out;
2306+ -o-transition: -o-transform 0.3s ease-out;
2307+ transition: transform 0.3s ease-out;
2308+}
2309+
2310+.lightbox .in .lightbox-dialog {
2311+ -webkit-transform: translate(0, 0);
2312+ -ms-transform: translate(0, 0);
2313+ transform: translate(0, 0);
2314+}
2315+.lightbox .lightbox-dialog {
2316+ z-index: 1050;
2317+ width: auto;
2318+ /*padding: 10px;*/
2319+ margin-right: auto;
2320+ margin-left: auto;
2321+}
2322+.lightbox .lightbox-dialog .lightbox-header {
2323+ float: right;
2324+}
2325+.lightbox .lightbox-dialog .lightbox-header .close {
2326+ margin-top: -2px;
2327+}
2328+.lightbox .lightbox-dialog .lightbox-content {
2329+ position: relative;
2330+ display: inline-block;
2331+ padding: 10px;
2332+ background-color: #ffffff;
2333+ border: 1px solid #999999;
2334+ border: 1px solid rgba(0, 0, 0, 0.2);
2335+ border-radius: 6px;
2336+ outline: none;
2337+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
2338+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
2339+ background-clip: padding-box;
2340+}
2341+.lightbox .lightbox-dialog .lightbox-content .lightbox-caption {
2342+ position: absolute;
2343+ right: 8px;
2344+ bottom: 8px;
2345+ left: 10px;
2346+ padding: 2%;
2347+ font-size: 14px;
2348+ line-height: 18px;
2349+ color: white;
2350+ text-align: center;
2351+ text-shadow: 0 -1px 0 #000000;
2352+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3);
2353+ background: #000;
2354+ background: rgba(0, 0, 0, 0.6);
2355+}
2356+
2357+.lightbox.lightbox-html {
2358+ position: fixed;
2359+ width: 1018px;
2360+ height: 682px;
2361+ top: 24px;
2362+ left: 50%;
2363+ margin-left: -509px;
2364+ display: none;
2365+}
2366
2367=== added file 'web_bootstrap3/static/src/css/bs3-openerp.css'
2368--- web_bootstrap3/static/src/css/bs3-openerp.css 1970-01-01 00:00:00 +0000
2369+++ web_bootstrap3/static/src/css/bs3-openerp.css 2014-04-22 22:55:50 +0000
2370@@ -0,0 +1,6022 @@
2371+.bs3 {
2372+ /*!
2373+ * Bootstrap v3.0.0
2374+ *
2375+ * Copyright 2013 Twitter, Inc
2376+ * Licensed under the Apache License v2.0
2377+ * http://www.apache.org/licenses/LICENSE-2.0
2378+ *
2379+ * Designed and built with all the love in the world by @mdo and @fat.
2380+ */
2381+
2382+ /*! normalize.css v2.1.0 | MIT License | git.io/normalize */
2383+
2384+}
2385+.bs3 article,
2386+.bs3 aside,
2387+.bs3 details,
2388+.bs3 figcaption,
2389+.bs3 figure,
2390+.bs3 footer,
2391+.bs3 header,
2392+.bs3 hgroup,
2393+.bs3 main,
2394+.bs3 nav,
2395+.bs3 section,
2396+.bs3 summary {
2397+ display: block;
2398+}
2399+.bs3 audio,
2400+.bs3 canvas,
2401+.bs3 video {
2402+ display: inline-block;
2403+}
2404+.bs3 audio:not([controls]) {
2405+ display: none;
2406+ height: 0;
2407+}
2408+.bs3 [hidden] {
2409+ display: none;
2410+}
2411+.bs3 html {
2412+ font-family: sans-serif;
2413+ -webkit-text-size-adjust: 100%;
2414+ -ms-text-size-adjust: 100%;
2415+}
2416+.bs3 body {
2417+ margin: 0;
2418+}
2419+.bs3 a:focus {
2420+ outline: thin dotted;
2421+}
2422+.bs3 a:active,
2423+.bs3 a:hover {
2424+ outline: 0;
2425+}
2426+.bs3 h1 {
2427+ font-size: 2em;
2428+ margin: 0.67em 0;
2429+}
2430+.bs3 abbr[title] {
2431+ border-bottom: 1px dotted;
2432+}
2433+.bs3 b,
2434+.bs3 strong {
2435+ font-weight: bold;
2436+}
2437+.bs3 dfn {
2438+ font-style: italic;
2439+}
2440+.bs3 hr {
2441+ -moz-box-sizing: content-box;
2442+ box-sizing: content-box;
2443+ height: 0;
2444+}
2445+.bs3 mark {
2446+ background: #ff0;
2447+ color: #000;
2448+}
2449+.bs3 code,
2450+.bs3 kbd,
2451+.bs3 pre,
2452+.bs3 samp {
2453+ font-family: monospace, serif;
2454+ font-size: 1em;
2455+}
2456+.bs3 pre {
2457+ white-space: pre-wrap;
2458+}
2459+.bs3 q {
2460+ quotes: "\201C" "\201D" "\2018" "\2019";
2461+}
2462+.bs3 small {
2463+ font-size: 80%;
2464+}
2465+.bs3 sub,
2466+.bs3 sup {
2467+ font-size: 75%;
2468+ line-height: 0;
2469+ position: relative;
2470+ vertical-align: baseline;
2471+}
2472+.bs3 sup {
2473+ top: -0.5em;
2474+}
2475+.bs3 sub {
2476+ bottom: -0.25em;
2477+}
2478+.bs3 img {
2479+ border: 0;
2480+}
2481+.bs3 svg:not(:root) {
2482+ overflow: hidden;
2483+}
2484+.bs3 figure {
2485+ margin: 0;
2486+}
2487+.bs3 fieldset {
2488+ border: 1px solid #c0c0c0;
2489+ margin: 0 2px;
2490+ padding: 0.35em 0.625em 0.75em;
2491+}
2492+.bs3 legend {
2493+ border: 0;
2494+ padding: 0;
2495+}
2496+.bs3 button,
2497+.bs3 input,
2498+.bs3 select,
2499+.bs3 textarea {
2500+ font-family: inherit;
2501+ font-size: 100%;
2502+ margin: 0;
2503+}
2504+.bs3 button,
2505+.bs3 input {
2506+ line-height: normal;
2507+}
2508+.bs3 button,
2509+.bs3 select {
2510+ text-transform: none;
2511+}
2512+.bs3 button,
2513+.bs3 html input[type="button"],
2514+.bs3 input[type="reset"],
2515+.bs3 input[type="submit"] {
2516+ -webkit-appearance: button;
2517+ cursor: pointer;
2518+}
2519+.bs3 button[disabled],
2520+.bs3 html input[disabled] {
2521+ cursor: default;
2522+}
2523+.bs3 input[type="checkbox"],
2524+.bs3 input[type="radio"] {
2525+ box-sizing: border-box;
2526+ padding: 0;
2527+}
2528+.bs3 input[type="search"] {
2529+ -webkit-appearance: textfield;
2530+ -moz-box-sizing: content-box;
2531+ -webkit-box-sizing: content-box;
2532+ box-sizing: content-box;
2533+}
2534+.bs3 input[type="search"]::-webkit-search-cancel-button,
2535+.bs3 input[type="search"]::-webkit-search-decoration {
2536+ -webkit-appearance: none;
2537+}
2538+.bs3 button::-moz-focus-inner,
2539+.bs3 input::-moz-focus-inner {
2540+ border: 0;
2541+ padding: 0;
2542+}
2543+.bs3 textarea {
2544+ overflow: auto;
2545+ vertical-align: top;
2546+}
2547+.bs3 table {
2548+ border-collapse: collapse;
2549+ border-spacing: 0;
2550+}
2551+@media print {
2552+ .bs3 * {
2553+ text-shadow: none !important;
2554+ color: #000 !important;
2555+ background: transparent !important;
2556+ box-shadow: none !important;
2557+ }
2558+ .bs3 a,
2559+ .bs3 a:visited {
2560+ text-decoration: underline;
2561+ }
2562+ .bs3 a[href]:after {
2563+ content: " (" attr(href) ")";
2564+ }
2565+ .bs3 abbr[title]:after {
2566+ content: " (" attr(title) ")";
2567+ }
2568+ .bs3 .ir a:after,
2569+ .bs3 a[href^="javascript:"]:after,
2570+ .bs3 a[href^="#"]:after {
2571+ content: "";
2572+ }
2573+ .bs3 pre,
2574+ .bs3 blockquote {
2575+ border: 1px solid #999;
2576+ page-break-inside: avoid;
2577+ }
2578+ .bs3 thead {
2579+ display: table-header-group;
2580+ }
2581+ .bs3 tr,
2582+ .bs3 img {
2583+ page-break-inside: avoid;
2584+ }
2585+ .bs3 img {
2586+ max-width: 100% !important;
2587+ }
2588+ @page {
2589+ margin: 2cm .5cm;
2590+ }
2591+ .bs3 p,
2592+ .bs3 h2,
2593+ .bs3 h3 {
2594+ orphans: 3;
2595+ widows: 3;
2596+ }
2597+ .bs3 h2,
2598+ .bs3 h3 {
2599+ page-break-after: avoid;
2600+ }
2601+ .bs3 .navbar {
2602+ display: none;
2603+ }
2604+ .bs3 .table td,
2605+ .bs3 .table th {
2606+ background-color: #fff !important;
2607+ }
2608+ .bs3 .btn > .caret,
2609+ .bs3 .dropup > .btn > .caret {
2610+ border-top-color: #000 !important;
2611+ }
2612+ .bs3 .label {
2613+ border: 1px solid #000;
2614+ }
2615+ .bs3 .table {
2616+ border-collapse: collapse !important;
2617+ }
2618+ .bs3 .table-bordered th,
2619+ .bs3 .table-bordered td {
2620+ border: 1px solid #ddd !important;
2621+ }
2622+}
2623+.bs3 *,
2624+.bs3 *:before,
2625+.bs3 *:after {
2626+ -webkit-box-sizing: border-box;
2627+ -moz-box-sizing: border-box;
2628+ box-sizing: border-box;
2629+}
2630+.bs3 html {
2631+ font-size: 62.5%;
2632+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
2633+}
2634+.bs3 body {
2635+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2636+ font-size: 14px;
2637+ line-height: 1.428571429;
2638+ color: #333333;
2639+ background-color: #ffffff;
2640+}
2641+.bs3 input,
2642+.bs3 button,
2643+.bs3 select,
2644+.bs3 textarea {
2645+ font-family: inherit;
2646+ font-size: inherit;
2647+ line-height: inherit;
2648+}
2649+.bs3 a {
2650+ color: #428bca;
2651+ text-decoration: none;
2652+}
2653+.bs3 a:hover,
2654+.bs3 a:focus {
2655+ color: #2a6496;
2656+ text-decoration: underline;
2657+}
2658+.bs3 a:focus {
2659+ outline: thin dotted #333;
2660+ outline: 5px auto -webkit-focus-ring-color;
2661+ outline-offset: -2px;
2662+}
2663+.bs3 img {
2664+ vertical-align: middle;
2665+}
2666+.bs3 .img-responsive {
2667+ display: block;
2668+ max-width: 100%;
2669+ height: auto;
2670+}
2671+.bs3 .img-rounded {
2672+ border-radius: 6px;
2673+}
2674+.bs3 .img-thumbnail {
2675+ padding: 4px;
2676+ line-height: 1.428571429;
2677+ background-color: #ffffff;
2678+ border: 1px solid #dddddd;
2679+ border-radius: 4px;
2680+ -webkit-transition: all 0.2s ease-in-out;
2681+ transition: all 0.2s ease-in-out;
2682+ display: inline-block;
2683+ max-width: 100%;
2684+ height: auto;
2685+}
2686+.bs3 .img-circle {
2687+ border-radius: 50%;
2688+}
2689+.bs3 hr {
2690+ margin-top: 20px;
2691+ margin-bottom: 20px;
2692+ border: 0;
2693+ border-top: 1px solid #eeeeee;
2694+}
2695+.bs3 .sr-only {
2696+ position: absolute;
2697+ width: 1px;
2698+ height: 1px;
2699+ margin: -1px;
2700+ padding: 0;
2701+ overflow: hidden;
2702+ clip: rect(0 0 0 0);
2703+ border: 0;
2704+}
2705+.bs3 p {
2706+ margin: 0 0 10px;
2707+}
2708+.bs3 .lead {
2709+ margin-bottom: 20px;
2710+ font-size: 16.099999999999998px;
2711+ font-weight: 200;
2712+ line-height: 1.4;
2713+}
2714+@media (min-width: 768px) {
2715+ .bs3 .lead {
2716+ font-size: 21px;
2717+ }
2718+}
2719+.bs3 small,
2720+.bs3 .small {
2721+ font-size: 85%;
2722+}
2723+.bs3 cite {
2724+ font-style: normal;
2725+}
2726+.bs3 .text-muted {
2727+ color: #999999;
2728+}
2729+.bs3 .text-primary {
2730+ color: #428bca;
2731+}
2732+.bs3 .text-primary:hover {
2733+ color: #3071a9;
2734+}
2735+.bs3 .text-warning {
2736+ color: #c09853;
2737+}
2738+.bs3 .text-warning:hover {
2739+ color: #a47e3c;
2740+}
2741+.bs3 .text-danger {
2742+ color: #b94a48;
2743+}
2744+.bs3 .text-danger:hover {
2745+ color: #953b39;
2746+}
2747+.bs3 .text-success {
2748+ color: #468847;
2749+}
2750+.bs3 .text-success:hover {
2751+ color: #356635;
2752+}
2753+.bs3 .text-info {
2754+ color: #3a87ad;
2755+}
2756+.bs3 .text-info:hover {
2757+ color: #2d6987;
2758+}
2759+.bs3 .text-left {
2760+ text-align: left;
2761+}
2762+.bs3 .text-right {
2763+ text-align: right;
2764+}
2765+.bs3 .text-center {
2766+ text-align: center;
2767+}
2768+.bs3 h1,
2769+.bs3 h2,
2770+.bs3 h3,
2771+.bs3 h4,
2772+.bs3 h5,
2773+.bs3 h6,
2774+.bs3 .h1,
2775+.bs3 .h2,
2776+.bs3 .h3,
2777+.bs3 .h4,
2778+.bs3 .h5,
2779+.bs3 .h6 {
2780+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
2781+ font-weight: 500;
2782+ line-height: 1.1;
2783+ color: inherit;
2784+}
2785+.bs3 h1 small,
2786+.bs3 h2 small,
2787+.bs3 h3 small,
2788+.bs3 h4 small,
2789+.bs3 h5 small,
2790+.bs3 h6 small,
2791+.bs3 .h1 small,
2792+.bs3 .h2 small,
2793+.bs3 .h3 small,
2794+.bs3 .h4 small,
2795+.bs3 .h5 small,
2796+.bs3 .h6 small {
2797+ font-weight: normal;
2798+ line-height: 1;
2799+ color: #999999;
2800+}
2801+.bs3 h1,
2802+.bs3 h2,
2803+.bs3 h3 {
2804+ margin-top: 20px;
2805+ margin-bottom: 10px;
2806+}
2807+.bs3 h1 small,
2808+.bs3 h2 small,
2809+.bs3 h3 small {
2810+ font-size: 65%;
2811+}
2812+.bs3 h4,
2813+.bs3 h5,
2814+.bs3 h6 {
2815+ margin-top: 10px;
2816+ margin-bottom: 10px;
2817+}
2818+.bs3 h4 small,
2819+.bs3 h5 small,
2820+.bs3 h6 small {
2821+ font-size: 75%;
2822+}
2823+.bs3 h1,
2824+.bs3 .h1 {
2825+ font-size: 36px;
2826+}
2827+.bs3 h2,
2828+.bs3 .h2 {
2829+ font-size: 30px;
2830+}
2831+.bs3 h3,
2832+.bs3 .h3 {
2833+ font-size: 24px;
2834+}
2835+.bs3 h4,
2836+.bs3 .h4 {
2837+ font-size: 18px;
2838+}
2839+.bs3 h5,
2840+.bs3 .h5 {
2841+ font-size: 14px;
2842+}
2843+.bs3 h6,
2844+.bs3 .h6 {
2845+ font-size: 12px;
2846+}
2847+.bs3 .page-header {
2848+ padding-bottom: 9px;
2849+ margin: 40px 0 20px;
2850+ border-bottom: 1px solid #eeeeee;
2851+}
2852+.bs3 ul,
2853+.bs3 ol {
2854+ margin-top: 0;
2855+ margin-bottom: 10px;
2856+}
2857+.bs3 ul ul,
2858+.bs3 ol ul,
2859+.bs3 ul ol,
2860+.bs3 ol ol {
2861+ margin-bottom: 0;
2862+}
2863+.bs3 .list-unstyled {
2864+ padding-left: 0;
2865+ list-style: none;
2866+}
2867+.bs3 .list-inline {
2868+ padding-left: 0;
2869+ list-style: none;
2870+}
2871+.bs3 .list-inline > li {
2872+ display: inline-block;
2873+ padding-left: 5px;
2874+ padding-right: 5px;
2875+}
2876+.bs3 dl {
2877+ margin-bottom: 20px;
2878+}
2879+.bs3 dt,
2880+.bs3 dd {
2881+ line-height: 1.428571429;
2882+}
2883+.bs3 dt {
2884+ font-weight: bold;
2885+}
2886+.bs3 dd {
2887+ margin-left: 0;
2888+}
2889+@media (min-width: 768px) {
2890+ .bs3 .dl-horizontal dt {
2891+ float: left;
2892+ width: 160px;
2893+ clear: left;
2894+ text-align: right;
2895+ overflow: hidden;
2896+ text-overflow: ellipsis;
2897+ white-space: nowrap;
2898+ }
2899+ .bs3 .dl-horizontal dd {
2900+ margin-left: 180px;
2901+ }
2902+ .bs3 .dl-horizontal dd:before,
2903+ .bs3 .dl-horizontal dd:after {
2904+ content: " ";
2905+ /* 1 */
2906+
2907+ display: table;
2908+ /* 2 */
2909+
2910+ }
2911+ .bs3 .dl-horizontal dd:after {
2912+ clear: both;
2913+ }
2914+ .bs3 .dl-horizontal dd:before,
2915+ .bs3 .dl-horizontal dd:after {
2916+ content: " ";
2917+ /* 1 */
2918+
2919+ display: table;
2920+ /* 2 */
2921+
2922+ }
2923+ .bs3 .dl-horizontal dd:after {
2924+ clear: both;
2925+ }
2926+}
2927+.bs3 abbr[title],
2928+.bs3 abbr[data-original-title] {
2929+ cursor: help;
2930+ border-bottom: 1px dotted #999999;
2931+}
2932+.bs3 abbr.initialism {
2933+ font-size: 90%;
2934+ text-transform: uppercase;
2935+}
2936+.bs3 blockquote {
2937+ padding: 10px 20px;
2938+ margin: 0 0 20px;
2939+ border-left: 5px solid #eeeeee;
2940+}
2941+.bs3 blockquote p {
2942+ font-size: 17.5px;
2943+ font-weight: 300;
2944+ line-height: 1.25;
2945+}
2946+.bs3 blockquote p:last-child {
2947+ margin-bottom: 0;
2948+}
2949+.bs3 blockquote small {
2950+ display: block;
2951+ line-height: 1.428571429;
2952+ color: #999999;
2953+}
2954+.bs3 blockquote small:before {
2955+ content: '\2014 \00A0';
2956+}
2957+.bs3 blockquote.pull-right {
2958+ padding-right: 15px;
2959+ padding-left: 0;
2960+ border-right: 5px solid #eeeeee;
2961+ border-left: 0;
2962+}
2963+.bs3 blockquote.pull-right p,
2964+.bs3 blockquote.pull-right small {
2965+ text-align: right;
2966+}
2967+.bs3 blockquote.pull-right small:before {
2968+ content: '';
2969+}
2970+.bs3 blockquote.pull-right small:after {
2971+ content: '\00A0 \2014';
2972+}
2973+.bs3 q:before,
2974+.bs3 q:after,
2975+.bs3 blockquote:before,
2976+.bs3 blockquote:after {
2977+ content: "";
2978+}
2979+.bs3 address {
2980+ display: block;
2981+ margin-bottom: 20px;
2982+ font-style: normal;
2983+ line-height: 1.428571429;
2984+}
2985+.bs3 code,
2986+.bs3 pre {
2987+ font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
2988+}
2989+.bs3 code {
2990+ padding: 2px 4px;
2991+ font-size: 90%;
2992+ color: #c7254e;
2993+ background-color: #f9f2f4;
2994+ white-space: nowrap;
2995+ border-radius: 4px;
2996+}
2997+.bs3 pre {
2998+ display: block;
2999+ padding: 9.5px;
3000+ margin: 0 0 10px;
3001+ font-size: 13px;
3002+ line-height: 1.428571429;
3003+ word-break: break-all;
3004+ word-wrap: break-word;
3005+ color: #333333;
3006+ background-color: #f5f5f5;
3007+ border: 1px solid #cccccc;
3008+ border-radius: 4px;
3009+}
3010+.bs3 pre.prettyprint {
3011+ margin-bottom: 20px;
3012+}
3013+.bs3 pre code {
3014+ padding: 0;
3015+ font-size: inherit;
3016+ color: inherit;
3017+ white-space: pre-wrap;
3018+ background-color: transparent;
3019+ border: 0;
3020+}
3021+.bs3 .pre-scrollable {
3022+ max-height: 340px;
3023+ overflow-y: scroll;
3024+}
3025+.bs3 .container {
3026+ margin-right: auto;
3027+ margin-left: auto;
3028+ padding-left: 15px;
3029+ padding-right: 15px;
3030+}
3031+.bs3 .container:before,
3032+.bs3 .container:after {
3033+ content: " ";
3034+ /* 1 */
3035+
3036+ display: table;
3037+ /* 2 */
3038+
3039+}
3040+.bs3 .container:after {
3041+ clear: both;
3042+}
3043+.bs3 .container:before,
3044+.bs3 .container:after {
3045+ content: " ";
3046+ /* 1 */
3047+
3048+ display: table;
3049+ /* 2 */
3050+
3051+}
3052+.bs3 .container:after {
3053+ clear: both;
3054+}
3055+.bs3 .row {
3056+ margin-left: -15px;
3057+ margin-right: -15px;
3058+}
3059+.bs3 .row:before,
3060+.bs3 .row:after {
3061+ content: " ";
3062+ /* 1 */
3063+
3064+ display: table;
3065+ /* 2 */
3066+
3067+}
3068+.bs3 .row:after {
3069+ clear: both;
3070+}
3071+.bs3 .row:before,
3072+.bs3 .row:after {
3073+ content: " ";
3074+ /* 1 */
3075+
3076+ display: table;
3077+ /* 2 */
3078+
3079+}
3080+.bs3 .row:after {
3081+ clear: both;
3082+}
3083+.bs3 .col-xs-1,
3084+.bs3 .col-xs-2,
3085+.bs3 .col-xs-3,
3086+.bs3 .col-xs-4,
3087+.bs3 .col-xs-5,
3088+.bs3 .col-xs-6,
3089+.bs3 .col-xs-7,
3090+.bs3 .col-xs-8,
3091+.bs3 .col-xs-9,
3092+.bs3 .col-xs-10,
3093+.bs3 .col-xs-11,
3094+.bs3 .col-xs-12,
3095+.bs3 .col-sm-1,
3096+.bs3 .col-sm-2,
3097+.bs3 .col-sm-3,
3098+.bs3 .col-sm-4,
3099+.bs3 .col-sm-5,
3100+.bs3 .col-sm-6,
3101+.bs3 .col-sm-7,
3102+.bs3 .col-sm-8,
3103+.bs3 .col-sm-9,
3104+.bs3 .col-sm-10,
3105+.bs3 .col-sm-11,
3106+.bs3 .col-sm-12,
3107+.bs3 .col-md-1,
3108+.bs3 .col-md-2,
3109+.bs3 .col-md-3,
3110+.bs3 .col-md-4,
3111+.bs3 .col-md-5,
3112+.bs3 .col-md-6,
3113+.bs3 .col-md-7,
3114+.bs3 .col-md-8,
3115+.bs3 .col-md-9,
3116+.bs3 .col-md-10,
3117+.bs3 .col-md-11,
3118+.bs3 .col-md-12,
3119+.bs3 .col-lg-1,
3120+.bs3 .col-lg-2,
3121+.bs3 .col-lg-3,
3122+.bs3 .col-lg-4,
3123+.bs3 .col-lg-5,
3124+.bs3 .col-lg-6,
3125+.bs3 .col-lg-7,
3126+.bs3 .col-lg-8,
3127+.bs3 .col-lg-9,
3128+.bs3 .col-lg-10,
3129+.bs3 .col-lg-11,
3130+.bs3 .col-lg-12 {
3131+ position: relative;
3132+ min-height: 1px;
3133+ padding-left: 15px;
3134+ padding-right: 15px;
3135+}
3136+.bs3 .col-xs-1,
3137+.bs3 .col-xs-2,
3138+.bs3 .col-xs-3,
3139+.bs3 .col-xs-4,
3140+.bs3 .col-xs-5,
3141+.bs3 .col-xs-6,
3142+.bs3 .col-xs-7,
3143+.bs3 .col-xs-8,
3144+.bs3 .col-xs-9,
3145+.bs3 .col-xs-10,
3146+.bs3 .col-xs-11 {
3147+ float: left;
3148+}
3149+.bs3 .col-xs-1 {
3150+ width: 8.333333333333332%;
3151+}
3152+.bs3 .col-xs-2 {
3153+ width: 16.666666666666664%;
3154+}
3155+.bs3 .col-xs-3 {
3156+ width: 25%;
3157+}
3158+.bs3 .col-xs-4 {
3159+ width: 33.33333333333333%;
3160+}
3161+.bs3 .col-xs-5 {
3162+ width: 41.66666666666667%;
3163+}
3164+.bs3 .col-xs-6 {
3165+ width: 50%;
3166+}
3167+.bs3 .col-xs-7 {
3168+ width: 58.333333333333336%;
3169+}
3170+.bs3 .col-xs-8 {
3171+ width: 66.66666666666666%;
3172+}
3173+.bs3 .col-xs-9 {
3174+ width: 75%;
3175+}
3176+.bs3 .col-xs-10 {
3177+ width: 83.33333333333334%;
3178+}
3179+.bs3 .col-xs-11 {
3180+ width: 91.66666666666666%;
3181+}
3182+.bs3 .col-xs-12 {
3183+ width: 100%;
3184+}
3185+@media (min-width: 768px) {
3186+ .bs3 .container {
3187+ width: 750px;
3188+ }
3189+ .bs3 .col-sm-1,
3190+ .bs3 .col-sm-2,
3191+ .bs3 .col-sm-3,
3192+ .bs3 .col-sm-4,
3193+ .bs3 .col-sm-5,
3194+ .bs3 .col-sm-6,
3195+ .bs3 .col-sm-7,
3196+ .bs3 .col-sm-8,
3197+ .bs3 .col-sm-9,
3198+ .bs3 .col-sm-10,
3199+ .bs3 .col-sm-11 {
3200+ float: left;
3201+ }
3202+ .bs3 .col-sm-1 {
3203+ width: 8.333333333333332%;
3204+ }
3205+ .bs3 .col-sm-2 {
3206+ width: 16.666666666666664%;
3207+ }
3208+ .bs3 .col-sm-3 {
3209+ width: 25%;
3210+ }
3211+ .bs3 .col-sm-4 {
3212+ width: 33.33333333333333%;
3213+ }
3214+ .bs3 .col-sm-5 {
3215+ width: 41.66666666666667%;
3216+ }
3217+ .bs3 .col-sm-6 {
3218+ width: 50%;
3219+ }
3220+ .bs3 .col-sm-7 {
3221+ width: 58.333333333333336%;
3222+ }
3223+ .bs3 .col-sm-8 {
3224+ width: 66.66666666666666%;
3225+ }
3226+ .bs3 .col-sm-9 {
3227+ width: 75%;
3228+ }
3229+ .bs3 .col-sm-10 {
3230+ width: 83.33333333333334%;
3231+ }
3232+ .bs3 .col-sm-11 {
3233+ width: 91.66666666666666%;
3234+ }
3235+ .bs3 .col-sm-12 {
3236+ width: 100%;
3237+ }
3238+ .bs3 .col-sm-push-1 {
3239+ left: 8.333333333333332%;
3240+ }
3241+ .bs3 .col-sm-push-2 {
3242+ left: 16.666666666666664%;
3243+ }
3244+ .bs3 .col-sm-push-3 {
3245+ left: 25%;
3246+ }
3247+ .bs3 .col-sm-push-4 {
3248+ left: 33.33333333333333%;
3249+ }
3250+ .bs3 .col-sm-push-5 {
3251+ left: 41.66666666666667%;
3252+ }
3253+ .bs3 .col-sm-push-6 {
3254+ left: 50%;
3255+ }
3256+ .bs3 .col-sm-push-7 {
3257+ left: 58.333333333333336%;
3258+ }
3259+ .bs3 .col-sm-push-8 {
3260+ left: 66.66666666666666%;
3261+ }
3262+ .bs3 .col-sm-push-9 {
3263+ left: 75%;
3264+ }
3265+ .bs3 .col-sm-push-10 {
3266+ left: 83.33333333333334%;
3267+ }
3268+ .bs3 .col-sm-push-11 {
3269+ left: 91.66666666666666%;
3270+ }
3271+ .bs3 .col-sm-pull-1 {
3272+ right: 8.333333333333332%;
3273+ }
3274+ .bs3 .col-sm-pull-2 {
3275+ right: 16.666666666666664%;
3276+ }
3277+ .bs3 .col-sm-pull-3 {
3278+ right: 25%;
3279+ }
3280+ .bs3 .col-sm-pull-4 {
3281+ right: 33.33333333333333%;
3282+ }
3283+ .bs3 .col-sm-pull-5 {
3284+ right: 41.66666666666667%;
3285+ }
3286+ .bs3 .col-sm-pull-6 {
3287+ right: 50%;
3288+ }
3289+ .bs3 .col-sm-pull-7 {
3290+ right: 58.333333333333336%;
3291+ }
3292+ .bs3 .col-sm-pull-8 {
3293+ right: 66.66666666666666%;
3294+ }
3295+ .bs3 .col-sm-pull-9 {
3296+ right: 75%;
3297+ }
3298+ .bs3 .col-sm-pull-10 {
3299+ right: 83.33333333333334%;
3300+ }
3301+ .bs3 .col-sm-pull-11 {
3302+ right: 91.66666666666666%;
3303+ }
3304+ .bs3 .col-sm-offset-1 {
3305+ margin-left: 8.333333333333332%;
3306+ }
3307+ .bs3 .col-sm-offset-2 {
3308+ margin-left: 16.666666666666664%;
3309+ }
3310+ .bs3 .col-sm-offset-3 {
3311+ margin-left: 25%;
3312+ }
3313+ .bs3 .col-sm-offset-4 {
3314+ margin-left: 33.33333333333333%;
3315+ }
3316+ .bs3 .col-sm-offset-5 {
3317+ margin-left: 41.66666666666667%;
3318+ }
3319+ .bs3 .col-sm-offset-6 {
3320+ margin-left: 50%;
3321+ }
3322+ .bs3 .col-sm-offset-7 {
3323+ margin-left: 58.333333333333336%;
3324+ }
3325+ .bs3 .col-sm-offset-8 {
3326+ margin-left: 66.66666666666666%;
3327+ }
3328+ .bs3 .col-sm-offset-9 {
3329+ margin-left: 75%;
3330+ }
3331+ .bs3 .col-sm-offset-10 {
3332+ margin-left: 83.33333333333334%;
3333+ }
3334+ .bs3 .col-sm-offset-11 {
3335+ margin-left: 91.66666666666666%;
3336+ }
3337+}
3338+@media (min-width: 992px) {
3339+ .bs3 .container {
3340+ width: 970px;
3341+ }
3342+ .bs3 .col-md-1,
3343+ .bs3 .col-md-2,
3344+ .bs3 .col-md-3,
3345+ .bs3 .col-md-4,
3346+ .bs3 .col-md-5,
3347+ .bs3 .col-md-6,
3348+ .bs3 .col-md-7,
3349+ .bs3 .col-md-8,
3350+ .bs3 .col-md-9,
3351+ .bs3 .col-md-10,
3352+ .bs3 .col-md-11 {
3353+ float: left;
3354+ }
3355+ .bs3 .col-md-1 {
3356+ width: 8.333333333333332%;
3357+ }
3358+ .bs3 .col-md-2 {
3359+ width: 16.666666666666664%;
3360+ }
3361+ .bs3 .col-md-3 {
3362+ width: 25%;
3363+ }
3364+ .bs3 .col-md-4 {
3365+ width: 33.33333333333333%;
3366+ }
3367+ .bs3 .col-md-5 {
3368+ width: 41.66666666666667%;
3369+ }
3370+ .bs3 .col-md-6 {
3371+ width: 50%;
3372+ }
3373+ .bs3 .col-md-7 {
3374+ width: 58.333333333333336%;
3375+ }
3376+ .bs3 .col-md-8 {
3377+ width: 66.66666666666666%;
3378+ }
3379+ .bs3 .col-md-9 {
3380+ width: 75%;
3381+ }
3382+ .bs3 .col-md-10 {
3383+ width: 83.33333333333334%;
3384+ }
3385+ .bs3 .col-md-11 {
3386+ width: 91.66666666666666%;
3387+ }
3388+ .bs3 .col-md-12 {
3389+ width: 100%;
3390+ }
3391+ .bs3 .col-md-push-0 {
3392+ left: auto;
3393+ }
3394+ .bs3 .col-md-push-1 {
3395+ left: 8.333333333333332%;
3396+ }
3397+ .bs3 .col-md-push-2 {
3398+ left: 16.666666666666664%;
3399+ }
3400+ .bs3 .col-md-push-3 {
3401+ left: 25%;
3402+ }
3403+ .bs3 .col-md-push-4 {
3404+ left: 33.33333333333333%;
3405+ }
3406+ .bs3 .col-md-push-5 {
3407+ left: 41.66666666666667%;
3408+ }
3409+ .bs3 .col-md-push-6 {
3410+ left: 50%;
3411+ }
3412+ .bs3 .col-md-push-7 {
3413+ left: 58.333333333333336%;
3414+ }
3415+ .bs3 .col-md-push-8 {
3416+ left: 66.66666666666666%;
3417+ }
3418+ .bs3 .col-md-push-9 {
3419+ left: 75%;
3420+ }
3421+ .bs3 .col-md-push-10 {
3422+ left: 83.33333333333334%;
3423+ }
3424+ .bs3 .col-md-push-11 {
3425+ left: 91.66666666666666%;
3426+ }
3427+ .bs3 .col-md-pull-0 {
3428+ right: auto;
3429+ }
3430+ .bs3 .col-md-pull-1 {
3431+ right: 8.333333333333332%;
3432+ }
3433+ .bs3 .col-md-pull-2 {
3434+ right: 16.666666666666664%;
3435+ }
3436+ .bs3 .col-md-pull-3 {
3437+ right: 25%;
3438+ }
3439+ .bs3 .col-md-pull-4 {
3440+ right: 33.33333333333333%;
3441+ }
3442+ .bs3 .col-md-pull-5 {
3443+ right: 41.66666666666667%;
3444+ }
3445+ .bs3 .col-md-pull-6 {
3446+ right: 50%;
3447+ }
3448+ .bs3 .col-md-pull-7 {
3449+ right: 58.333333333333336%;
3450+ }
3451+ .bs3 .col-md-pull-8 {
3452+ right: 66.66666666666666%;
3453+ }
3454+ .bs3 .col-md-pull-9 {
3455+ right: 75%;
3456+ }
3457+ .bs3 .col-md-pull-10 {
3458+ right: 83.33333333333334%;
3459+ }
3460+ .bs3 .col-md-pull-11 {
3461+ right: 91.66666666666666%;
3462+ }
3463+ .bs3 .col-md-offset-0 {
3464+ margin-left: 0;
3465+ }
3466+ .bs3 .col-md-offset-1 {
3467+ margin-left: 8.333333333333332%;
3468+ }
3469+ .bs3 .col-md-offset-2 {
3470+ margin-left: 16.666666666666664%;
3471+ }
3472+ .bs3 .col-md-offset-3 {
3473+ margin-left: 25%;
3474+ }
3475+ .bs3 .col-md-offset-4 {
3476+ margin-left: 33.33333333333333%;
3477+ }
3478+ .bs3 .col-md-offset-5 {
3479+ margin-left: 41.66666666666667%;
3480+ }
3481+ .bs3 .col-md-offset-6 {
3482+ margin-left: 50%;
3483+ }
3484+ .bs3 .col-md-offset-7 {
3485+ margin-left: 58.333333333333336%;
3486+ }
3487+ .bs3 .col-md-offset-8 {
3488+ margin-left: 66.66666666666666%;
3489+ }
3490+ .bs3 .col-md-offset-9 {
3491+ margin-left: 75%;
3492+ }
3493+ .bs3 .col-md-offset-10 {
3494+ margin-left: 83.33333333333334%;
3495+ }
3496+ .bs3 .col-md-offset-11 {
3497+ margin-left: 91.66666666666666%;
3498+ }
3499+}
3500+@media (min-width: 1200px) {
3501+ .bs3 .container {
3502+ width: 1170px;
3503+ }
3504+ .bs3 .col-lg-1,
3505+ .bs3 .col-lg-2,
3506+ .bs3 .col-lg-3,
3507+ .bs3 .col-lg-4,
3508+ .bs3 .col-lg-5,
3509+ .bs3 .col-lg-6,
3510+ .bs3 .col-lg-7,
3511+ .bs3 .col-lg-8,
3512+ .bs3 .col-lg-9,
3513+ .bs3 .col-lg-10,
3514+ .bs3 .col-lg-11 {
3515+ float: left;
3516+ }
3517+ .bs3 .col-lg-1 {
3518+ width: 8.333333333333332%;
3519+ }
3520+ .bs3 .col-lg-2 {
3521+ width: 16.666666666666664%;
3522+ }
3523+ .bs3 .col-lg-3 {
3524+ width: 25%;
3525+ }
3526+ .bs3 .col-lg-4 {
3527+ width: 33.33333333333333%;
3528+ }
3529+ .bs3 .col-lg-5 {
3530+ width: 41.66666666666667%;
3531+ }
3532+ .bs3 .col-lg-6 {
3533+ width: 50%;
3534+ }
3535+ .bs3 .col-lg-7 {
3536+ width: 58.333333333333336%;
3537+ }
3538+ .bs3 .col-lg-8 {
3539+ width: 66.66666666666666%;
3540+ }
3541+ .bs3 .col-lg-9 {
3542+ width: 75%;
3543+ }
3544+ .bs3 .col-lg-10 {
3545+ width: 83.33333333333334%;
3546+ }
3547+ .bs3 .col-lg-11 {
3548+ width: 91.66666666666666%;
3549+ }
3550+ .bs3 .col-lg-12 {
3551+ width: 100%;
3552+ }
3553+ .bs3 .col-lg-push-0 {
3554+ left: auto;
3555+ }
3556+ .bs3 .col-lg-push-1 {
3557+ left: 8.333333333333332%;
3558+ }
3559+ .bs3 .col-lg-push-2 {
3560+ left: 16.666666666666664%;
3561+ }
3562+ .bs3 .col-lg-push-3 {
3563+ left: 25%;
3564+ }
3565+ .bs3 .col-lg-push-4 {
3566+ left: 33.33333333333333%;
3567+ }
3568+ .bs3 .col-lg-push-5 {
3569+ left: 41.66666666666667%;
3570+ }
3571+ .bs3 .col-lg-push-6 {
3572+ left: 50%;
3573+ }
3574+ .bs3 .col-lg-push-7 {
3575+ left: 58.333333333333336%;
3576+ }
3577+ .bs3 .col-lg-push-8 {
3578+ left: 66.66666666666666%;
3579+ }
3580+ .bs3 .col-lg-push-9 {
3581+ left: 75%;
3582+ }
3583+ .bs3 .col-lg-push-10 {
3584+ left: 83.33333333333334%;
3585+ }
3586+ .bs3 .col-lg-push-11 {
3587+ left: 91.66666666666666%;
3588+ }
3589+ .bs3 .col-lg-pull-0 {
3590+ right: auto;
3591+ }
3592+ .bs3 .col-lg-pull-1 {
3593+ right: 8.333333333333332%;
3594+ }
3595+ .bs3 .col-lg-pull-2 {
3596+ right: 16.666666666666664%;
3597+ }
3598+ .bs3 .col-lg-pull-3 {
3599+ right: 25%;
3600+ }
3601+ .bs3 .col-lg-pull-4 {
3602+ right: 33.33333333333333%;
3603+ }
3604+ .bs3 .col-lg-pull-5 {
3605+ right: 41.66666666666667%;
3606+ }
3607+ .bs3 .col-lg-pull-6 {
3608+ right: 50%;
3609+ }
3610+ .bs3 .col-lg-pull-7 {
3611+ right: 58.333333333333336%;
3612+ }
3613+ .bs3 .col-lg-pull-8 {
3614+ right: 66.66666666666666%;
3615+ }
3616+ .bs3 .col-lg-pull-9 {
3617+ right: 75%;
3618+ }
3619+ .bs3 .col-lg-pull-10 {
3620+ right: 83.33333333333334%;
3621+ }
3622+ .bs3 .col-lg-pull-11 {
3623+ right: 91.66666666666666%;
3624+ }
3625+ .bs3 .col-lg-offset-0 {
3626+ margin-left: 0;
3627+ }
3628+ .bs3 .col-lg-offset-1 {
3629+ margin-left: 8.333333333333332%;
3630+ }
3631+ .bs3 .col-lg-offset-2 {
3632+ margin-left: 16.666666666666664%;
3633+ }
3634+ .bs3 .col-lg-offset-3 {
3635+ margin-left: 25%;
3636+ }
3637+ .bs3 .col-lg-offset-4 {
3638+ margin-left: 33.33333333333333%;
3639+ }
3640+ .bs3 .col-lg-offset-5 {
3641+ margin-left: 41.66666666666667%;
3642+ }
3643+ .bs3 .col-lg-offset-6 {
3644+ margin-left: 50%;
3645+ }
3646+ .bs3 .col-lg-offset-7 {
3647+ margin-left: 58.333333333333336%;
3648+ }
3649+ .bs3 .col-lg-offset-8 {
3650+ margin-left: 66.66666666666666%;
3651+ }
3652+ .bs3 .col-lg-offset-9 {
3653+ margin-left: 75%;
3654+ }
3655+ .bs3 .col-lg-offset-10 {
3656+ margin-left: 83.33333333333334%;
3657+ }
3658+ .bs3 .col-lg-offset-11 {
3659+ margin-left: 91.66666666666666%;
3660+ }
3661+}
3662+.bs3 table {
3663+ max-width: 100%;
3664+ background-color: transparent;
3665+}
3666+.bs3 th {
3667+ text-align: left;
3668+}
3669+.bs3 .table {
3670+ width: 100%;
3671+ margin-bottom: 20px;
3672+}
3673+.bs3 .table > thead > tr > th,
3674+.bs3 .table > tbody > tr > th,
3675+.bs3 .table > tfoot > tr > th,
3676+.bs3 .table > thead > tr > td,
3677+.bs3 .table > tbody > tr > td,
3678+.bs3 .table > tfoot > tr > td {
3679+ padding: 8px;
3680+ line-height: 1.428571429;
3681+ vertical-align: top;
3682+ border-top: 1px solid #dddddd;
3683+}
3684+.bs3 .table > thead > tr > th {
3685+ vertical-align: bottom;
3686+ border-bottom: 2px solid #dddddd;
3687+}
3688+.bs3 .table > caption + thead > tr:first-child > th,
3689+.bs3 .table > colgroup + thead > tr:first-child > th,
3690+.bs3 .table > thead:first-child > tr:first-child > th,
3691+.bs3 .table > caption + thead > tr:first-child > td,
3692+.bs3 .table > colgroup + thead > tr:first-child > td,
3693+.bs3 .table > thead:first-child > tr:first-child > td {
3694+ border-top: 0;
3695+}
3696+.bs3 .table > tbody + tbody {
3697+ border-top: 2px solid #dddddd;
3698+}
3699+.bs3 .table .table {
3700+ background-color: #ffffff;
3701+}
3702+.bs3 .table-condensed > thead > tr > th,
3703+.bs3 .table-condensed > tbody > tr > th,
3704+.bs3 .table-condensed > tfoot > tr > th,
3705+.bs3 .table-condensed > thead > tr > td,
3706+.bs3 .table-condensed > tbody > tr > td,
3707+.bs3 .table-condensed > tfoot > tr > td {
3708+ padding: 5px;
3709+}
3710+.bs3 .table-bordered {
3711+ border: 1px solid #dddddd;
3712+}
3713+.bs3 .table-bordered > thead > tr > th,
3714+.bs3 .table-bordered > tbody > tr > th,
3715+.bs3 .table-bordered > tfoot > tr > th,
3716+.bs3 .table-bordered > thead > tr > td,
3717+.bs3 .table-bordered > tbody > tr > td,
3718+.bs3 .table-bordered > tfoot > tr > td {
3719+ border: 1px solid #dddddd;
3720+}
3721+.bs3 .table-bordered > thead > tr > th,
3722+.bs3 .table-bordered > thead > tr > td {
3723+ border-bottom-width: 2px;
3724+}
3725+.bs3 .table-striped > tbody > tr:nth-child(odd) > td,
3726+.bs3 .table-striped > tbody > tr:nth-child(odd) > th {
3727+ background-color: #f9f9f9;
3728+}
3729+.bs3 .table-hover > tbody > tr:hover > td,
3730+.bs3 .table-hover > tbody > tr:hover > th {
3731+ background-color: #f5f5f5;
3732+}
3733+.bs3 table col[class*="col-"] {
3734+ float: none;
3735+ display: table-column;
3736+}
3737+.bs3 table td[class*="col-"],
3738+.bs3 table th[class*="col-"] {
3739+ float: none;
3740+ display: table-cell;
3741+}
3742+.bs3 .table > thead > tr > td.active,
3743+.bs3 .table > tbody > tr > td.active,
3744+.bs3 .table > tfoot > tr > td.active,
3745+.bs3 .table > thead > tr > th.active,
3746+.bs3 .table > tbody > tr > th.active,
3747+.bs3 .table > tfoot > tr > th.active,
3748+.bs3 .table > thead > tr.active > td,
3749+.bs3 .table > tbody > tr.active > td,
3750+.bs3 .table > tfoot > tr.active > td,
3751+.bs3 .table > thead > tr.active > th,
3752+.bs3 .table > tbody > tr.active > th,
3753+.bs3 .table > tfoot > tr.active > th {
3754+ background-color: #f5f5f5;
3755+}
3756+.bs3 .table > thead > tr > td.success,
3757+.bs3 .table > tbody > tr > td.success,
3758+.bs3 .table > tfoot > tr > td.success,
3759+.bs3 .table > thead > tr > th.success,
3760+.bs3 .table > tbody > tr > th.success,
3761+.bs3 .table > tfoot > tr > th.success,
3762+.bs3 .table > thead > tr.success > td,
3763+.bs3 .table > tbody > tr.success > td,
3764+.bs3 .table > tfoot > tr.success > td,
3765+.bs3 .table > thead > tr.success > th,
3766+.bs3 .table > tbody > tr.success > th,
3767+.bs3 .table > tfoot > tr.success > th {
3768+ background-color: #dff0d8;
3769+ border-color: #d6e9c6;
3770+}
3771+.bs3 .table-hover > tbody > tr > td.success:hover,
3772+.bs3 .table-hover > tbody > tr > th.success:hover,
3773+.bs3 .table-hover > tbody > tr.success:hover > td,
3774+.bs3 .table-hover > tbody > tr.success:hover > th {
3775+ background-color: #d0e9c6;
3776+ border-color: #c9e2b3;
3777+}
3778+.bs3 .table > thead > tr > td.danger,
3779+.bs3 .table > tbody > tr > td.danger,
3780+.bs3 .table > tfoot > tr > td.danger,
3781+.bs3 .table > thead > tr > th.danger,
3782+.bs3 .table > tbody > tr > th.danger,
3783+.bs3 .table > tfoot > tr > th.danger,
3784+.bs3 .table > thead > tr.danger > td,
3785+.bs3 .table > tbody > tr.danger > td,
3786+.bs3 .table > tfoot > tr.danger > td,
3787+.bs3 .table > thead > tr.danger > th,
3788+.bs3 .table > tbody > tr.danger > th,
3789+.bs3 .table > tfoot > tr.danger > th {
3790+ background-color: #f2dede;
3791+ border-color: #eed3d7;
3792+}
3793+.bs3 .table-hover > tbody > tr > td.danger:hover,
3794+.bs3 .table-hover > tbody > tr > th.danger:hover,
3795+.bs3 .table-hover > tbody > tr.danger:hover > td,
3796+.bs3 .table-hover > tbody > tr.danger:hover > th {
3797+ background-color: #ebcccc;
3798+ border-color: #e6c1c7;
3799+}
3800+.bs3 .table > thead > tr > td.warning,
3801+.bs3 .table > tbody > tr > td.warning,
3802+.bs3 .table > tfoot > tr > td.warning,
3803+.bs3 .table > thead > tr > th.warning,
3804+.bs3 .table > tbody > tr > th.warning,
3805+.bs3 .table > tfoot > tr > th.warning,
3806+.bs3 .table > thead > tr.warning > td,
3807+.bs3 .table > tbody > tr.warning > td,
3808+.bs3 .table > tfoot > tr.warning > td,
3809+.bs3 .table > thead > tr.warning > th,
3810+.bs3 .table > tbody > tr.warning > th,
3811+.bs3 .table > tfoot > tr.warning > th {
3812+ background-color: #fcf8e3;
3813+ border-color: #fbeed5;
3814+}
3815+.bs3 .table-hover > tbody > tr > td.warning:hover,
3816+.bs3 .table-hover > tbody > tr > th.warning:hover,
3817+.bs3 .table-hover > tbody > tr.warning:hover > td,
3818+.bs3 .table-hover > tbody > tr.warning:hover > th {
3819+ background-color: #faf2cc;
3820+ border-color: #f8e5be;
3821+}
3822+@media (max-width: 768px) {
3823+ .bs3 .table-responsive {
3824+ width: 100%;
3825+ margin-bottom: 15px;
3826+ overflow-y: hidden;
3827+ overflow-x: scroll;
3828+ -ms-overflow-style: -ms-autohiding-scrollbar;
3829+ border: 1px solid #dddddd;
3830+ -webkit-overflow-scrolling: touch;
3831+ }
3832+ .bs3 .table-responsive > .table {
3833+ margin-bottom: 0;
3834+ background-color: #fff;
3835+ }
3836+ .bs3 .table-responsive > .table > thead > tr > th,
3837+ .bs3 .table-responsive > .table > tbody > tr > th,
3838+ .bs3 .table-responsive > .table > tfoot > tr > th,
3839+ .bs3 .table-responsive > .table > thead > tr > td,
3840+ .bs3 .table-responsive > .table > tbody > tr > td,
3841+ .bs3 .table-responsive > .table > tfoot > tr > td {
3842+ white-space: nowrap;
3843+ }
3844+ .bs3 .table-responsive > .table-bordered {
3845+ border: 0;
3846+ }
3847+ .bs3 .table-responsive > .table-bordered > thead > tr > th:first-child,
3848+ .bs3 .table-responsive > .table-bordered > tbody > tr > th:first-child,
3849+ .bs3 .table-responsive > .table-bordered > tfoot > tr > th:first-child,
3850+ .bs3 .table-responsive > .table-bordered > thead > tr > td:first-child,
3851+ .bs3 .table-responsive > .table-bordered > tbody > tr > td:first-child,
3852+ .bs3 .table-responsive > .table-bordered > tfoot > tr > td:first-child {
3853+ border-left: 0;
3854+ }
3855+ .bs3 .table-responsive > .table-bordered > thead > tr > th:last-child,
3856+ .bs3 .table-responsive > .table-bordered > tbody > tr > th:last-child,
3857+ .bs3 .table-responsive > .table-bordered > tfoot > tr > th:last-child,
3858+ .bs3 .table-responsive > .table-bordered > thead > tr > td:last-child,
3859+ .bs3 .table-responsive > .table-bordered > tbody > tr > td:last-child,
3860+ .bs3 .table-responsive > .table-bordered > tfoot > tr > td:last-child {
3861+ border-right: 0;
3862+ }
3863+ .bs3 .table-responsive > .table-bordered > thead > tr:last-child > th,
3864+ .bs3 .table-responsive > .table-bordered > tbody > tr:last-child > th,
3865+ .bs3 .table-responsive > .table-bordered > tfoot > tr:last-child > th,
3866+ .bs3 .table-responsive > .table-bordered > thead > tr:last-child > td,
3867+ .bs3 .table-responsive > .table-bordered > tbody > tr:last-child > td,
3868+ .bs3 .table-responsive > .table-bordered > tfoot > tr:last-child > td {
3869+ border-bottom: 0;
3870+ }
3871+}
3872+.bs3 fieldset {
3873+ padding: 0;
3874+ margin: 0;
3875+ border: 0;
3876+}
3877+.bs3 legend {
3878+ display: block;
3879+ width: 100%;
3880+ padding: 0;
3881+ margin-bottom: 20px;
3882+ font-size: 21px;
3883+ line-height: inherit;
3884+ color: #333333;
3885+ border: 0;
3886+ border-bottom: 1px solid #e5e5e5;
3887+}
3888+.bs3 label {
3889+ display: inline-block;
3890+ margin-bottom: 5px;
3891+ font-weight: bold;
3892+}
3893+.bs3 input[type="search"] {
3894+ -webkit-box-sizing: border-box;
3895+ -moz-box-sizing: border-box;
3896+ box-sizing: border-box;
3897+}
3898+.bs3 input[type="radio"],
3899+.bs3 input[type="checkbox"] {
3900+ margin: 4px 0 0;
3901+ margin-top: 1px \9;
3902+ /* IE8-9 */
3903+
3904+ line-height: normal;
3905+}
3906+.bs3 input[type="file"] {
3907+ display: block;
3908+}
3909+.bs3 select[multiple],
3910+.bs3 select[size] {
3911+ height: auto;
3912+}
3913+.bs3 select optgroup {
3914+ font-size: inherit;
3915+ font-style: inherit;
3916+ font-family: inherit;
3917+}
3918+.bs3 input[type="file"]:focus,
3919+.bs3 input[type="radio"]:focus,
3920+.bs3 input[type="checkbox"]:focus {
3921+ outline: thin dotted #333;
3922+ outline: 5px auto -webkit-focus-ring-color;
3923+ outline-offset: -2px;
3924+}
3925+.bs3 input[type="number"]::-webkit-outer-spin-button,
3926+.bs3 input[type="number"]::-webkit-inner-spin-button {
3927+ height: auto;
3928+}
3929+.bs3 output {
3930+ display: block;
3931+ padding-top: 7px;
3932+ font-size: 14px;
3933+ line-height: 1.428571429;
3934+ color: #555555;
3935+ vertical-align: middle;
3936+}
3937+.bs3 .form-control:-moz-placeholder {
3938+ color: #999999;
3939+}
3940+.bs3 .form-control::-moz-placeholder {
3941+ color: #999999;
3942+}
3943+.bs3 .form-control:-ms-input-placeholder {
3944+ color: #999999;
3945+}
3946+.bs3 .form-control::-webkit-input-placeholder {
3947+ color: #999999;
3948+}
3949+.bs3 .form-control {
3950+ display: block;
3951+ width: 100%;
3952+ height: 34px;
3953+ padding: 6px 12px;
3954+ font-size: 14px;
3955+ line-height: 1.428571429;
3956+ color: #555555;
3957+ vertical-align: middle;
3958+ background-color: #ffffff;
3959+ background-image: none;
3960+ border: 1px solid #cccccc;
3961+ border-radius: 4px;
3962+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
3963+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
3964+ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
3965+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
3966+}
3967+.bs3 .form-control:focus {
3968+ border-color: #66afe9;
3969+ outline: 0;
3970+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
3971+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
3972+}
3973+.bs3 .form-control[disabled],
3974+.bs3 .form-control[readonly],
3975+fieldset[disabled] .bs3 .form-control {
3976+ cursor: not-allowed;
3977+ background-color: #eeeeee;
3978+}
3979+textarea.bs3 .form-control {
3980+ height: auto;
3981+}
3982+.bs3 .form-group {
3983+ margin-bottom: 15px;
3984+}
3985+.bs3 .radio,
3986+.bs3 .checkbox {
3987+ display: block;
3988+ min-height: 20px;
3989+ margin-top: 10px;
3990+ margin-bottom: 10px;
3991+ padding-left: 20px;
3992+ vertical-align: middle;
3993+}
3994+.bs3 .radio label,
3995+.bs3 .checkbox label {
3996+ display: inline;
3997+ margin-bottom: 0;
3998+ font-weight: normal;
3999+ cursor: pointer;
4000+}
4001+.bs3 .radio input[type="radio"],
4002+.bs3 .radio-inline input[type="radio"],
4003+.bs3 .checkbox input[type="checkbox"],
4004+.bs3 .checkbox-inline input[type="checkbox"] {
4005+ float: left;
4006+ margin-left: -20px;
4007+}
4008+.bs3 .radio + .radio,
4009+.bs3 .checkbox + .checkbox {
4010+ margin-top: -5px;
4011+}
4012+.bs3 .radio-inline,
4013+.bs3 .checkbox-inline {
4014+ display: inline-block;
4015+ padding-left: 20px;
4016+ margin-bottom: 0;
4017+ vertical-align: middle;
4018+ font-weight: normal;
4019+ cursor: pointer;
4020+}
4021+.bs3 .radio-inline + .radio-inline,
4022+.bs3 .checkbox-inline + .checkbox-inline {
4023+ margin-top: 0;
4024+ margin-left: 10px;
4025+}
4026+.bs3 input[type="radio"][disabled],
4027+.bs3 input[type="checkbox"][disabled],
4028+.bs3 .radio[disabled],
4029+.bs3 .radio-inline[disabled],
4030+.bs3 .checkbox[disabled],
4031+.bs3 .checkbox-inline[disabled],
4032+fieldset[disabled] .bs3 input[type="radio"],
4033+fieldset[disabled] .bs3 input[type="checkbox"],
4034+fieldset[disabled] .bs3 .radio,
4035+fieldset[disabled] .bs3 .radio-inline,
4036+fieldset[disabled] .bs3 .checkbox,
4037+fieldset[disabled] .bs3 .checkbox-inline {
4038+ cursor: not-allowed;
4039+}
4040+.bs3 .input-sm {
4041+ height: 30px;
4042+ padding: 5px 10px;
4043+ font-size: 12px;
4044+ line-height: 1.5;
4045+ border-radius: 3px;
4046+}
4047+select.bs3 .input-sm {
4048+ height: 30px;
4049+ line-height: 30px;
4050+}
4051+textarea.bs3 .input-sm {
4052+ height: auto;
4053+}
4054+.bs3 .input-lg {
4055+ height: 45px;
4056+ padding: 10px 16px;
4057+ font-size: 18px;
4058+ line-height: 1.33;
4059+ border-radius: 6px;
4060+}
4061+select.bs3 .input-lg {
4062+ height: 45px;
4063+ line-height: 45px;
4064+}
4065+textarea.bs3 .input-lg {
4066+ height: auto;
4067+}
4068+.bs3 .has-warning .help-block,
4069+.bs3 .has-warning .control-label {
4070+ color: #c09853;
4071+}
4072+.bs3 .has-warning .form-control {
4073+ border-color: #c09853;
4074+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4075+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4076+}
4077+.bs3 .has-warning .form-control:focus {
4078+ border-color: #a47e3c;
4079+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
4080+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
4081+}
4082+.bs3 .has-warning .input-group-addon {
4083+ color: #c09853;
4084+ border-color: #c09853;
4085+ background-color: #fcf8e3;
4086+}
4087+.bs3 .has-error .help-block,
4088+.bs3 .has-error .control-label {
4089+ color: #b94a48;
4090+}
4091+.bs3 .has-error .form-control {
4092+ border-color: #b94a48;
4093+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4094+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4095+}
4096+.bs3 .has-error .form-control:focus {
4097+ border-color: #953b39;
4098+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
4099+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
4100+}
4101+.bs3 .has-error .input-group-addon {
4102+ color: #b94a48;
4103+ border-color: #b94a48;
4104+ background-color: #f2dede;
4105+}
4106+.bs3 .has-success .help-block,
4107+.bs3 .has-success .control-label {
4108+ color: #468847;
4109+}
4110+.bs3 .has-success .form-control {
4111+ border-color: #468847;
4112+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4113+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
4114+}
4115+.bs3 .has-success .form-control:focus {
4116+ border-color: #356635;
4117+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
4118+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
4119+}
4120+.bs3 .has-success .input-group-addon {
4121+ color: #468847;
4122+ border-color: #468847;
4123+ background-color: #dff0d8;
4124+}
4125+.bs3 .form-control-static {
4126+ margin-bottom: 0;
4127+ padding-top: 7px;
4128+}
4129+.bs3 .help-block {
4130+ display: block;
4131+ margin-top: 5px;
4132+ margin-bottom: 10px;
4133+ color: #737373;
4134+}
4135+@media (min-width: 768px) {
4136+ .bs3 .form-inline .form-group {
4137+ display: inline-block;
4138+ margin-bottom: 0;
4139+ vertical-align: middle;
4140+ }
4141+ .bs3 .form-inline .form-control {
4142+ display: inline-block;
4143+ }
4144+ .bs3 .form-inline .radio,
4145+ .bs3 .form-inline .checkbox {
4146+ display: inline-block;
4147+ margin-top: 0;
4148+ margin-bottom: 0;
4149+ padding-left: 0;
4150+ }
4151+ .bs3 .form-inline .radio input[type="radio"],
4152+ .bs3 .form-inline .checkbox input[type="checkbox"] {
4153+ float: none;
4154+ margin-left: 0;
4155+ }
4156+}
4157+.bs3 .form-horizontal .control-label,
4158+.bs3 .form-horizontal .radio,
4159+.bs3 .form-horizontal .checkbox,
4160+.bs3 .form-horizontal .radio-inline,
4161+.bs3 .form-horizontal .checkbox-inline {
4162+ margin-top: 0;
4163+ margin-bottom: 0;
4164+ padding-top: 7px;
4165+}
4166+.bs3 .form-horizontal .form-group {
4167+ margin-left: -15px;
4168+ margin-right: -15px;
4169+}
4170+.bs3 .form-horizontal .form-group:before,
4171+.bs3 .form-horizontal .form-group:after {
4172+ content: " ";
4173+ /* 1 */
4174+
4175+ display: table;
4176+ /* 2 */
4177+
4178+}
4179+.bs3 .form-horizontal .form-group:after {
4180+ clear: both;
4181+}
4182+.bs3 .form-horizontal .form-group:before,
4183+.bs3 .form-horizontal .form-group:after {
4184+ content: " ";
4185+ /* 1 */
4186+
4187+ display: table;
4188+ /* 2 */
4189+
4190+}
4191+.bs3 .form-horizontal .form-group:after {
4192+ clear: both;
4193+}
4194+@media (min-width: 768px) {
4195+ .bs3 .form-horizontal .control-label {
4196+ text-align: right;
4197+ }
4198+}
4199+.bs3 .btn {
4200+ display: inline-block;
4201+ padding: 6px 12px;
4202+ margin-bottom: 0;
4203+ font-size: 14px;
4204+ font-weight: normal;
4205+ line-height: 1.428571429;
4206+ text-align: center;
4207+ vertical-align: middle;
4208+ cursor: pointer;
4209+ background-image: none;
4210+ border: 1px solid transparent;
4211+ border-radius: 4px;
4212+ white-space: nowrap;
4213+ -webkit-user-select: none;
4214+ -moz-user-select: none;
4215+ -ms-user-select: none;
4216+ -o-user-select: none;
4217+ user-select: none;
4218+}
4219+.bs3 .btn:focus {
4220+ outline: thin dotted #333;
4221+ outline: 5px auto -webkit-focus-ring-color;
4222+ outline-offset: -2px;
4223+}
4224+.bs3 .btn:hover,
4225+.bs3 .btn:focus {
4226+ color: #333333;
4227+ text-decoration: none;
4228+}
4229+.bs3 .btn:active,
4230+.bs3 .btn.active {
4231+ outline: 0;
4232+ background-image: none;
4233+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
4234+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
4235+}
4236+.bs3 .btn.disabled,
4237+.bs3 .btn[disabled],
4238+fieldset[disabled] .bs3 .btn {
4239+ cursor: not-allowed;
4240+ pointer-events: none;
4241+ opacity: 0.65;
4242+ filter: alpha(opacity=65);
4243+ -webkit-box-shadow: none;
4244+ box-shadow: none;
4245+}
4246+.bs3 .btn-default {
4247+ color: #333333;
4248+ background-color: #ffffff;
4249+ border-color: #cccccc;
4250+}
4251+.bs3 .btn-default:hover,
4252+.bs3 .btn-default:focus,
4253+.bs3 .btn-default:active,
4254+.bs3 .btn-default.active,
4255+.open .dropdown-toggle.bs3 .btn-default {
4256+ color: #333333;
4257+ background-color: #ebebeb;
4258+ border-color: #adadad;
4259+}
4260+.bs3 .btn-default:active,
4261+.bs3 .btn-default.active,
4262+.open .dropdown-toggle.bs3 .btn-default {
4263+ background-image: none;
4264+}
4265+.bs3 .btn-default.disabled,
4266+.bs3 .btn-default[disabled],
4267+fieldset[disabled] .bs3 .btn-default,
4268+.bs3 .btn-default.disabled:hover,
4269+.bs3 .btn-default[disabled]:hover,
4270+fieldset[disabled] .bs3 .btn-default:hover,
4271+.bs3 .btn-default.disabled:focus,
4272+.bs3 .btn-default[disabled]:focus,
4273+fieldset[disabled] .bs3 .btn-default:focus,
4274+.bs3 .btn-default.disabled:active,
4275+.bs3 .btn-default[disabled]:active,
4276+fieldset[disabled] .bs3 .btn-default:active,
4277+.bs3 .btn-default.disabled.active,
4278+.bs3 .btn-default[disabled].active,
4279+fieldset[disabled] .bs3 .btn-default.active {
4280+ background-color: #ffffff;
4281+ border-color: #cccccc;
4282+}
4283+.bs3 .btn-primary {
4284+ color: #ffffff;
4285+ background-color: #428bca;
4286+ border-color: #357ebd;
4287+}
4288+.bs3 .btn-primary:hover,
4289+.bs3 .btn-primary:focus,
4290+.bs3 .btn-primary:active,
4291+.bs3 .btn-primary.active,
4292+.open .dropdown-toggle.bs3 .btn-primary {
4293+ color: #ffffff;
4294+ background-color: #3276b1;
4295+ border-color: #285e8e;
4296+}
4297+.bs3 .btn-primary:active,
4298+.bs3 .btn-primary.active,
4299+.open .dropdown-toggle.bs3 .btn-primary {
4300+ background-image: none;
4301+}
4302+.bs3 .btn-primary.disabled,
4303+.bs3 .btn-primary[disabled],
4304+fieldset[disabled] .bs3 .btn-primary,
4305+.bs3 .btn-primary.disabled:hover,
4306+.bs3 .btn-primary[disabled]:hover,
4307+fieldset[disabled] .bs3 .btn-primary:hover,
4308+.bs3 .btn-primary.disabled:focus,
4309+.bs3 .btn-primary[disabled]:focus,
4310+fieldset[disabled] .bs3 .btn-primary:focus,
4311+.bs3 .btn-primary.disabled:active,
4312+.bs3 .btn-primary[disabled]:active,
4313+fieldset[disabled] .bs3 .btn-primary:active,
4314+.bs3 .btn-primary.disabled.active,
4315+.bs3 .btn-primary[disabled].active,
4316+fieldset[disabled] .bs3 .btn-primary.active {
4317+ background-color: #428bca;
4318+ border-color: #357ebd;
4319+}
4320+.bs3 .btn-warning {
4321+ color: #ffffff;
4322+ background-color: #f0ad4e;
4323+ border-color: #eea236;
4324+}
4325+.bs3 .btn-warning:hover,
4326+.bs3 .btn-warning:focus,
4327+.bs3 .btn-warning:active,
4328+.bs3 .btn-warning.active,
4329+.open .dropdown-toggle.bs3 .btn-warning {
4330+ color: #ffffff;
4331+ background-color: #ed9c28;
4332+ border-color: #d58512;
4333+}
4334+.bs3 .btn-warning:active,
4335+.bs3 .btn-warning.active,
4336+.open .dropdown-toggle.bs3 .btn-warning {
4337+ background-image: none;
4338+}
4339+.bs3 .btn-warning.disabled,
4340+.bs3 .btn-warning[disabled],
4341+fieldset[disabled] .bs3 .btn-warning,
4342+.bs3 .btn-warning.disabled:hover,
4343+.bs3 .btn-warning[disabled]:hover,
4344+fieldset[disabled] .bs3 .btn-warning:hover,
4345+.bs3 .btn-warning.disabled:focus,
4346+.bs3 .btn-warning[disabled]:focus,
4347+fieldset[disabled] .bs3 .btn-warning:focus,
4348+.bs3 .btn-warning.disabled:active,
4349+.bs3 .btn-warning[disabled]:active,
4350+fieldset[disabled] .bs3 .btn-warning:active,
4351+.bs3 .btn-warning.disabled.active,
4352+.bs3 .btn-warning[disabled].active,
4353+fieldset[disabled] .bs3 .btn-warning.active {
4354+ background-color: #f0ad4e;
4355+ border-color: #eea236;
4356+}
4357+.bs3 .btn-danger {
4358+ color: #ffffff;
4359+ background-color: #d9534f;
4360+ border-color: #d43f3a;
4361+}
4362+.bs3 .btn-danger:hover,
4363+.bs3 .btn-danger:focus,
4364+.bs3 .btn-danger:active,
4365+.bs3 .btn-danger.active,
4366+.open .dropdown-toggle.bs3 .btn-danger {
4367+ color: #ffffff;
4368+ background-color: #d2322d;
4369+ border-color: #ac2925;
4370+}
4371+.bs3 .btn-danger:active,
4372+.bs3 .btn-danger.active,
4373+.open .dropdown-toggle.bs3 .btn-danger {
4374+ background-image: none;
4375+}
4376+.bs3 .btn-danger.disabled,
4377+.bs3 .btn-danger[disabled],
4378+fieldset[disabled] .bs3 .btn-danger,
4379+.bs3 .btn-danger.disabled:hover,
4380+.bs3 .btn-danger[disabled]:hover,
4381+fieldset[disabled] .bs3 .btn-danger:hover,
4382+.bs3 .btn-danger.disabled:focus,
4383+.bs3 .btn-danger[disabled]:focus,
4384+fieldset[disabled] .bs3 .btn-danger:focus,
4385+.bs3 .btn-danger.disabled:active,
4386+.bs3 .btn-danger[disabled]:active,
4387+fieldset[disabled] .bs3 .btn-danger:active,
4388+.bs3 .btn-danger.disabled.active,
4389+.bs3 .btn-danger[disabled].active,
4390+fieldset[disabled] .bs3 .btn-danger.active {
4391+ background-color: #d9534f;
4392+ border-color: #d43f3a;
4393+}
4394+.bs3 .btn-success {
4395+ color: #ffffff;
4396+ background-color: #5cb85c;
4397+ border-color: #4cae4c;
4398+}
4399+.bs3 .btn-success:hover,
4400+.bs3 .btn-success:focus,
4401+.bs3 .btn-success:active,
4402+.bs3 .btn-success.active,
4403+.open .dropdown-toggle.bs3 .btn-success {
4404+ color: #ffffff;
4405+ background-color: #47a447;
4406+ border-color: #398439;
4407+}
4408+.bs3 .btn-success:active,
4409+.bs3 .btn-success.active,
4410+.open .dropdown-toggle.bs3 .btn-success {
4411+ background-image: none;
4412+}
4413+.bs3 .btn-success.disabled,
4414+.bs3 .btn-success[disabled],
4415+fieldset[disabled] .bs3 .btn-success,
4416+.bs3 .btn-success.disabled:hover,
4417+.bs3 .btn-success[disabled]:hover,
4418+fieldset[disabled] .bs3 .btn-success:hover,
4419+.bs3 .btn-success.disabled:focus,
4420+.bs3 .btn-success[disabled]:focus,
4421+fieldset[disabled] .bs3 .btn-success:focus,
4422+.bs3 .btn-success.disabled:active,
4423+.bs3 .btn-success[disabled]:active,
4424+fieldset[disabled] .bs3 .btn-success:active,
4425+.bs3 .btn-success.disabled.active,
4426+.bs3 .btn-success[disabled].active,
4427+fieldset[disabled] .bs3 .btn-success.active {
4428+ background-color: #5cb85c;
4429+ border-color: #4cae4c;
4430+}
4431+.bs3 .btn-info {
4432+ color: #ffffff;
4433+ background-color: #5bc0de;
4434+ border-color: #46b8da;
4435+}
4436+.bs3 .btn-info:hover,
4437+.bs3 .btn-info:focus,
4438+.bs3 .btn-info:active,
4439+.bs3 .btn-info.active,
4440+.open .dropdown-toggle.bs3 .btn-info {
4441+ color: #ffffff;
4442+ background-color: #39b3d7;
4443+ border-color: #269abc;
4444+}
4445+.bs3 .btn-info:active,
4446+.bs3 .btn-info.active,
4447+.open .dropdown-toggle.bs3 .btn-info {
4448+ background-image: none;
4449+}
4450+.bs3 .btn-info.disabled,
4451+.bs3 .btn-info[disabled],
4452+fieldset[disabled] .bs3 .btn-info,
4453+.bs3 .btn-info.disabled:hover,
4454+.bs3 .btn-info[disabled]:hover,
4455+fieldset[disabled] .bs3 .btn-info:hover,
4456+.bs3 .btn-info.disabled:focus,
4457+.bs3 .btn-info[disabled]:focus,
4458+fieldset[disabled] .bs3 .btn-info:focus,
4459+.bs3 .btn-info.disabled:active,
4460+.bs3 .btn-info[disabled]:active,
4461+fieldset[disabled] .bs3 .btn-info:active,
4462+.bs3 .btn-info.disabled.active,
4463+.bs3 .btn-info[disabled].active,
4464+fieldset[disabled] .bs3 .btn-info.active {
4465+ background-color: #5bc0de;
4466+ border-color: #46b8da;
4467+}
4468+.bs3 .btn-link {
4469+ color: #428bca;
4470+ font-weight: normal;
4471+ cursor: pointer;
4472+ border-radius: 0;
4473+}
4474+.bs3 .btn-link,
4475+.bs3 .btn-link:active,
4476+.bs3 .btn-link[disabled],
4477+fieldset[disabled] .bs3 .btn-link {
4478+ background-color: transparent;
4479+ -webkit-box-shadow: none;
4480+ box-shadow: none;
4481+}
4482+.bs3 .btn-link,
4483+.bs3 .btn-link:hover,
4484+.bs3 .btn-link:focus,
4485+.bs3 .btn-link:active {
4486+ border-color: transparent;
4487+}
4488+.bs3 .btn-link:hover,
4489+.bs3 .btn-link:focus {
4490+ color: #2a6496;
4491+ text-decoration: underline;
4492+ background-color: transparent;
4493+}
4494+.bs3 .btn-link[disabled]:hover,
4495+fieldset[disabled] .bs3 .btn-link:hover,
4496+.bs3 .btn-link[disabled]:focus,
4497+fieldset[disabled] .bs3 .btn-link:focus {
4498+ color: #999999;
4499+ text-decoration: none;
4500+}
4501+.bs3 .btn-lg {
4502+ padding: 10px 16px;
4503+ font-size: 18px;
4504+ line-height: 1.33;
4505+ border-radius: 6px;
4506+}
4507+.bs3 .btn-sm,
4508+.bs3 .btn-xs {
4509+ padding: 5px 10px;
4510+ font-size: 12px;
4511+ line-height: 1.5;
4512+ border-radius: 3px;
4513+}
4514+.bs3 .btn-xs {
4515+ padding: 1px 5px;
4516+}
4517+.bs3 .btn-block {
4518+ display: block;
4519+ width: 100%;
4520+ padding-left: 0;
4521+ padding-right: 0;
4522+}
4523+.bs3 .btn-block + .btn-block {
4524+ margin-top: 5px;
4525+}
4526+.bs3 input[type="submit"].btn-block,
4527+.bs3 input[type="reset"].btn-block,
4528+.bs3 input[type="button"].btn-block {
4529+ width: 100%;
4530+}
4531+.bs3 .fade {
4532+ opacity: 0;
4533+ -webkit-transition: opacity 0.15s linear;
4534+ transition: opacity 0.15s linear;
4535+}
4536+.bs3 .fade.in {
4537+ opacity: 1;
4538+}
4539+.bs3 .collapse {
4540+ display: none;
4541+}
4542+.bs3 .collapse.in {
4543+ display: block;
4544+}
4545+.bs3 .collapsing {
4546+ position: relative;
4547+ height: 0;
4548+ overflow: hidden;
4549+ -webkit-transition: height 0.35s ease;
4550+ transition: height 0.35s ease;
4551+}
4552+@font-face {
4553+ font-family: 'Glyphicons Halflings';
4554+ src: url('../fonts/glyphicons-halflings-regular.eot');
4555+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
4556+}
4557+.bs3 .glyphicon {
4558+ position: relative;
4559+ top: 1px;
4560+ display: inline-block;
4561+ font-family: 'Glyphicons Halflings';
4562+ font-style: normal;
4563+ font-weight: normal;
4564+ line-height: 1;
4565+ -webkit-font-smoothing: antialiased;
4566+}
4567+.bs3 .glyphicon:empty {
4568+ width: 1em;
4569+}
4570+.bs3 .glyphicon-asterisk:before {
4571+ content: "\2a";
4572+}
4573+.bs3 .glyphicon-plus:before {
4574+ content: "\2b";
4575+}
4576+.bs3 .glyphicon-euro:before {
4577+ content: "\20ac";
4578+}
4579+.bs3 .glyphicon-minus:before {
4580+ content: "\2212";
4581+}
4582+.bs3 .glyphicon-cloud:before {
4583+ content: "\2601";
4584+}
4585+.bs3 .glyphicon-envelope:before {
4586+ content: "\2709";
4587+}
4588+.bs3 .glyphicon-pencil:before {
4589+ content: "\270f";
4590+}
4591+.bs3 .glyphicon-glass:before {
4592+ content: "\e001";
4593+}
4594+.bs3 .glyphicon-music:before {
4595+ content: "\e002";
4596+}
4597+.bs3 .glyphicon-search:before {
4598+ content: "\e003";
4599+}
4600+.bs3 .glyphicon-heart:before {
4601+ content: "\e005";
4602+}
4603+.bs3 .glyphicon-star:before {
4604+ content: "\e006";
4605+}
4606+.bs3 .glyphicon-star-empty:before {
4607+ content: "\e007";
4608+}
4609+.bs3 .glyphicon-user:before {
4610+ content: "\e008";
4611+}
4612+.bs3 .glyphicon-film:before {
4613+ content: "\e009";
4614+}
4615+.bs3 .glyphicon-th-large:before {
4616+ content: "\e010";
4617+}
4618+.bs3 .glyphicon-th:before {
4619+ content: "\e011";
4620+}
4621+.bs3 .glyphicon-th-list:before {
4622+ content: "\e012";
4623+}
4624+.bs3 .glyphicon-ok:before {
4625+ content: "\e013";
4626+}
4627+.bs3 .glyphicon-remove:before {
4628+ content: "\e014";
4629+}
4630+.bs3 .glyphicon-zoom-in:before {
4631+ content: "\e015";
4632+}
4633+.bs3 .glyphicon-zoom-out:before {
4634+ content: "\e016";
4635+}
4636+.bs3 .glyphicon-off:before {
4637+ content: "\e017";
4638+}
4639+.bs3 .glyphicon-signal:before {
4640+ content: "\e018";
4641+}
4642+.bs3 .glyphicon-cog:before {
4643+ content: "\e019";
4644+}
4645+.bs3 .glyphicon-trash:before {
4646+ content: "\e020";
4647+}
4648+.bs3 .glyphicon-home:before {
4649+ content: "\e021";
4650+}
4651+.bs3 .glyphicon-file:before {
4652+ content: "\e022";
4653+}
4654+.bs3 .glyphicon-time:before {
4655+ content: "\e023";
4656+}
4657+.bs3 .glyphicon-road:before {
4658+ content: "\e024";
4659+}
4660+.bs3 .glyphicon-download-alt:before {
4661+ content: "\e025";
4662+}
4663+.bs3 .glyphicon-download:before {
4664+ content: "\e026";
4665+}
4666+.bs3 .glyphicon-upload:before {
4667+ content: "\e027";
4668+}
4669+.bs3 .glyphicon-inbox:before {
4670+ content: "\e028";
4671+}
4672+.bs3 .glyphicon-play-circle:before {
4673+ content: "\e029";
4674+}
4675+.bs3 .glyphicon-repeat:before {
4676+ content: "\e030";
4677+}
4678+.bs3 .glyphicon-refresh:before {
4679+ content: "\e031";
4680+}
4681+.bs3 .glyphicon-list-alt:before {
4682+ content: "\e032";
4683+}
4684+.bs3 .glyphicon-flag:before {
4685+ content: "\e034";
4686+}
4687+.bs3 .glyphicon-headphones:before {
4688+ content: "\e035";
4689+}
4690+.bs3 .glyphicon-volume-off:before {
4691+ content: "\e036";
4692+}
4693+.bs3 .glyphicon-volume-down:before {
4694+ content: "\e037";
4695+}
4696+.bs3 .glyphicon-volume-up:before {
4697+ content: "\e038";
4698+}
4699+.bs3 .glyphicon-qrcode:before {
4700+ content: "\e039";
4701+}
4702+.bs3 .glyphicon-barcode:before {
4703+ content: "\e040";
4704+}
4705+.bs3 .glyphicon-tag:before {
4706+ content: "\e041";
4707+}
4708+.bs3 .glyphicon-tags:before {
4709+ content: "\e042";
4710+}
4711+.bs3 .glyphicon-book:before {
4712+ content: "\e043";
4713+}
4714+.bs3 .glyphicon-print:before {
4715+ content: "\e045";
4716+}
4717+.bs3 .glyphicon-font:before {
4718+ content: "\e047";
4719+}
4720+.bs3 .glyphicon-bold:before {
4721+ content: "\e048";
4722+}
4723+.bs3 .glyphicon-italic:before {
4724+ content: "\e049";
4725+}
4726+.bs3 .glyphicon-text-height:before {
4727+ content: "\e050";
4728+}
4729+.bs3 .glyphicon-text-width:before {
4730+ content: "\e051";
4731+}
4732+.bs3 .glyphicon-align-left:before {
4733+ content: "\e052";
4734+}
4735+.bs3 .glyphicon-align-center:before {
4736+ content: "\e053";
4737+}
4738+.bs3 .glyphicon-align-right:before {
4739+ content: "\e054";
4740+}
4741+.bs3 .glyphicon-align-justify:before {
4742+ content: "\e055";
4743+}
4744+.bs3 .glyphicon-list:before {
4745+ content: "\e056";
4746+}
4747+.bs3 .glyphicon-indent-left:before {
4748+ content: "\e057";
4749+}
4750+.bs3 .glyphicon-indent-right:before {
4751+ content: "\e058";
4752+}
4753+.bs3 .glyphicon-facetime-video:before {
4754+ content: "\e059";
4755+}
4756+.bs3 .glyphicon-picture:before {
4757+ content: "\e060";
4758+}
4759+.bs3 .glyphicon-map-marker:before {
4760+ content: "\e062";
4761+}
4762+.bs3 .glyphicon-adjust:before {
4763+ content: "\e063";
4764+}
4765+.bs3 .glyphicon-tint:before {
4766+ content: "\e064";
4767+}
4768+.bs3 .glyphicon-edit:before {
4769+ content: "\e065";
4770+}
4771+.bs3 .glyphicon-share:before {
4772+ content: "\e066";
4773+}
4774+.bs3 .glyphicon-check:before {
4775+ content: "\e067";
4776+}
4777+.bs3 .glyphicon-move:before {
4778+ content: "\e068";
4779+}
4780+.bs3 .glyphicon-step-backward:before {
4781+ content: "\e069";
4782+}
4783+.bs3 .glyphicon-fast-backward:before {
4784+ content: "\e070";
4785+}
4786+.bs3 .glyphicon-backward:before {
4787+ content: "\e071";
4788+}
4789+.bs3 .glyphicon-play:before {
4790+ content: "\e072";
4791+}
4792+.bs3 .glyphicon-pause:before {
4793+ content: "\e073";
4794+}
4795+.bs3 .glyphicon-stop:before {
4796+ content: "\e074";
4797+}
4798+.bs3 .glyphicon-forward:before {
4799+ content: "\e075";
4800+}
4801+.bs3 .glyphicon-fast-forward:before {
4802+ content: "\e076";
4803+}
4804+.bs3 .glyphicon-step-forward:before {
4805+ content: "\e077";
4806+}
4807+.bs3 .glyphicon-eject:before {
4808+ content: "\e078";
4809+}
4810+.bs3 .glyphicon-chevron-left:before {
4811+ content: "\e079";
4812+}
4813+.bs3 .glyphicon-chevron-right:before {
4814+ content: "\e080";
4815+}
4816+.bs3 .glyphicon-plus-sign:before {
4817+ content: "\e081";
4818+}
4819+.bs3 .glyphicon-minus-sign:before {
4820+ content: "\e082";
4821+}
4822+.bs3 .glyphicon-remove-sign:before {
4823+ content: "\e083";
4824+}
4825+.bs3 .glyphicon-ok-sign:before {
4826+ content: "\e084";
4827+}
4828+.bs3 .glyphicon-question-sign:before {
4829+ content: "\e085";
4830+}
4831+.bs3 .glyphicon-info-sign:before {
4832+ content: "\e086";
4833+}
4834+.bs3 .glyphicon-screenshot:before {
4835+ content: "\e087";
4836+}
4837+.bs3 .glyphicon-remove-circle:before {
4838+ content: "\e088";
4839+}
4840+.bs3 .glyphicon-ok-circle:before {
4841+ content: "\e089";
4842+}
4843+.bs3 .glyphicon-ban-circle:before {
4844+ content: "\e090";
4845+}
4846+.bs3 .glyphicon-arrow-left:before {
4847+ content: "\e091";
4848+}
4849+.bs3 .glyphicon-arrow-right:before {
4850+ content: "\e092";
4851+}
4852+.bs3 .glyphicon-arrow-up:before {
4853+ content: "\e093";
4854+}
4855+.bs3 .glyphicon-arrow-down:before {
4856+ content: "\e094";
4857+}
4858+.bs3 .glyphicon-share-alt:before {
4859+ content: "\e095";
4860+}
4861+.bs3 .glyphicon-resize-full:before {
4862+ content: "\e096";
4863+}
4864+.bs3 .glyphicon-resize-small:before {
4865+ content: "\e097";
4866+}
4867+.bs3 .glyphicon-exclamation-sign:before {
4868+ content: "\e101";
4869+}
4870+.bs3 .glyphicon-gift:before {
4871+ content: "\e102";
4872+}
4873+.bs3 .glyphicon-leaf:before {
4874+ content: "\e103";
4875+}
4876+.bs3 .glyphicon-eye-open:before {
4877+ content: "\e105";
4878+}
4879+.bs3 .glyphicon-eye-close:before {
4880+ content: "\e106";
4881+}
4882+.bs3 .glyphicon-warning-sign:before {
4883+ content: "\e107";
4884+}
4885+.bs3 .glyphicon-plane:before {
4886+ content: "\e108";
4887+}
4888+.bs3 .glyphicon-random:before {
4889+ content: "\e110";
4890+}
4891+.bs3 .glyphicon-comment:before {
4892+ content: "\e111";
4893+}
4894+.bs3 .glyphicon-magnet:before {
4895+ content: "\e112";
4896+}
4897+.bs3 .glyphicon-chevron-up:before {
4898+ content: "\e113";
4899+}
4900+.bs3 .glyphicon-chevron-down:before {
4901+ content: "\e114";
4902+}
4903+.bs3 .glyphicon-retweet:before {
4904+ content: "\e115";
4905+}
4906+.bs3 .glyphicon-shopping-cart:before {
4907+ content: "\e116";
4908+}
4909+.bs3 .glyphicon-folder-close:before {
4910+ content: "\e117";
4911+}
4912+.bs3 .glyphicon-folder-open:before {
4913+ content: "\e118";
4914+}
4915+.bs3 .glyphicon-resize-vertical:before {
4916+ content: "\e119";
4917+}
4918+.bs3 .glyphicon-resize-horizontal:before {
4919+ content: "\e120";
4920+}
4921+.bs3 .glyphicon-hdd:before {
4922+ content: "\e121";
4923+}
4924+.bs3 .glyphicon-bullhorn:before {
4925+ content: "\e122";
4926+}
4927+.bs3 .glyphicon-certificate:before {
4928+ content: "\e124";
4929+}
4930+.bs3 .glyphicon-thumbs-up:before {
4931+ content: "\e125";
4932+}
4933+.bs3 .glyphicon-thumbs-down:before {
4934+ content: "\e126";
4935+}
4936+.bs3 .glyphicon-hand-right:before {
4937+ content: "\e127";
4938+}
4939+.bs3 .glyphicon-hand-left:before {
4940+ content: "\e128";
4941+}
4942+.bs3 .glyphicon-hand-up:before {
4943+ content: "\e129";
4944+}
4945+.bs3 .glyphicon-hand-down:before {
4946+ content: "\e130";
4947+}
4948+.bs3 .glyphicon-circle-arrow-right:before {
4949+ content: "\e131";
4950+}
4951+.bs3 .glyphicon-circle-arrow-left:before {
4952+ content: "\e132";
4953+}
4954+.bs3 .glyphicon-circle-arrow-up:before {
4955+ content: "\e133";
4956+}
4957+.bs3 .glyphicon-circle-arrow-down:before {
4958+ content: "\e134";
4959+}
4960+.bs3 .glyphicon-globe:before {
4961+ content: "\e135";
4962+}
4963+.bs3 .glyphicon-tasks:before {
4964+ content: "\e137";
4965+}
4966+.bs3 .glyphicon-filter:before {
4967+ content: "\e138";
4968+}
4969+.bs3 .glyphicon-fullscreen:before {
4970+ content: "\e140";
4971+}
4972+.bs3 .glyphicon-dashboard:before {
4973+ content: "\e141";
4974+}
4975+.bs3 .glyphicon-heart-empty:before {
4976+ content: "\e143";
4977+}
4978+.bs3 .glyphicon-link:before {
4979+ content: "\e144";
4980+}
4981+.bs3 .glyphicon-phone:before {
4982+ content: "\e145";
4983+}
4984+.bs3 .glyphicon-usd:before {
4985+ content: "\e148";
4986+}
4987+.bs3 .glyphicon-gbp:before {
4988+ content: "\e149";
4989+}
4990+.bs3 .glyphicon-sort:before {
4991+ content: "\e150";
4992+}
4993+.bs3 .glyphicon-sort-by-alphabet:before {
4994+ content: "\e151";
4995+}
4996+.bs3 .glyphicon-sort-by-alphabet-alt:before {
4997+ content: "\e152";
4998+}
4999+.bs3 .glyphicon-sort-by-order:before {
5000+ content: "\e153";
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches