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
=== added file '.bzrignore'
--- .bzrignore 1970-01-01 00:00:00 +0000
+++ .bzrignore 2014-04-22 22:55:50 +0000
@@ -0,0 +1,3 @@
1^.DS_Store
2*.DS_Store
3portal_public_documents/static/files/*
04
=== added directory 'multi_image'
=== added file 'multi_image/__init__.py'
--- multi_image/__init__.py 1970-01-01 00:00:00 +0000
+++ multi_image/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import controllers
24
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file26\ No newline at end of file
127
=== added file 'multi_image/__openerp__.py'
--- multi_image/__openerp__.py 1970-01-01 00:00:00 +0000
+++ multi_image/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,50 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23{
24 "name" : "Multi Image",
25 "version" : "1.0",
26 "author" : "Serpent Consulting Services Pvt. Ltd.",
27 "category": 'Image',
28 'complexity': "easy",
29 'depends': ['web'],
30 "description": """
31 This module provides the functionality to store multiple images for one record.
32 All images store in server directory. so database size doesnot increase.
33 """,
34 'update_xml': [
35 ],
36 'js':[
37 "static/lib/lightbox/js/jquery.lightbox.js",
38 "static/src/js/multi_image.js"
39 ],
40 'css':[
41 "static/src/css/hoverbox.css",
42 "static/lib/lightbox/css/lightbox.css",
43 ],
44 'website': 'http://www.serpentcs.com',
45 'qweb': ['static/src/xml/image_multi.xml'],
46 'installable': True,
47 'auto_install': False,
48}
49
50# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
051
=== added directory 'multi_image/controllers'
=== added file 'multi_image/controllers/__init__.py'
--- multi_image/controllers/__init__.py 1970-01-01 00:00:00 +0000
+++ multi_image/controllers/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from . import main
24
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file26\ No newline at end of file
127
=== added file 'multi_image/controllers/main.py'
--- multi_image/controllers/main.py 1970-01-01 00:00:00 +0000
+++ multi_image/controllers/main.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,61 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from web import http
24from openerp.addons.web.controllers.main import Binary
25openerpweb = http
26import simplejson
27import time
28import openerp
29import os
30import StringIO
31
32class Binary_multi(Binary):
33
34 @openerpweb.httprequest
35 def upload_image_multi(self, req, callback, ufile):
36 # TODO: might be useful to have a configuration flag for max-length file uploads
37 out = """<script language="javascript" type="text/javascript">
38 var win = window.top.window;
39 win.jQuery(win).trigger(%s, %s);
40 </script>"""
41 data = ufile.read()
42 if data:
43 current_dat_time = time.strftime("%d%m%y%H%M%S")
44 file_name = current_dat_time + "_" + ufile.filename
45 addons_path = openerpweb.addons_manifest['web']['addons_path'] + "/web/static/src/img/image_multi/"
46 if not os.path.isdir(addons_path):
47 os.mkdir(addons_path)
48 addons_path += file_name
49 buff = StringIO.StringIO()
50 buff.write(data)
51 buff.seek(0)
52 file_name = "/web/static/src/img/image_multi/" + file_name
53 file = open(addons_path, 'wb')
54 file.write(buff.read())
55 file.close()
56 args = [len(data), file_name, ufile.content_type, ufile.filename, time.strftime("%m/%d/%Y %H:%M:%S")]
57 else:
58 args = []
59 return out % (simplejson.dumps(callback), simplejson.dumps(args))
60
61# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file62\ No newline at end of file
163
=== added directory 'multi_image/static'
=== added directory 'multi_image/static/lib'
=== added directory 'multi_image/static/lib/lightbox'
=== added directory 'multi_image/static/lib/lightbox/css'
=== added file 'multi_image/static/lib/lightbox/css/lightbox.css'
--- multi_image/static/lib/lightbox/css/lightbox.css 1970-01-01 00:00:00 +0000
+++ multi_image/static/lib/lightbox/css/lightbox.css 2014-04-22 22:55:50 +0000
@@ -0,0 +1,128 @@
1#lightbox{
2 position: absolute;
3 left: 0;
4 width: 100%;
5 z-index: 100;
6 text-align: center;
7 line-height: 0;
8 }
9
10#lightbox a img{ border: none; }
11
12#outerImageContainer{
13 position: relative;
14 background-color: #fff;
15 width: 250px;
16 height: 250px;
17 margin: 0 auto;
18 }
19
20#imageContainer{
21 padding: 10px;
22 }
23
24#loading{
25 position: absolute;
26 top: 40%;
27 left: 0%;
28 height: 25%;
29 width: 100%;
30 text-align: center;
31 line-height: 0;
32 }
33#hoverNav{
34 position: absolute;
35 top: 0;
36 left: 0;
37 height: 100%;
38 width: 100%;
39 z-index: 10;
40 }
41#imageContainer>#hoverNav{ left: 0;}
42#hoverNav a{ outline: none;}
43
44#prevLink, #nextLink{
45 width: 49%;
46 height: 100%;
47 background: transparent url(../images/blank.gif) no-repeat; /* Trick IE into showing hover */
48 display: block;
49 }
50#prevLink { left: 0; float: left;}
51#nextLink { right: 0; float: right;}
52#prevLink:hover, #prevLink:visited:hover { background: url(../images/prev.gif) left 50% no-repeat; }
53#nextLink:hover, #nextLink:visited:hover { background: url(../images/next.gif) right 50% no-repeat; }
54/*** START : next / previous text links ***/
55nextLinkText, #prevLinkText{
56color: #FF9834;
57font-weight:bold;
58text-decoration: none;
59}
60#nextLinkText{
61padding-left: 20px;
62}
63#prevLinkText{
64padding-right: 20px;
65}
66/*** END : next / previous text links ***/
67/*** START : added padding when navbar is on top ***/
68
69.ontop #imageData {
70 padding-top: 5px;
71}
72
73/*** END : added padding when navbar is on top ***/
74
75#imageDataContainer{
76 font: 10px Verdana, Helvetica, sans-serif;
77 background-color: #fff;
78 margin: 0 auto;
79 line-height: 1.4em;
80 }
81
82#imageData{
83 padding:0 10px;
84 }
85#imageData #imageDetails{ width: 70%; float: left; text-align: left; }
86#imageData #caption{ font-weight: bold; }
87#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
88#imageData #numberDisplay a { color: black; padding-left: 5px; padding-right: 5px;}
89#imageData #bottomNavClose{float: right; padding-bottom: 0.7em; }
90#imageData #helpDisplay {clear: left; float: left; display: block; }
91
92#overlay{
93 position: absolute;
94 top: 0;
95 left: 0;
96 z-index: 90;
97 width: 100%;
98 height: 500px;
99 background-color: #000;
100 filter:alpha(opacity=60);
101 -moz-opacity: 0.6;
102 opacity: 0.6 !important;
103 display: none;
104 }
105
106
107.clearfix:after {
108 content: ".";
109 display: block;
110 height: 0;
111 clear: both;
112 visibility: hidden;
113 }
114
115* html>body .clearfix {
116 display: inline-block;
117 width: 100%;
118 }
119
120* html .clearfix {
121 /* Hides from IE-mac \*/
122 height: 1%;
123 /* End hide from IE-mac */
124 }
125
126#lightboxIframe {
127 display: none;
128}
0129
=== added directory 'multi_image/static/lib/lightbox/images'
=== added file 'multi_image/static/lib/lightbox/images/blank.gif'
1Binary 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 differ130Binary 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
=== added file 'multi_image/static/lib/lightbox/images/close.gif'
2Binary 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 differ131Binary 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
=== added file 'multi_image/static/lib/lightbox/images/closelabel.gif'
3Binary 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 differ132Binary 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
=== added file 'multi_image/static/lib/lightbox/images/loading.gif'
4Binary 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 differ133Binary 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
=== added file 'multi_image/static/lib/lightbox/images/next.gif'
5Binary 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 differ134Binary 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
=== added file 'multi_image/static/lib/lightbox/images/nextlabel.gif'
6Binary 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 differ135Binary 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
=== added file 'multi_image/static/lib/lightbox/images/prev.gif'
7Binary 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 differ136Binary 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
=== added file 'multi_image/static/lib/lightbox/images/prevlabel.gif'
8Binary 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 differ137Binary 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
=== added directory 'multi_image/static/lib/lightbox/js'
=== added file 'multi_image/static/lib/lightbox/js/jquery.lightbox.js'
--- multi_image/static/lib/lightbox/js/jquery.lightbox.js 1970-01-01 00:00:00 +0000
+++ multi_image/static/lib/lightbox/js/jquery.lightbox.js 2014-04-22 22:55:50 +0000
@@ -0,0 +1,501 @@
1/**
2 * jQuery Lightbox
3 * @author Warren Krewenki
4 *
5 * This package is distributed under the BSD license.
6 * For full license information, see LICENSE.TXT
7 *
8 * Based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
9 *
10 *
11 **/
12
13(function($) {
14 $.fn.lightbox = function(options) {
15 // build main options
16 var opts = $.extend({}, $.fn.lightbox.defaults, options);
17
18 $(window).resize(resizeOverlayToFitWindow);
19
20 initialize();
21 showLightbox(this);
22 /*
23 # Initialize the lightbox by creating our html and reading some image data
24 # This method is called by the constructor after any click events trigger it
25 # You will never call it by itself, to my knowledge.
26 */
27 function initialize() {
28 $('#overlay, #lightbox').remove();
29 opts.inprogress = false;
30
31 // if jsonData, build the imageArray from data provided in JSON format
32 if (opts.jsonData && opts.jsonData.length > 0) {
33 var parser = opts.jsonDataParser ? opts.jsonDataParser : $.fn.lightbox.parseJsonData;
34 opts.imageArray = [];
35 opts.imageArray = parser(opts.jsonData);
36 }
37
38 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>';
39 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">';
40
41// 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>';
42// 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">';
43
44 if (opts.displayHelp) {
45 imageData += '<span id="helpDisplay">' + opts.strings.help + '</span>';
46 }
47
48 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>';
49
50 var string;
51
52 if (opts.navbarOnTop) {
53 string = '<div id="overlay"></div><div id="lightbox">' + imageData + outerImage + '</div>';
54 $("body").append(string);
55 $("#imageDataContainer").addClass('ontop');
56 } else {
57 string = '<div id="overlay"></div><div id="lightbox">' + outerImage + imageData + '</div>';
58 $("body").append(string);
59 }
60
61 //$("#overlay, #lightbox").click(function(){ end(); }).hide();
62 $("#loadingLink, #bottomNavClose").click(function(){ end(); return false;});
63 $('#outerImageContainer').width(opts.widthCurrent).height(opts.heightCurrent);
64 $('#imageDataContainer').width(opts.widthCurrent);
65
66 if (!opts.imageClickClose) {
67 $("#lightboxImage").click(function(){ return false; });
68 $("#hoverNav").click(function(){ return false; });
69 }
70
71 return true;
72 };
73
74 /*
75 # Get the document and window width/heigh
76 #
77 # Examples
78 #
79 # getPageSize()
80 # # => [1024,768,1024,768]
81 #
82 # Returns a numerically indexed array of document width/height and window width/height
83 */
84 function getPageSize() {
85 var jqueryPageSize = new Array($(document).width(),$(document).height(), $(window).width(), $(window).height());
86 return jqueryPageSize;
87 };
88
89 function getPageScroll() {
90 var xScroll, yScroll;
91
92 if (self.pageYOffset) {
93 yScroll = self.pageYOffset;
94 xScroll = self.pageXOffset;
95 } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
96 yScroll = document.documentElement.scrollTop;
97 xScroll = document.documentElement.scrollLeft;
98 } else if (document.body) {// all other Explorers
99 yScroll = document.body.scrollTop;
100 xScroll = document.body.scrollLeft;
101 }
102
103 var arrayPageScroll = new Array(xScroll,yScroll);
104 return arrayPageScroll;
105 };
106
107 /*
108 # Deploy the sexy overlay and display the lightbox
109 #
110 # imageObject - the jQuery object passed via the click event in the constructor
111 #
112 # Examples
113 #
114 # showLightbox($('#CheesusCrust'))
115 #
116 # Returns a boolean true, because it's got nothing else to return. It should give visual feedback when run
117 */
118 function showLightbox(imageObject) {
119 /**
120 * select, embed and object tags render over the lightbox in some browsers
121 * Right now, the best way to fix it is to hide them, but that can trigger reloading of some flash content
122 * I don't have a better fix for this right now, but I want ot leave this comment here so you and I both
123 * know that i'm aware of it, and I would love to fix it, if you have any suggestions.
124 **/
125 $("select, embed, object").hide();
126
127 // Resize and display the sexy, sexy overlay.
128 resizeOverlayToFitWindow();
129 $("#overlay").hide().css({ opacity : opts.overlayOpacity }).fadeIn();
130 imageNum = 0;
131
132 // if data is not provided by jsonData parameter
133 if (!opts.jsonData) {
134 opts.imageArray = [];
135 // if image is NOT part of a set..
136 if ((!imageObject.rel || (imageObject.rel == '')) && !opts.allSet) {
137 // add single image to Lightbox.imageArray
138 opts.imageArray.push(new Array(imageObject.href, opts.displayTitle ? imageObject.title : ''));
139 } else {
140 // if image is part of a set..
141 $("a").each(function() {
142 if(this.href && (this.rel == imageObject.rel)) {
143 opts.imageArray.push(new Array(this.href, opts.displayTitle ? this.title : ''));
144 }
145 });
146 }
147 }
148
149 if (opts.imageArray.length > 1) {
150 for (i = 0; i < opts.imageArray.length; i++) {
151 for (j = opts.imageArray.length - 1; j > i; j--) {
152 if (opts.imageArray[i][0] == opts.imageArray[j][0]) {
153 opts.imageArray.splice(j, 1);
154 }
155 }
156 }
157 while (opts.imageArray[imageNum][0] != imageObject.href) {
158 imageNum++;
159 if (imageNum < opts.imageArray.length) {
160 break;
161 }
162 }
163 }
164
165 // calculate top and left offset for the lightbox
166 var arrayPageScroll = getPageScroll();
167 var lightboxTop = arrayPageScroll[1] + ($(window).height() / 10);
168 var lightboxLeft = arrayPageScroll[0];
169 $('#lightbox').css({top: lightboxTop+'px', left: lightboxLeft+'px'}).show();
170
171 if (!opts.slideNavBar) {
172 $('#imageData').hide();
173 }
174
175 changeImage(imageNum);
176 };
177
178 function changeImage(imageNum) {
179 if (opts.inprogress == false) {
180 opts.inprogress = true;
181
182 // update global var
183 opts.activeImage = imageNum;
184
185 // hide elements during transition
186 $('#loading').show();
187 $('#lightboxImage, #hoverNav, #prevLink, #nextLink').hide();
188
189 // delay preloading image until navbar will slide up
190 if (opts.slideNavBar) {
191 $('#imageDataContainer').hide();
192 $('#imageData').hide();
193 }
194 doChangeImage();
195 }
196 };
197
198 function doChangeImage() {
199 imgPreloader = new Image();
200
201 // once image is preloaded, resize image container
202 imgPreloader.onload = function() {
203 var newWidth = imgPreloader.width;
204 var newHeight = imgPreloader.height;
205
206 if (opts.scaleImages) {
207 newWidth = parseInt(opts.xScale * newWidth);
208 newHeight = parseInt(opts.yScale * newHeight);
209 }
210
211 if (opts.fitToScreen) {
212 var arrayPageSize = getPageSize();
213 var ratio;
214 var initialPageWidth = arrayPageSize[2] - 2 * opts.borderSize;
215 var initialPageHeight = arrayPageSize[3] - 200;
216
217 var dI = initialPageWidth/initialPageHeight;
218 var dP = imgPreloader.width/imgPreloader.height;
219
220 if ((imgPreloader.height > initialPageHeight) || (imgPreloader.width > initialPageWidth)) {
221 if (dI > dP) {
222 newWidth = parseInt((initialPageHeight/imgPreloader.height) * imgPreloader.width);
223 newHeight = initialPageHeight;
224 } else {
225 newHeight = parseInt((initialPageWidth/imgPreloader.width) * imgPreloader.height);
226 newWidth = initialPageWidth;
227 }
228 }
229 }
230 if (newWidth > 700) {
231 newWidth = 700
232 }
233 if (newHeight > 500) {
234 newHeight = 500
235 }
236 var line_height = (newHeight / 100) * 7 + 24
237 $("#imageContainer").attr("style", "line-height:" + line_height)
238 $("#lightboxImage").attr("style", "line-height:" + line_height)
239 $('#lightboxImage').
240 attr('src', opts.imageArray[opts.activeImage][0]).
241 width(newWidth).
242 height(newHeight);
243
244 resizeImageContainer(newWidth, newHeight);
245 };
246
247 imgPreloader.src = opts.imageArray[opts.activeImage][0];
248 };
249
250 function end() {
251 $('#overlay, #lightbox, #outerImageContainer, #imageDataContainer').remove();
252 };
253
254 function preloadNeighborImages() {
255 if (opts.loopImages && opts.imageArray.length > 1) {
256 preloadNextImage = new Image();
257 preloadNextImage.src = opts.imageArray[(opts.activeImage == (opts.imageArray.length - 1)) ? 0 : opts.activeImage + 1][0];
258
259 preloadPrevImage = new Image();
260 preloadPrevImage.src = opts.imageArray[(opts.activeImage == 0) ? (opts.imageArray.length - 1) : opts.activeImage - 1][0];
261 } else {
262 if ((opts.imageArray.length - 1) > opts.activeImage) {
263 preloadNextImage = new Image();
264 preloadNextImage.src = opts.imageArray[opts.activeImage + 1][0];
265 }
266 if (opts.activeImage > 0) {
267 preloadPrevImage = new Image();
268 preloadPrevImage.src = opts.imageArray[opts.activeImage - 1][0];
269 }
270 }
271 };
272
273 function resizeImageContainer(imgWidth, imgHeight) {
274 // get current width and height
275 opts.widthCurrent = $("#outerImageContainer").outerWidth();
276 opts.heightCurrent = $("#outerImageContainer").outerHeight();
277
278 // get new width and height
279 var widthNew = 730;
280 var heightNew = 520;
281
282 // calculate size difference between new and old image, and resize if necessary
283 wDiff = opts.widthCurrent - widthNew;
284 hDiff = opts.heightCurrent - heightNew;
285
286 $('#imageDataContainer').animate({width: widthNew},opts.resizeSpeed,'linear');
287 $('#outerImageContainer').animate({width: widthNew},opts.resizeSpeed,'linear', function() {
288 $('#outerImageContainer').animate({height: heightNew},opts.resizeSpeed,'linear', function() {
289 showImage();
290 });
291 });
292
293 afterTimeout = function () {
294 $('#prevLink').height(500);
295 $('#nextLink').height(500);
296 };
297
298 // if new and old image are same size and no scaling transition is necessary,
299 // do a quick pause to prevent image flicker.
300 if((hDiff == 0) && (wDiff == 0)) {
301 if (jQuery.browser.msie) {
302 setTimeout(afterTimeout, 250);
303 } else {
304 setTimeout(afterTimeout, 100);
305 }
306 } else {
307 // otherwise just trigger the height and width change
308 afterTimeout();
309 }
310
311 };
312
313 function showImage() {
314 $('#loading').hide();
315 $('#lightboxImage').fadeIn("fast");
316 updateDetails();
317 preloadNeighborImages();
318
319 opts.inprogress = false;
320 };
321
322 function updateDetails() {
323 $('#numberDisplay').html('');
324
325 if (opts.imageArray[opts.activeImage][1]) {
326 $('#caption').html(opts.imageArray[opts.activeImage][1]).show();
327 }
328
329 // if image is part of set display 'Image x of x'
330 if (opts.imageArray.length > 1) {
331 var nav_html;
332
333 nav_html = opts.strings.image + (opts.activeImage + 1) + opts.strings.of + opts.imageArray.length;
334
335 if (opts.displayDownloadLink) {
336 nav_html += "<a href='" + opts.imageArray[opts.activeImage][0] + "'>" + opts.strings.download + "</a>";
337 }
338
339 if (!opts.disableNavbarLinks) {
340 // display previous / next text links
341 if ((opts.activeImage) > 0 || opts.loopImages) {
342 nav_html = '<a title="' + opts.strings.prevLinkTitle + '" href="#" id="prevLinkText">' + opts.strings.prevLinkText + "</a>" + nav_html;
343 }
344
345 if (((opts.activeImage + 1) < opts.imageArray.length) || opts.loopImages) {
346 nav_html += '<a title="' + opts.strings.nextLinkTitle + '" href="#" id="nextLinkText">' + opts.strings.nextLinkText + "</a>";
347 }
348 }
349
350 $('#numberDisplay').html(nav_html).show();
351 }
352
353 if (opts.slideNavBar) {
354 $("#imageData").slideDown(opts.navBarSlideSpeed);
355 } else {
356 $("#imageData").show();
357 }
358
359 resizeOverlayToFitWindow();
360 updateNav();
361 };
362
363 /*
364 # Resize the sexy overlay to fit the constraints of your current viewing environment
365 #
366 # This should now happen whenever a window is resized, so you should always see a full overlay
367 */
368 function resizeOverlayToFitWindow(){
369 $('#overlay').css({width: $(document).width(), height: $(document).height()});
370 // ^^^^^^^ <- sexy!
371 };
372
373 function updateNav() {
374 if (opts.imageArray.length > 1) {
375 $('#hoverNav').show();
376
377 // if loopImages is true, always show next and prev image buttons
378 if(opts.loopImages) {
379 $('#prevLink,#prevLinkText').show().click(function() {
380 changeImage((opts.activeImage == 0) ? (opts.imageArray.length - 1) : opts.activeImage - 1);
381 return false;
382 });
383
384 $('#nextLink,#nextLinkText').show().click(function() {
385 changeImage((opts.activeImage == (opts.imageArray.length - 1)) ? 0 : opts.activeImage + 1);
386 return false;
387 });
388 } else {
389 // if not first image in set, display prev image button
390 if(opts.activeImage != 0) {
391 $('#prevLink,#prevLinkText').show().click(function() {
392 changeImage(opts.activeImage - 1);
393 return false;
394 });
395 }
396
397 // if not last image in set, display next image button
398 if(opts.activeImage != (opts.imageArray.length - 1)) {
399 $('#nextLink,#nextLinkText').show().click(function() {
400 changeImage(opts.activeImage +1);
401 return false;
402 });
403 }
404 }
405
406 enableKeyboardNav();
407 }
408 };
409
410 function keyboardAction(e) {
411 var o = e.data.opts;
412 var keycode = e.keyCode;
413 var escapeKey = 27;
414
415 var key = String.fromCharCode(keycode).toLowerCase();
416
417 // close lightbox
418 if ((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)) {
419 end();
420
421 // display previous image
422 } else if ((key == 'p') || (keycode == 37)) {
423 if(o.loopImages) {
424 disableKeyboardNav();
425 changeImage((o.activeImage == 0) ? (o.imageArray.length - 1) : o.activeImage - 1);
426 } else if (o.activeImage != 0) {
427 disableKeyboardNav();
428 changeImage(o.activeImage - 1);
429 }
430
431 // display next image
432 } else if ((key == 'n') || (keycode == 39)) {
433 if (opts.loopImages) {
434 disableKeyboardNav();
435 changeImage((o.activeImage == (o.imageArray.length - 1)) ? 0 : o.activeImage + 1);
436 } else if (o.activeImage != (o.imageArray.length - 1)) {
437 disableKeyboardNav();
438 changeImage(o.activeImage + 1);
439 }
440 }
441 };
442
443 function enableKeyboardNav() {
444 $(document).bind('keydown', {opts: opts}, keyboardAction);
445 };
446
447 function disableKeyboardNav() {
448 $(document).unbind('keydown');
449 };
450 };
451
452 $.fn.lightbox.parseJsonData = function(data) {
453 var imageArray = [];
454
455 $.each(data, function() {
456 imageArray.push(new Array(this.url, this.title));
457 });
458
459 return imageArray;
460 };
461 $.fn.lightbox.defaults = {
462 triggerEvent: "click",
463 allSet: false,
464 fileLoadingImage: '/multi_image/static/lib/lightbox/images/loading.gif',
465 fileBottomNavCloseImage: '/multi_image/static/lib/lightbox/images/closelabel.gif',
466 overlayOpacity: 0.6,
467 borderSize: 10,
468 imageArray: new Array,
469 activeImage: null,
470 inprogress: false,
471 resizeSpeed: 350,
472 widthCurrent: 250,
473 heightCurrent: 250,
474 scaleImages: false,
475 xScale: 1,
476 yScale: 1,
477 displayTitle: true,
478 navbarOnTop: true,
479 displayDownloadLink: false,
480 slideNavBar: false,
481 navBarSlideSpeed: 350,
482 displayHelp: false,
483 strings: {
484 help: ' \u2190 / P - previous image\u00a0\u00a0\u00a0\u00a0\u2192 / N - next image\u00a0\u00a0\u00a0\u00a0ESC / X - close image gallery',
485 prevLinkTitle: 'previous image',
486 nextLinkTitle: 'next image',
487 prevLinkText: '&laquo; Previous',
488 nextLinkText: 'Next &raquo;',
489 closeTitle: 'close image gallery',
490 image: 'Image ',
491 of: ' of ',
492 download: 'Download'
493 },
494 fitToScreen: false,
495 disableNavbarLinks: false,
496 loopImages: false,
497 imageClickClose: true,
498 jsonData: null,
499 jsonDataParser: null
500 };
501})(jQuery);
0\ No newline at end of file502\ No newline at end of file
1503
=== added directory 'multi_image/static/src'
=== added directory 'multi_image/static/src/css'
=== added file 'multi_image/static/src/css/hoverbox.css'
--- multi_image/static/src/css/hoverbox.css 1970-01-01 00:00:00 +0000
+++ multi_image/static/src/css/hoverbox.css 2014-04-22 22:55:50 +0000
@@ -0,0 +1,52 @@
1.hoverbox a .preview
2{
3 display: none;
4}
5
6.hoverbox a:active .preview
7{
8 display: block;
9 position: absolute;
10 top: 0px;
11 left: 0px;
12 z-index: 1;
13}
14
15.hoverbox .list_image
16{
17 background: #fff;
18 border-color: #aaa #ccc #ddd #bbb;
19 border-style: solid;
20 border-width: 1px;
21 color: inherit;
22 padding: 2px;
23 vertical-align: top;
24 width: 150px;
25}
26
27.hoverbox
28{
29 background: #eee;
30 border-color: #ddd #bbb #aaa #ccc;
31 border-style: solid;
32 border-width: 1px;
33 color: inherit;
34 margin: 1px;
35 padding: 0px;
36 position: relative;
37}
38
39.hoverbox .preview
40{
41 border-color: #000;
42 width: 320px;
43}
44
45.oe-remove-image
46{
47 cursor: pointer;
48 vertical-align: middle;
49 text-align: right;
50 height: 15px;
51 width: 15px;
52}
0\ No newline at end of file53\ No newline at end of file
154
=== added directory 'multi_image/static/src/img'
=== added file 'multi_image/static/src/img/icon.png'
2Binary 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 differ55Binary 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
=== added directory 'multi_image/static/src/js'
=== added file 'multi_image/static/src/js/multi_image.js'
--- multi_image/static/src/js/multi_image.js 1970-01-01 00:00:00 +0000
+++ multi_image/static/src/js/multi_image.js 2014-04-22 22:55:50 +0000
@@ -0,0 +1,227 @@
1openerp.multi_image = function(openerp) {
2 var _t = openerp.web._t;
3 var QWeb = openerp.web.qweb;
4openerp.web.form.FieldBinaryImageMulti = openerp.web.form.FieldBinaryImage.extend({
5 template: 'FieldBinaryImageMulti',
6 init: function(field_manager, node) {
7 var self = this;
8 this._super(field_manager, node);
9 this.binary_value = false;
10 this.useFileAPI = !window.FileReader;
11 this.max_upload_size = 25 * 1024 * 1024; // 25Mo
12 if (!this.useFileAPI) {
13 this.fileupload_id = _.uniqueId('oe_fileupload');
14 $(window).on(this.fileupload_id, function() {
15 var args = [].slice.call(arguments).slice(1);
16 self.on_file_uploaded.apply(self, args);
17 });
18 }
19 },
20 initialize_content: function() {
21 var self = this;
22 var dataset = new openerp.web.DataSetSearch(this, 'res.users', {}, []);
23 dataset.read_ids([openerp.session.uid], ['name']).then(function(res) {
24 if (res)
25 self.user_name = res[0].name;
26 });
27 this._super();
28 },
29 on_file_uploaded_and_valid: function(size, name, content_type, orignal_file_name, date) {
30 if (name) {
31 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};
32 var data = JSON.parse(this.get('value'));
33 if (data)
34 data.push(data_dict);
35 else
36 data = [data_dict];
37 this.internal_set_value(JSON.stringify(data));
38 this.binary_value = true;
39 this.set_filename(name);
40 this.render_value();
41 this.do_warn(_t("File Upload"), _t("File Upload Successfully !"));
42 }
43 else{
44 this.do_warn(_t("File Upload"), _t("There was a problem while uploading your file"));
45 }
46 },
47 on_list_image: function() {
48 var images_list = this.get('value');
49 var self = this;
50 if (!this.get('value')) {
51 this.do_warn(_t("Image"), _t("Image not available !"));
52 return false;
53 }
54 this.image_list_dialog = new openerp.web.Dialog(this, {
55 title: _t("Image List"),
56 width: '700px',
57 height: '70%',
58 min_width: '600px',
59 min_height: '500px',
60 buttons: [
61 {text: _t("Close"), click: function() { self.image_list_dialog.close();}}
62 ]
63 }).open();
64 this.on_render_dialog();
65 },
66 on_render_dialog: function() {
67 var images_list = JSON.parse(this.get('value'));
68 var self = this;
69 var url_list = [];
70 if (images_list) {
71 _.each(images_list, function (index) {
72 if (index) {
73 if(index['name_1']){
74 url_list.push({'name' : index['name_1'], 'path' : index['name']})
75 }else{
76 url_list.push({'name' : index['orignal_name'], 'path' : index['name']})
77 }
78 }
79 });
80 }
81 else { return false; }
82 var image_list = [];
83 var start = 0;
84 for(var i=1; i <= Math.ceil(url_list.length/4); i++) {
85 image_list.push(url_list.slice(start, start + 4))
86 start = i * 4;
87 }
88 this.image_list_dialog.$el.html(QWeb.render('DialogImageList', {'widget': this, 'image_list': image_list}));
89 this.image_list_dialog.$el.find(".oe-remove-image").click(function() {
90 self.do_remove_image(this, true);
91 });
92 },
93
94 render_value: function() {
95 var self = this;
96 this.$el.find('.oe-image-preview').click(this.on_preview_button);
97 this.$el.find('.oe_image_list').click(this.on_list_image);
98 var images_list = JSON.parse(this.get('value'));
99 this.$el.find('#imagedescription').remove();
100 var $img = QWeb.render("ImageDescription", { image_list: images_list, widget: this});
101 this.$el.append($img);
102 this.$el.find(".oe_image_row").click(function() {
103 if (this.id) {
104 var clicked = this.id;
105 var name_desc = "";
106 _.each(images_list, function (index) {
107 if (index['name'] == clicked ) {
108 var title = index['name_1'] ? index['name_1'] : ''
109 var description = index['description'] ? index['description'] : ''
110 name_desc = 'Title:-' + title + '<br/>Description:-' +description
111 }
112 });
113 self.do_display_image(this, name_desc);
114 }
115 });
116 this.$el.find(".oe_list_record_delete").click(function() {
117 if (this.id) {
118 self.do_remove_image(this, false);
119 }
120 });
121 this.$el.find(".oe-record-edit-link").click(function() {
122 var self_1 = this;
123 var data = JSON.parse(self.get('value'));
124 _.each(data, function(d){
125 if(d.name == self_1.id){
126 self.name_display = d.name_1 ? d.name_1 : '';
127 self.description_display =d.description ? d.description : '';
128 }
129 });
130 self.select_mo_dialog = $(QWeb.render('edit_name_description', {widget:self})).dialog({
131 resizable: false,
132 modal: true,
133 title: _t("Image Description"),
134 width: 500,
135 buttons: {
136 "Ok": function() {
137 var new_list = [];
138 var data = JSON.parse(self.get('value'));
139 if (self_1.id && data) {
140 _.each(data, function (index) {
141 if (index['name'] != self_1.id ) {
142 new_list.push(index)
143 }
144 else {
145 index["name_1"] = self.select_mo_dialog.find('#name_1').val()
146 index["description"] = self.select_mo_dialog.find('#description').val()
147 new_list.push(index)
148 }
149 });
150 self.internal_set_value(JSON.stringify(new_list));
151 self.invalid = false
152 self.dirty = true
153 self.render_value();
154 $(this).dialog( "close" );
155 }
156 },
157 "Close": function() {
158 $(this).dialog( "close" );
159 }
160 },
161 });
162 });
163 },
164 do_display_image: function(curr_id, name_desc) {
165 this.$el.find('.oe-image-preview').lightbox({
166 fitToScreen: true,
167 jsonData: [{"url" :curr_id.id, "title": name_desc}],
168 loopImages: true,
169 imageClickClose: false,
170 disableNavbarLinks: true
171 });
172 },
173 do_remove_image: function(curr_id, dialog) {
174 var self = this;
175 var images_list = JSON.parse(this.get('value'));
176 if (images_list) {
177 var new_list = [];
178 if (confirm(_t("Are you sure to remove this image?"))) {
179 _.each(images_list, function (index) {
180 if (index['name'] != curr_id.id ) {
181 new_list.push(index)
182 }
183 });
184 self.internal_set_value(JSON.stringify(new_list));
185 this.invalid = false
186 this.dirty = true
187 if (dialog) {
188 this.on_render_dialog();
189 }
190 else{
191 this.render_value();
192 }
193 }
194 }
195 },
196 on_preview_button: function() {
197 console.log(this.get('value'))
198 var images_list = JSON.parse(this.get('value'));
199 var url_list = [];
200 var self = this;
201 if (images_list) {
202 _.each(images_list, function (index) {
203 if (index) {
204 var title = index['name_1'] ? index['name_1'] : ''
205 var description = index['description'] ? index['description'] : ''
206 url_list.push({"url" :index['name'], "title": 'Title:-' + title + '<br/>Description:-' +description})
207 }
208 });
209 }
210 else {
211 this.do_warn("Image", "Image not available !");
212 return false;
213 }
214 this.$el.find('.oe-image-preview').lightbox({
215 fitToScreen: true,
216 jsonData: url_list,
217 loopImages: true,
218 imageClickClose: false,
219 disableNavbarLinks: true
220 });
221 },
222});
223
224openerp.web.form.widgets = openerp.web.form.widgets.extend({
225 'image_multi' : 'openerp.web.form.FieldBinaryImageMulti',
226});
227}
0228
=== added directory 'multi_image/static/src/xml'
=== added file 'multi_image/static/src/xml/image_multi.xml'
--- multi_image/static/src/xml/image_multi.xml 1970-01-01 00:00:00 +0000
+++ multi_image/static/src/xml/image_multi.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,126 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<templates id="template" xml:space="preserve">
3
4 <t t-name="HiddenInputMultiFile">
5 <div t-attf-class="oe_hidden_input_file #{fileupload_class or ''}" t-att-style="fileupload_style">
6 <form class="oe_form_binary_form" t-att-target="fileupload_id"
7 method="post" enctype="multipart/form-data" action="/web/binary/upload_image_multi">
8 <input type="hidden" name="session_id" value=""/>
9 <input type="hidden" name="callback" t-att-value="fileupload_id"/>
10 <t t-raw="__content__"/>
11 <input type="file" class="oe_form_binary_file" name="ufile" accept="image/*"/>
12 </form>
13 <iframe t-att-id="fileupload_id" t-att-name="fileupload_id" style="display: none"/>
14 </div>
15 </t>
16
17 <t t-name="FieldBinaryImageMulti">
18 <table class="oe_form_field oe_form_field_binary" cellpadding="0" cellspacing="0" border="0" t-att-style="widget.node.attrs.style">
19 <tr>
20 <td class="oe_form_binary" nowrap="true">
21 <table cellspacing="0" cellpadding="0" border="0">
22 <tr>
23 <td>
24 <t t-if="!widget.get('effective_readonly')">
25 <t t-call="HiddenInputMultiFile">
26 <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
27 <t t-set="fileupload_style" t-translation="off">width: 83px;</t>
28 <button class="oe_button oe_field_button" type="button">
29 <img t-att-src='_s + "/web/static/src/img/icons/STOCK_ADD.png"'/>
30 <span>ADD</span>
31 </button>
32 </t>
33 </t>
34 </td>
35 <td>
36 <button class="oe-image-preview oe_button oe_field_button oe_form_binary" type="button" title="Preview">
37 <img t-att-src='_s + "/web/static/src/img/icons/gtk-zoom-fit.png"'/>
38 <span>Image Preview</span>
39 </button>
40 </td>
41 <td>
42 <button class="oe_image_list oe_button oe_field_button oe_form_binary" type="button" title="All Image">
43 <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DND_MULTIPLE.png"'/>
44 <span>List All Image</span>
45 </button>
46 </td>
47 </tr>
48 </table>
49 </td>
50 <td class="oe_form_binary_progress" style="display: none" nowrap="true">
51 <div class="oe_form_binary_progress" style="display: none">
52 <img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16"/>
53 <b>Uploading ...</b>
54 </div>
55 </td>
56 </tr>
57 </table>
58 </t>
59
60 <t t-name="DialogImageList">
61 <table id="DialogImageList">
62 <tr t-foreach="image_list" t-as="row">
63 <td t-foreach="row" t-as="column" >
64 <table class="hoverbox">
65 <tr background-color="white">
66 <t t-if="!widget.get('effective_readonly')">
67 <td style="height:17px;">
68 <span class="oe-remove-image oe_i" t-att-id="column.path" title="Delete Image" style="float:right;margin-top: -4px;">d</span>
69 </td>
70 </t>
71 </tr>
72 <tr>
73 <td>
74 <a style="cursor: default;" href='#' id="image_preview">
75 <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>
76 </td>
77 </tr>
78 </table>
79 </td>
80 </tr>
81 </table>
82 </t>
83
84 <t t-name="ImageDescription">
85 <div id="imagedescription" class="openerp oe_list oe_view" style="display: block; height:160px;width:100%;overflow: scroll">
86 <table class="openerp oe_list_content">
87 <thead>
88 <tr class="oe_list_header_columns">
89 <th class="oe_list_header_char" t-if="!widget.get('effective_readonly')" style="width:3%;"></th>
90 <th class="oe_list_header_char" style="width:12%;">File Name</th>
91 <th class="oe_list_header_char" style="width:12%;">Title</th>
92 <th class="oe_list_header_char" style="width:25%;">Description</th>
93 <th class="oe_list_header_char" style="width:10%;">Size</th>
94 <th class="oe_list_header_char" style="width:20%;">Date</th>
95 <th class="oe_list_header_char" style="width:15%;">User</th>
96 <th class="oe_list_header_char" t-if="!widget.get('effective_readonly')" style="width:3%;"></th>
97 </tr>
98 </thead>
99 <tbody>
100 <tr t-foreach="image_list" t-as="row">
101 <td width="1" t-att-id="row.name" class="oe-record-edit-link" t-if="!widget.get('effective_readonly')" style="width:3%;">
102 <img t-if="!widget.get('effective_readonly')" src="/web/static/src/img/pencil.gif" />
103 </td>
104 <td class="oe_image_row" t-att-id="row.name" style="width:12%;"><t t-esc="row.orignal_name" /></td>
105 <td class="oe_image_row" t-att-id="row.name" style="width:12%;"><t t-esc="row.name_1"/></td>
106 <td class="oe_image_row" t-att-id="row.name" style="width:25%;"><t t-esc="row.description"/></td>
107 <td class="oe_image_row" t-att-id="row.name" style="width:10%;"><t t-esc="row.size"/></td>
108 <td class="oe_image_row" t-att-id="row.name" style="width:20%;"><t t-esc="row.date"/></td>
109 <td class="oe_image_row" t-att-id="row.name" style="width:15%"><t t-esc="row.user"/></td>
110 <td class='oe_list_record_delete' width="3%" t-att-id="row.name" t-if="!widget.get('effective_readonly')">
111 <button t-if="!widget.get('effective_readonly')" type="button" name="delete" class="oe_i">d</button>
112 </td>
113 </tr>
114 </tbody>
115 </table>
116 </div>
117 </t>
118
119 <t t-name="edit_name_description">
120 <div>
121 <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>
122 <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>
123 </div>
124 </t>
125
126</templates>
0\ No newline at end of file127\ No newline at end of file
1128
=== added directory 'multi_image_sample'
=== added file 'multi_image_sample/__init__.py'
--- multi_image_sample/__init__.py 1970-01-01 00:00:00 +0000
+++ multi_image_sample/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,25 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import product
24
25# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file26\ No newline at end of file
127
=== added file 'multi_image_sample/__openerp__.py'
--- multi_image_sample/__openerp__.py 1970-01-01 00:00:00 +0000
+++ multi_image_sample/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,39 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23{
24 "name" : "Multi Image Sample",
25 "version" : "1.0",
26 "author" : "Serpent Consulting Services Pvt. Ltd.",
27 'website': 'http://www.serpentcs.com',
28 "category": 'Image',
29 'complexity': "easy",
30 'depends': ['multi_image', 'product'],
31 "description": """
32 This module is used for added multi image widget in product.
33 """,
34 'update_xml': ['product_view.xml'],
35 'installable': True,
36 'auto_install': False,
37}
38
39# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
040
=== added file 'multi_image_sample/product.py'
--- multi_image_sample/product.py 1970-01-01 00:00:00 +0000
+++ multi_image_sample/product.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,34 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 OpenERP SA (<http://www.openerp.com>)
6# Copyright (C) 2011-2013 Serpent Consulting Services Pvt. Ltd. (<http://www.serpentcs.com>).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU Affero General Public License as
10# published by the Free Software Foundation, either version 3 of the
11# License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU Affero General Public License for more details.
17#
18# You should have received a copy of the GNU Affero General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from openerp.osv import fields, osv
24
25class product_product(osv.osv):
26 _inherit = "product.product"
27
28 _columns = {
29 'multi_images': fields.text("Multi Images"),
30 }
31
32product_product()
33
34# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file35\ No newline at end of file
136
=== added file 'multi_image_sample/product_view.xml'
--- multi_image_sample/product_view.xml 1970-01-01 00:00:00 +0000
+++ multi_image_sample/product_view.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4
5 <record id="product_normal_multi_imageform_view" model="ir.ui.view">
6 <field name="name">product.normal..multi.image.form.inherit</field>
7 <field name="model">product.product</field>
8 <field name="priority">5</field>
9 <field name="inherit_id" ref="product.product_normal_form_view"/>
10 <field name="arch" type="xml">
11 <notebook position="inside">
12 <page string="Images">
13 <field name="multi_images" widget="image_multi"/>
14 </page>
15 </notebook>
16 </field>
17 </record>
18
19 </data>
20</openerp>
021
=== added directory 'multi_image_sample/static'
=== added directory 'multi_image_sample/static/src'
=== added directory 'multi_image_sample/static/src/img'
=== added file 'multi_image_sample/static/src/img/icon.png'
1Binary 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 differ22Binary 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
=== added directory 'portal_public_documents'
=== added file 'portal_public_documents/__init__.py'
--- portal_public_documents/__init__.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,2 @@
1import model
2import controllers
03
=== added file 'portal_public_documents/__openerp__.py'
--- portal_public_documents/__openerp__.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,41 @@
1#-*- encoding: utf-8 -*-
2{
3 'name': "Portal Document Public",
4 'website': 'http://www.vauxoo.com',
5 'category': 'Portal',
6 'author': 'Vauxoo',
7 'description': """
8With this module we will intend to build a "Public Link" to be served as public via http with and
9without allow the indexing of it.
10
11The plan: Extend document module adding a field "Public Link" which will be relative to the url
12base.
13
14Extend the ir_config parameters to configure the public folder and serve it as werkzeug is doing
15inside openerp.
16
17Share the link extending the "many2many tag widget."
18 """,
19 'category': 'Tools',
20 'depends':[
21 'web',
22 'base',
23 'document',
24 'portal_anonymous',
25 ],
26 'data': [
27 'view/ir_attachment_view.xml',
28 'data/portal_public_document_data.xml',
29 'data/ppd_scheduler.xml',
30 ],
31 'demo': [
32 'demo/portal_public_document_demo.xml',
33 ],
34 'js': [
35 ],
36 'css': [
37 ],
38 'qweb': [
39 ],
40 'installable': True,
41}
042
=== added directory 'portal_public_documents/controllers'
=== added file 'portal_public_documents/controllers/__init__.py'
--- portal_public_documents/controllers/__init__.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/controllers/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,1 @@
1import main
02
=== added file 'portal_public_documents/controllers/main.py'
--- portal_public_documents/controllers/main.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/controllers/main.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,41 @@
1# -*- coding: utf-8 -*-
2
3from web import http
4from openerp.addons.web.controllers.main import Binary
5openerpweb = http
6import simplejson
7import time
8import openerp
9import os
10import StringIO
11import xmlrpclib
12import base64
13'''
14class Binary(Binary):
15 @openerpweb.httprequest
16 def upload_attachment(self, req, callback, model, id, ufile):
17 Model = req.session.model('ir.attachment')
18 ModelXML = req.session.model('ir.model.data')
19 group_folder_id = ModelXML.get_object_reference(
20 'portal_public_documents',
21 'portal_public_mail_groups_folder')
22 out = """<script language="javascript" type="text/javascript">
23 var win = window.top.window;
24 win.jQuery(win).trigger(%s, %s);
25 </script>"""
26 try:
27 attachment_id = Model.create({
28 'name': ufile.filename,
29 'datas': base64.encodestring(ufile.read()),
30 'datas_fname': ufile.filename,
31 'res_model': model,
32 'res_id': int(id),
33 }, req.context)
34 args = {
35 'filename': ufile.filename,
36 'id': attachment_id
37 }
38 except xmlrpclib.Fault, e:
39 args = {'error':e.faultCode }
40 return out % (simplejson.dumps(callback), simplejson.dumps(args))
41'''
042
=== added directory 'portal_public_documents/data'
=== added file 'portal_public_documents/data/portal_public_document_data.xml'
--- portal_public_documents/data/portal_public_document_data.xml 1970-01-01 00:00:00 +0000
+++ portal_public_documents/data/portal_public_document_data.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,52 @@
1<?xml version="1.0"?>
2<openerp>
3<data>
4 <record model="document.directory.content.type" id="png">
5 <field name="code">.png</field>
6 <field name="name">PNG Image</field>
7 <field name="mimetype">image/png</field>
8 </record>
9 <record model="document.directory.content.type" id="jpg">
10 <field name="code">.jpg</field>
11 <field name="name">JPG Image</field>
12 <field name="mimetype">image/jpg</field>
13 </record>
14 <record model="document.directory.content.type" id="jpeg">
15 <field name="code">.jpeg</field>
16 <field name="name">JPEG Image</field>
17 <field name="mimetype">image/jpeg</field>
18 </record>
19 <record model="document.directory.content.type" id="jpeg">
20 <field name="code">.jpeg</field>
21 <field name="name">JPEG Image</field>
22 <field name="mimetype">image/pjpeg</field>
23 </record>
24 <record model="document.directory.content.type" id="gif">
25 <field name="code">.gif</field>
26 <field name="name">GIF Image</field>
27 <field name="mimetype">image/gif</field>
28 </record>
29</data>
30<data>
31 <!-- Pre Create a public Folder. -->
32 <record model="document.directory" id="dir_public_root">
33 <field name="name">Public</field>
34 <field name="user_id" eval="False"/>
35 <field name="group_ids" eval="[(6,0,[ref('share.group_share_user')])]"/>
36 <field name="publish" eval="True"/>
37 <field name="ressource_id">0</field>
38 </record>
39 <!-- Pre Create a public Folder for mail.group. -->
40 <record model="document.directory" id="portal_public_mail_groups_folder">
41 <field name="name">Mail Group Folder</field>
42 <field name="user_id" eval="False"/>
43 <field name="group_ids" eval="[(6,0,[ref('share.group_share_user')])]"/>
44 <field name="publish" eval="True"/>
45 <field name="type">ressource</field>
46 <field name="parent_id" eval="ref('dir_public_root')"/>
47 <field name="ressource_type_id" eval="ref('mail.model_mail_group')"/>
48 <field name="resource_find_all" eval="False"/>
49 <field name="ressource_id">0</field>
50 </record>
51</data>
52</openerp>
053
=== added file 'portal_public_documents/data/ppd_scheduler.xml'
--- portal_public_documents/data/ppd_scheduler.xml 1970-01-01 00:00:00 +0000
+++ portal_public_documents/data/ppd_scheduler.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,13 @@
1<?xml version="1.0"?>
2<openerp>
3<data>
4 <record model="ir.cron" id="run_autovacuum_public">
5 <field name="name">Reset Public Files</field>
6 <field name="interval_number">60</field>
7 <field name="interval_type">minutes</field>
8 <field name="numbercall">-1</field>
9 <field name="model">ir.attachment</field>
10 <field name="function">run_autovacuum</field>
11 </record>
12</data>
13</openerp>
014
=== added directory 'portal_public_documents/demo'
=== added file 'portal_public_documents/demo/portal_public_document_demo.xml'
--- portal_public_documents/demo/portal_public_document_demo.xml 1970-01-01 00:00:00 +0000
+++ portal_public_documents/demo/portal_public_document_demo.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,18 @@
1<?xml version="1.0"?>
2<openerp>
3<data>
4 <record id="public_folder_paremeter" model="ir.config_parameter">
5 <field name="key">ir_attachment.plocation</field>
6 <field name="value">file:///static/files</field>
7 </record>
8</data>
9<data>
10
11 <record id="public_attachment_demo" model="ir.attachment">
12 <field name="parent_id" ref="dir_public_root"/>
13 <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>
14 <field name="datas_fname">HelloWorld.png</field>
15 <field name="name">HelloWorld.png</field>
16</record>
17</data>
18</openerp>
019
=== added directory 'portal_public_documents/i18n'
=== added directory 'portal_public_documents/model'
=== added file 'portal_public_documents/model/__init__.py'
--- portal_public_documents/model/__init__.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/model/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,1 @@
1import ir_attachment
02
=== added file 'portal_public_documents/model/ir_attachment.py'
--- portal_public_documents/model/ir_attachment.py 1970-01-01 00:00:00 +0000
+++ portal_public_documents/model/ir_attachment.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,241 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22import hashlib
23import itertools
24import logging
25import os
26import re
27from shutil import copyfile, rmtree
28
29from openerp import tools
30from openerp import addons
31from openerp import SUPERUSER_ID
32from openerp.tools.translate import _
33from openerp.osv import fields, osv
34_logger = logging.getLogger(__name__)
35
36
37class document_directory(osv.osv):
38 _inherit = 'document.directory'
39 _columns = {
40 'publish': fields.boolean('Allow Publish',
41 help='If you want allow files under this directory be published '
42 'directly as an http file.'),
43 }
44
45
46class ir_attachment(osv.Model):
47
48 '''OverWrite Document Class to ensure add the new coputeb field to know the public link'''
49
50 _inherit = 'ir.attachment'
51
52 def _get_anonymous_id(self, cr, uid, ids, context=None):
53 ir_model_data = self.pool.get('ir.model.data')
54 users_obj = self.pool.get('res.users')
55 anonymous_data_id = ir_model_data.get_object_reference(
56 cr, SUPERUSER_ID, 'portal_anonymous',
57 'anonymous_user')
58 anonymous_id = ir_model_data.browse(cr, SUPERUSER_ID, [
59 anonymous_data_id[1]], context=context)
60 anonymous_brw = users_obj.browse(cr, SUPERUSER_ID, [
61 anonymous_id[0].id], context=context)
62 return anonymous_brw and anonymous_brw[0] or False
63
64 def _full_url_plocation(self, cr, uid, location, path):
65 # location = 'file:filestore'
66 assert location.startswith(
67 'file:'), "Unhandled filestore location %s" % location
68 location = location[5:]
69
70 # sanitize location name and path
71 location = re.sub('[.]', '', location)
72 location = location.strip('/\\')
73
74 path = re.sub('[.]', '', path)
75 path = path.strip('/\\')
76 # TODO: Change for url manipulation lib
77 base_url = self.pool.get('ir.config_parameter').get_param(cr, uid,
78 'web.base.url')
79 return os.path.join(base_url, 'portal_public_documents', location, cr.dbname, path)
80
81 def _get_public_path(self, cr, uid, ids, name, arg, context=None):
82 if context is None:
83 context = {}
84 res = {}
85 doc_brw = self.browse(cr, SUPERUSER_ID, ids, context=context)
86 a_id = self._get_anonymous_id(cr, SUPERUSER_ID, ids, context=context)
87 plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
88 'ir_attachment.plocation')
89 for d in doc_brw:
90 if not d.store_fname:
91 res[d.id] = False
92 else:
93 if d and d.user_id == a_id:
94 res[d.id] = self._full_url_plocation(
95 cr, uid, plocation, d.store_fname)
96 else:
97 res[d.id] = False
98 return res
99
100 _columns = {
101 'public_path': fields.function(_get_public_path, 'Public Path', method=True, store=False,
102 fnct_inv=None, type='char', size=1024, fnct_search=None,
103 help='''Public path for this file, if "Allow Public access is checked in the Folder and it
104 is owned by Anonymous."'''),
105 }
106
107 def _full_path_plocation(self, cr, uid, location, path):
108 # location = 'file:filestore'
109 assert location.startswith(
110 'file:'), "Unhandled filestore location %s" % location
111 location = location[5:]
112
113 # sanitize location name and path
114 location = re.sub('[.]', '', location)
115 location = location.strip('/\\')
116 path = re.sub('[.]', '', path)
117 path = path.strip('/\\')
118 return os.path.join(addons.portal_public_documents.__path__[0], location, cr.dbname, path)
119
120 def publish_document(self, cr, uid, ids, context=None):
121 '''
122 Make Public a list of attachments.
123 A file is public IF the user_id is anonymous
124 '''
125 a_brw = self._get_anonymous_id(cr, uid, ids, context=context)
126 doc_brw = self.browse(cr, uid, ids, context=context)
127 location = self.pool.get('ir.config_parameter').get_param(cr, uid,
128 'ir_attachment.location')
129 plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
130 'ir_attachment.plocation')
131 dict_write = a_brw and {'user_id': a_brw.id} or {}
132 for d in doc_brw:
133 if d.parent_id.publish:
134 # Write in db first, if something happend, nothing happen
135 d.write(dict_write, context=context)
136 # TODO: This copy process must be done,
137 # 1.- With an user different and secure.
138 # 2.- Maybe this files will be accessed by a web-server too!
139 # explain clearly in documentation how to do that.
140 # 3.- Is secure use the same name?
141 # 4.- TODO: Always is insecure be in touch of make public a file, maybe sincronize
142 # with external tools like Gdocs, Dropbox or even put on a scp or ftp public server
143 # is a better approach
144 if not d.store_fname:
145 raise osv.except_osv(_('Security!'), 'Store Fname no setted Try to recreate'
146 ' the file or use an export/import script to convert this'
147 'file in a file saved on the file system. '
148 '%s ' % d.store_fname)
149 if not plocation:
150 raise osv.except_osv(_(
151 'Security!'), 'Public location not setted go to Setting')
152 destiny = self._full_path_plocation(
153 cr, uid, plocation, d.store_fname)
154 origin = self._full_path(cr, uid, location, d.store_fname)
155 try:
156 dirname = os.path.dirname(destiny)
157 if not os.path.isdir(dirname):
158 os.makedirs(dirname)
159 copyfile(origin, destiny)
160 except IOError:
161 _logger.error("Making public error writing from %s to %s" % (
162 origin, destiny))
163 #(location and plocation) and shutil
164 else:
165 raise osv.except_osv(_('Security!'),
166 _('You can not make public a File in a folder that is not '
167 'explicitally marked as '
168 '"Allowe Publish" it is happening sharing the file'
169 '%s in the folder %s' % (d.name, d.parent_id.name)))
170 return True
171
172 def unpublish_document(self, cr, uid, ids, context=None):
173 doc_brw = self.browse(cr, uid, ids, context=context)
174 plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
175 'ir_attachment.plocation')
176 for d in doc_brw:
177 dict_write = d.create_uid and {'user_id': d.create_uid.id} or {}
178 super(ir_attachment, self).write(cr, uid, ids, dict_write, context)
179 if not d.store_fname:
180 raise osv.except_osv(_('Security!'), 'Store Fname no setted Try to recreate'
181 ' the file or use an export/import script to convert this'
182 'file in a file saved on the file system. '
183 '%s ' % d.store_fname)
184 if not plocation:
185 raise osv.except_osv(_(
186 'Security!'), 'Public location not setted go to Setting')
187 destiny = self._full_path_plocation(
188 cr, uid, plocation, d.store_fname)
189 try:
190 os.remove(destiny)
191 except IOError:
192 _logger.error('I cant delete file %s' % destiny)
193 except OSError:
194 _logger.error('This file was already deleted. %s' % destiny)
195 return True
196
197 def unlink(self, cr, uid, ids, context=None):
198 plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
199 'ir_attachment.plocation')
200 if plocation:
201 for attach in self.browse(cr, uid, ids, context=context):
202 destiny = self._full_path_plocation(
203 cr, uid, plocation, attach.store_fname)
204 try:
205 os.remove(destiny)
206 except IOError:
207 _logger.error('I cant delete file %s' % destiny)
208 except OSError:
209 _logger.error(
210 'This file was already deleted. %s' % destiny)
211 return super(ir_attachment, self).unlink(cr, uid, ids, context)
212
213 def write(self, cr, uid, ids, vals, context=None):
214 self.check(cr, uid, ids, 'write', context=context, values=vals)
215 for i in self.browse(cr, uid, ids, context=context):
216 if i.public_path:
217 self.unpublish_document(cr, uid, [i.id], context=context)
218 return super(ir_attachment, self).write(cr, uid, ids, vals, context)
219
220 def run_autovacuum(self, cr, uid, context=None):
221 if context is None:
222 context = {}
223 def location_p(f):
224 return self._full_path_plocation(cr, uid, plocation, i)
225 a_brw = self._get_anonymous_id(cr, uid, [], context=context)
226 public_ids = self.search(cr, uid, [('user_id', '=', a_brw.id)], context=context)
227 _logger.info('Running Autovacuum Files all your public files will be reseted %s ' %
228 str(public_ids))
229 #I make no public, and then make public again, in this way we ensure all public information
230 #is reseted.
231 self.unpublish_document(cr, uid, public_ids, context=context)
232 plocation = self.pool.get('ir.config_parameter').get_param(cr, uid,
233 'ir_attachment.plocation')
234 destiny = self._full_path_plocation(
235 cr, uid, plocation, '')
236 p_files = os.listdir(destiny)
237 _logger.info('Destiny folder %s was empty totally' % destiny)
238 if os.path.isdir(destiny):
239 [rmtree(location_p(i)) for i in p_files]
240 self.publish_document(cr, uid, public_ids, context=context)
241 return True
0242
=== added directory 'portal_public_documents/static'
=== added directory 'portal_public_documents/static/files'
=== added directory 'portal_public_documents/view'
=== added file 'portal_public_documents/view/ir_attachment_view.xml'
--- portal_public_documents/view/ir_attachment_view.xml 1970-01-01 00:00:00 +0000
+++ portal_public_documents/view/ir_attachment_view.xml 2014-04-22 22:55:50 +0000
@@ -0,0 +1,34 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <record id="view_attachment_public_form" model="ir.ui.view">
5 <field name="inherit_id" ref="base.view_attachment_form"/>
6 <field name="model">ir.attachment</field>
7 <field name="arch" type="xml">
8 <xpath expr="//sheet" position="before">
9 <header>
10 <button type="object" string="Publish" class="oe_highlight oe_inline" name="publish_document"
11 attrs="{'invisible': [('public_path', '!=', False)]}"
12help="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'."/>
13 <button type="object" string="Unpublish" class="oe_highlight oe_inline" name="unpublish_document"
14 attrs="{'invisible': [('public_path', '=', False)]}"
15help="Stop share this document, If it is owned by you or if you are part of 'Share Manager' users.'"/>
16 <div class="oe_form_box_info oe_text_center" attrs="{'invisible': [('public_path', '=', False)]}">
17 <p>You can access to this file publically in the following link</p>
18 <field name="public_path" widget="url"/>
19 </div>
20 </header>
21 </xpath>
22 </field>
23 </record>
24 <record model="ir.ui.view" id="view_document_directory_publish_form">
25 <field name="inherit_id" ref="document.view_document_directory_form"/>
26 <field name="model">document.directory</field>
27 <field name="arch" type="xml">
28 <xpath expr="//field[@name='name']" position="after">
29 <field name="publish"/>
30 </xpath>
31 </field>
32 </record>
33 </data>
34</openerp>
035
=== added directory 'web_allow_custom_root'
=== added file 'web_allow_custom_root/__init__.py'
--- web_allow_custom_root/__init__.py 1970-01-01 00:00:00 +0000
+++ web_allow_custom_root/__init__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,30 @@
1from openerp.tools import config
2from openerp.addons import web
3
4web.controllers.main.html_template = """<!DOCTYPE html>
5<html style="height: 100%%">
6 <head>
7 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
8 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
9 <title>OpenERP</title>
10 <link rel="shortcut icon" href="""+config.get('favicon', '/web/static/src/img/favicon.ico')+""" type="image/x-icon"/>
11 <link rel="stylesheet" href="/web/static/src/css/full.css" />
12 %(css)s
13 %(js)s
14 <script type="text/javascript">
15 $(function() {
16 var s = new openerp.init(%(modules)s);
17 %(init)s
18 });
19 </script>
20 <script src='"""+config.get('gmaps_api_key', '')+"""' type="text/javascript">
21 </script>
22 </head>
23 <body>
24 <!--[if lte IE 8]>
25 <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
26 <script>CFInstall.check({mode: "overlay"});</script>
27 <![endif]-->
28 </body>
29</html>
30"""
031
=== added file 'web_allow_custom_root/__openerp__.py'
--- web_allow_custom_root/__openerp__.py 1970-01-01 00:00:00 +0000
+++ web_allow_custom_root/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,86 @@
1
2#-*- coding: utf-8 -*-
3###################################################################################################
4#
5# OpenERP, Open Source Management Solution Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6# All Rights Reserved
7# Financed and Planified by Vauxoo
8# developed by: nhomar@vauxoo.com
9# This program is free software: you can redistribute it and/or modify it under the terms of the
10# GNU General Public License as published by the Free Software Foundation, either version 3 of
11# the License, or (at your option) any later version.
12# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14# the GNU General Public License for more details.
15# You should have received a copy of the GNU General Public License along with this program.
16# If not, see <http://www.gnu.org/licenses/>.
17###################################################################################################
18
19{
20 'name': "Custom Init Template Parameters",
21 'author': "Vauxoo",
22 'category': "Hidden",
23 'description': """
24Make customizable your html_template:
25=====================================
26
27Some things in the html_template variable are wired in the code.
28
29With this module we can pass them as parameters.
30
311.- Favicon.
32------------
33
34Add the key: favicon in your config file mapping to your public available path, and it will be taken.
35
36i.e:
37
38code::
39
40 Relative:
41 favicon = /path/to/your/favicon.ico
42 Absolute:
43 favicon = https://url.com/path/to/your/favicon.ico
44
45 default:
46 '/web/static/src/img/favicon.ico'
47
482.- Extra js Scripts.
49---------------------
50
51Add a key: script_extra_`NAME`
52
53code::
54
55 script_extra_addwords = '<script type="text/javascript"> <!--//--><![CDATA[//><!-- GA_googleFetchAds(); //--><!]]> </script>'
56
573.- Gmaps API loaded.
58---------------------
59
60i.e:
61
62code::
63
64 gmaps_api_key = "https://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=SET_TO_TRUE_OR_FALSE"
65
66In this way you can put your customize loading stuff and/or namespace all your client to use your
67own css.
68
69If you put this module available in your addons path the variable will be overwritten and this
70options will be availables, change your config file and all will work smothly.
71
72This is used in http://www.vauxoo.com see how it loads all this information very quickly.
73 """,
74 'version': "0.1",
75 'depends': [
76 'web',
77 'base',
78 ],
79 'js': [
80 ],
81 'css': [
82 ],
83 'qweb': [
84 ],
85 'installable': True,
86}
087
=== added directory 'web_allow_custom_root/static'
=== added directory 'web_allow_custom_root/static/src'
=== added directory 'web_allow_custom_root/static/src/img'
=== added file 'web_allow_custom_root/static/src/img/icon.png'
1Binary 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 differ88Binary 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
=== added directory 'web_binary_icon'
=== added file 'web_binary_icon/__init__.py'
=== added file 'web_binary_icon/__openerp__.py'
--- web_binary_icon/__openerp__.py 1970-01-01 00:00:00 +0000
+++ web_binary_icon/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,89 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# Financed and Planified by Vauxoo
7# developed by: nhomar@vauxoo.com
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <http://www.gnu.org/licenses/>.
21#
22##############################################################################
23
24{
25 'name': "Web Binary Icon",
26 'author': "Vauxoo",
27 'category': "Hidden",
28 'description': """
29Binary Icon plugin.
30===================
31
32When you are using a binary field, it is cool, if depending of the extension
33the field show the icon of the app, something like the plugin for gmail does,
34recognizing the extension and showing the correct icon.
35
36Files to consider TODO:.
37
38All openoffice extensions:
39
40 * .odt
41 * .odp
42 * .odf
43
44All Ms Office extensions:
45
46 * .xls, xlsx
47 * .doc, docx
48 * .ppt, pptx
49
50All text extentions:
51
52 * .txt
53 * .rst
54 * .xml (Usefull for electronic invoices.)
55
56Links as attachments should be cool of recognize too!.
57
58 * .googledoc
59
60Images should be usefull, probably working in thumbnails feature.
61
62 * .jpg
63 * .png
64 * .gif
65 * .jpeg
66 * .svg
67 * .gimp
68
69Other Formats usefull in the middle.
70
71 * .project
72 * .planner
73 * .Xmind
74 * .log
75""",
76 'version': "1.0",
77 'depends': ['web'],
78 'js': [
79 'static/src/js/lib.js',
80 ],
81 'css': [
82 ],
83 'qweb': [
84 'static/src/xml/lib.xml',
85 ],
86 'installable': True,
87 'auto_install': False,
88 'web_preload': False,
89}
090
=== added directory 'web_binary_icon/i18n'
=== added directory 'web_binary_icon/static'
=== added directory 'web_binary_icon/static/src'
=== added directory 'web_binary_icon/static/src/css'
=== added directory 'web_binary_icon/static/src/img'
=== added directory 'web_binary_icon/static/src/js'
=== added directory 'web_binary_icon/static/src/xml'
=== added directory 'web_bootstrap3'
=== added file 'web_bootstrap3/__init__.py'
=== added file 'web_bootstrap3/__openerp__.py'
--- web_bootstrap3/__openerp__.py 1970-01-01 00:00:00 +0000
+++ web_bootstrap3/__openerp__.py 2014-04-22 22:55:50 +0000
@@ -0,0 +1,91 @@
1#-*- coding: utf-8 -*-
2###################################################################################################
3#
4# OpenERP, Open Source Management Solution Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
5# All Rights Reserved
6# Financed and Planified by Vauxoo
7# developed by: nhomar@vauxoo.com
8# This program is free software: you can redistribute it and/or modify it under the terms of the
9# GNU General Public License as published by the Free Software Foundation, either version 3 of
10# the License, or (at your option) any later version.
11# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13# the GNU General Public License for more details.
14# You should have received a copy of the GNU General Public License along with this program.
15# If not, see <http://www.gnu.org/licenses/>.
16###################################################################################################
17
18{
19 'name': "Bootstrap 3.0 for OpenERP",
20 'author': "Vauxoo",
21 'category': "Hidden",
22 'description': """
23Bootstrap 3.0 in OpenERP
24========================
25
26Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web
27development.
28
29Openerp have embeded partially Bootstrap 2.x but the new version is so powerfull.
30
31With this module you will be able to design cool views with this documentation, all what you need
32is namespace your views with a delimiter with class .bs3
33
34i.e.:
35
36::
37
38 <form version="7.0">
39 ...
40 ...
41 <pre>
42 <div class="bs3">
43 <field name="text" widget="html"/>
44 </div>
45 </pre>
46 ...
47 ...
48 ...
49 </form>
50
51Now all the content of the field ``text`` with widget ``html`` bellow will be rendered with all the
52power of bs3
53
54We include the original less files to allow you compile this when you need but you can download and
55compile by your self the original sources, just need to compile the bs3-openerp.less again pointing
56the bs3 original files.
57
58The most interesting part of this way to work is that our specific modules in terms of look and
59feel will be prepared for version 8.0.
60
61The bootstrap documentation can be found here_
62
63You will find a directory called bootstrap3 with the bootstrap's source code, the main objective of
64do that is be able to just pull from original bootstrap project and commit in this module almost
65directly.
66
67Is you want compile your own version of bootstrap_ download the source code in the link_
68
69.. _here http://getbootstrap.com/
70.. _bootstrap https://github.com/twbs/bootstrap/
71.. _link https://github.com/twbs/bootstrap/
72 """,
73 'version': "1.0",
74 'depends': [
75 'web'
76 ],
77 'js': [
78 'static/src/js/bootstrap.js',
79 'static/src/js/bootstrap-lightbox.js',
80 #'static/src/js/ekko-lightbox.js',
81 ],
82 'css': [
83 'static/src/css/bs3-openerp.css',
84 'static/src/css/bs3-lightbox.css',
85 ],
86 'qweb': [
87 ],
88 'installable': True,
89 'auto_install': False,
90 'web_preload': False, #set to True if you want this module be available always without ask.
91}
092
=== added directory 'web_bootstrap3/static'
=== added directory 'web_bootstrap3/static/src'
=== added directory 'web_bootstrap3/static/src/css'
=== added file 'web_bootstrap3/static/src/css/bs3-lightbox.css'
--- web_bootstrap3/static/src/css/bs3-lightbox.css 1970-01-01 00:00:00 +0000
+++ web_bootstrap3/static/src/css/bs3-lightbox.css 2014-04-22 22:55:50 +0000
@@ -0,0 +1,91 @@
1/*!
2* bootstrap-lightbox.css v0.6.1
3* Copyright 2013 Jason Butz
4* http://www.apache.org/licenses/LICENSE-2.0.txt
5*/
6.lightbox-open {
7 overflow: hidden;
8}
9
10body.lightbox-open, .lightbox-open .navbar-fixed-top, .lightbox-open .navbar-fixed-bottom {
11 margin-right: 15px;
12}
13
14.lightbox {
15 position: fixed;
16 top: 0;
17 right: 0;
18 bottom: 0;
19 left: 0;
20 z-index: 1040;
21 display: none;
22 overflow: auto;
23 overflow-y: scroll;
24}
25
26.lightbox .fade .lightbox-dialog {
27 -webkit-transform: translate(0, -25%);
28 -ms-transform: translate(0, -25%);
29 transform: translate(0, -25%);
30 -webkit-transition: -webkit-transform 0.3s ease-out;
31 -moz-transition: -moz-transform 0.3s ease-out;
32 -o-transition: -o-transform 0.3s ease-out;
33 transition: transform 0.3s ease-out;
34}
35
36.lightbox .in .lightbox-dialog {
37 -webkit-transform: translate(0, 0);
38 -ms-transform: translate(0, 0);
39 transform: translate(0, 0);
40}
41.lightbox .lightbox-dialog {
42 z-index: 1050;
43 width: auto;
44 /*padding: 10px;*/
45 margin-right: auto;
46 margin-left: auto;
47}
48.lightbox .lightbox-dialog .lightbox-header {
49 float: right;
50}
51.lightbox .lightbox-dialog .lightbox-header .close {
52 margin-top: -2px;
53}
54.lightbox .lightbox-dialog .lightbox-content {
55 position: relative;
56 display: inline-block;
57 padding: 10px;
58 background-color: #ffffff;
59 border: 1px solid #999999;
60 border: 1px solid rgba(0, 0, 0, 0.2);
61 border-radius: 6px;
62 outline: none;
63 -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
64 box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
65 background-clip: padding-box;
66}
67.lightbox .lightbox-dialog .lightbox-content .lightbox-caption {
68 position: absolute;
69 right: 8px;
70 bottom: 8px;
71 left: 10px;
72 padding: 2%;
73 font-size: 14px;
74 line-height: 18px;
75 color: white;
76 text-align: center;
77 text-shadow: 0 -1px 0 #000000;
78 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3);
79 background: #000;
80 background: rgba(0, 0, 0, 0.6);
81}
82
83.lightbox.lightbox-html {
84 position: fixed;
85 width: 1018px;
86 height: 682px;
87 top: 24px;
88 left: 50%;
89 margin-left: -509px;
90 display: none;
91}
092
=== added file 'web_bootstrap3/static/src/css/bs3-openerp.css'
--- web_bootstrap3/static/src/css/bs3-openerp.css 1970-01-01 00:00:00 +0000
+++ web_bootstrap3/static/src/css/bs3-openerp.css 2014-04-22 22:55:50 +0000
@@ -0,0 +1,6022 @@
1.bs3 {
2 /*!
3 * Bootstrap v3.0.0
4 *
5 * Copyright 2013 Twitter, Inc
6 * Licensed under the Apache License v2.0
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Designed and built with all the love in the world by @mdo and @fat.
10 */
11
12 /*! normalize.css v2.1.0 | MIT License | git.io/normalize */
13
14}
15.bs3 article,
16.bs3 aside,
17.bs3 details,
18.bs3 figcaption,
19.bs3 figure,
20.bs3 footer,
21.bs3 header,
22.bs3 hgroup,
23.bs3 main,
24.bs3 nav,
25.bs3 section,
26.bs3 summary {
27 display: block;
28}
29.bs3 audio,
30.bs3 canvas,
31.bs3 video {
32 display: inline-block;
33}
34.bs3 audio:not([controls]) {
35 display: none;
36 height: 0;
37}
38.bs3 [hidden] {
39 display: none;
40}
41.bs3 html {
42 font-family: sans-serif;
43 -webkit-text-size-adjust: 100%;
44 -ms-text-size-adjust: 100%;
45}
46.bs3 body {
47 margin: 0;
48}
49.bs3 a:focus {
50 outline: thin dotted;
51}
52.bs3 a:active,
53.bs3 a:hover {
54 outline: 0;
55}
56.bs3 h1 {
57 font-size: 2em;
58 margin: 0.67em 0;
59}
60.bs3 abbr[title] {
61 border-bottom: 1px dotted;
62}
63.bs3 b,
64.bs3 strong {
65 font-weight: bold;
66}
67.bs3 dfn {
68 font-style: italic;
69}
70.bs3 hr {
71 -moz-box-sizing: content-box;
72 box-sizing: content-box;
73 height: 0;
74}
75.bs3 mark {
76 background: #ff0;
77 color: #000;
78}
79.bs3 code,
80.bs3 kbd,
81.bs3 pre,
82.bs3 samp {
83 font-family: monospace, serif;
84 font-size: 1em;
85}
86.bs3 pre {
87 white-space: pre-wrap;
88}
89.bs3 q {
90 quotes: "\201C" "\201D" "\2018" "\2019";
91}
92.bs3 small {
93 font-size: 80%;
94}
95.bs3 sub,
96.bs3 sup {
97 font-size: 75%;
98 line-height: 0;
99 position: relative;
100 vertical-align: baseline;
101}
102.bs3 sup {
103 top: -0.5em;
104}
105.bs3 sub {
106 bottom: -0.25em;
107}
108.bs3 img {
109 border: 0;
110}
111.bs3 svg:not(:root) {
112 overflow: hidden;
113}
114.bs3 figure {
115 margin: 0;
116}
117.bs3 fieldset {
118 border: 1px solid #c0c0c0;
119 margin: 0 2px;
120 padding: 0.35em 0.625em 0.75em;
121}
122.bs3 legend {
123 border: 0;
124 padding: 0;
125}
126.bs3 button,
127.bs3 input,
128.bs3 select,
129.bs3 textarea {
130 font-family: inherit;
131 font-size: 100%;
132 margin: 0;
133}
134.bs3 button,
135.bs3 input {
136 line-height: normal;
137}
138.bs3 button,
139.bs3 select {
140 text-transform: none;
141}
142.bs3 button,
143.bs3 html input[type="button"],
144.bs3 input[type="reset"],
145.bs3 input[type="submit"] {
146 -webkit-appearance: button;
147 cursor: pointer;
148}
149.bs3 button[disabled],
150.bs3 html input[disabled] {
151 cursor: default;
152}
153.bs3 input[type="checkbox"],
154.bs3 input[type="radio"] {
155 box-sizing: border-box;
156 padding: 0;
157}
158.bs3 input[type="search"] {
159 -webkit-appearance: textfield;
160 -moz-box-sizing: content-box;
161 -webkit-box-sizing: content-box;
162 box-sizing: content-box;
163}
164.bs3 input[type="search"]::-webkit-search-cancel-button,
165.bs3 input[type="search"]::-webkit-search-decoration {
166 -webkit-appearance: none;
167}
168.bs3 button::-moz-focus-inner,
169.bs3 input::-moz-focus-inner {
170 border: 0;
171 padding: 0;
172}
173.bs3 textarea {
174 overflow: auto;
175 vertical-align: top;
176}
177.bs3 table {
178 border-collapse: collapse;
179 border-spacing: 0;
180}
181@media print {
182 .bs3 * {
183 text-shadow: none !important;
184 color: #000 !important;
185 background: transparent !important;
186 box-shadow: none !important;
187 }
188 .bs3 a,
189 .bs3 a:visited {
190 text-decoration: underline;
191 }
192 .bs3 a[href]:after {
193 content: " (" attr(href) ")";
194 }
195 .bs3 abbr[title]:after {
196 content: " (" attr(title) ")";
197 }
198 .bs3 .ir a:after,
199 .bs3 a[href^="javascript:"]:after,
200 .bs3 a[href^="#"]:after {
201 content: "";
202 }
203 .bs3 pre,
204 .bs3 blockquote {
205 border: 1px solid #999;
206 page-break-inside: avoid;
207 }
208 .bs3 thead {
209 display: table-header-group;
210 }
211 .bs3 tr,
212 .bs3 img {
213 page-break-inside: avoid;
214 }
215 .bs3 img {
216 max-width: 100% !important;
217 }
218 @page {
219 margin: 2cm .5cm;
220 }
221 .bs3 p,
222 .bs3 h2,
223 .bs3 h3 {
224 orphans: 3;
225 widows: 3;
226 }
227 .bs3 h2,
228 .bs3 h3 {
229 page-break-after: avoid;
230 }
231 .bs3 .navbar {
232 display: none;
233 }
234 .bs3 .table td,
235 .bs3 .table th {
236 background-color: #fff !important;
237 }
238 .bs3 .btn > .caret,
239 .bs3 .dropup > .btn > .caret {
240 border-top-color: #000 !important;
241 }
242 .bs3 .label {
243 border: 1px solid #000;
244 }
245 .bs3 .table {
246 border-collapse: collapse !important;
247 }
248 .bs3 .table-bordered th,
249 .bs3 .table-bordered td {
250 border: 1px solid #ddd !important;
251 }
252}
253.bs3 *,
254.bs3 *:before,
255.bs3 *:after {
256 -webkit-box-sizing: border-box;
257 -moz-box-sizing: border-box;
258 box-sizing: border-box;
259}
260.bs3 html {
261 font-size: 62.5%;
262 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
263}
264.bs3 body {
265 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
266 font-size: 14px;
267 line-height: 1.428571429;
268 color: #333333;
269 background-color: #ffffff;
270}
271.bs3 input,
272.bs3 button,
273.bs3 select,
274.bs3 textarea {
275 font-family: inherit;
276 font-size: inherit;
277 line-height: inherit;
278}
279.bs3 a {
280 color: #428bca;
281 text-decoration: none;
282}
283.bs3 a:hover,
284.bs3 a:focus {
285 color: #2a6496;
286 text-decoration: underline;
287}
288.bs3 a:focus {
289 outline: thin dotted #333;
290 outline: 5px auto -webkit-focus-ring-color;
291 outline-offset: -2px;
292}
293.bs3 img {
294 vertical-align: middle;
295}
296.bs3 .img-responsive {
297 display: block;
298 max-width: 100%;
299 height: auto;
300}
301.bs3 .img-rounded {
302 border-radius: 6px;
303}
304.bs3 .img-thumbnail {
305 padding: 4px;
306 line-height: 1.428571429;
307 background-color: #ffffff;
308 border: 1px solid #dddddd;
309 border-radius: 4px;
310 -webkit-transition: all 0.2s ease-in-out;
311 transition: all 0.2s ease-in-out;
312 display: inline-block;
313 max-width: 100%;
314 height: auto;
315}
316.bs3 .img-circle {
317 border-radius: 50%;
318}
319.bs3 hr {
320 margin-top: 20px;
321 margin-bottom: 20px;
322 border: 0;
323 border-top: 1px solid #eeeeee;
324}
325.bs3 .sr-only {
326 position: absolute;
327 width: 1px;
328 height: 1px;
329 margin: -1px;
330 padding: 0;
331 overflow: hidden;
332 clip: rect(0 0 0 0);
333 border: 0;
334}
335.bs3 p {
336 margin: 0 0 10px;
337}
338.bs3 .lead {
339 margin-bottom: 20px;
340 font-size: 16.099999999999998px;
341 font-weight: 200;
342 line-height: 1.4;
343}
344@media (min-width: 768px) {
345 .bs3 .lead {
346 font-size: 21px;
347 }
348}
349.bs3 small,
350.bs3 .small {
351 font-size: 85%;
352}
353.bs3 cite {
354 font-style: normal;
355}
356.bs3 .text-muted {
357 color: #999999;
358}
359.bs3 .text-primary {
360 color: #428bca;
361}
362.bs3 .text-primary:hover {
363 color: #3071a9;
364}
365.bs3 .text-warning {
366 color: #c09853;
367}
368.bs3 .text-warning:hover {
369 color: #a47e3c;
370}
371.bs3 .text-danger {
372 color: #b94a48;
373}
374.bs3 .text-danger:hover {
375 color: #953b39;
376}
377.bs3 .text-success {
378 color: #468847;
379}
380.bs3 .text-success:hover {
381 color: #356635;
382}
383.bs3 .text-info {
384 color: #3a87ad;
385}
386.bs3 .text-info:hover {
387 color: #2d6987;
388}
389.bs3 .text-left {
390 text-align: left;
391}
392.bs3 .text-right {
393 text-align: right;
394}
395.bs3 .text-center {
396 text-align: center;
397}
398.bs3 h1,
399.bs3 h2,
400.bs3 h3,
401.bs3 h4,
402.bs3 h5,
403.bs3 h6,
404.bs3 .h1,
405.bs3 .h2,
406.bs3 .h3,
407.bs3 .h4,
408.bs3 .h5,
409.bs3 .h6 {
410 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
411 font-weight: 500;
412 line-height: 1.1;
413 color: inherit;
414}
415.bs3 h1 small,
416.bs3 h2 small,
417.bs3 h3 small,
418.bs3 h4 small,
419.bs3 h5 small,
420.bs3 h6 small,
421.bs3 .h1 small,
422.bs3 .h2 small,
423.bs3 .h3 small,
424.bs3 .h4 small,
425.bs3 .h5 small,
426.bs3 .h6 small {
427 font-weight: normal;
428 line-height: 1;
429 color: #999999;
430}
431.bs3 h1,
432.bs3 h2,
433.bs3 h3 {
434 margin-top: 20px;
435 margin-bottom: 10px;
436}
437.bs3 h1 small,
438.bs3 h2 small,
439.bs3 h3 small {
440 font-size: 65%;
441}
442.bs3 h4,
443.bs3 h5,
444.bs3 h6 {
445 margin-top: 10px;
446 margin-bottom: 10px;
447}
448.bs3 h4 small,
449.bs3 h5 small,
450.bs3 h6 small {
451 font-size: 75%;
452}
453.bs3 h1,
454.bs3 .h1 {
455 font-size: 36px;
456}
457.bs3 h2,
458.bs3 .h2 {
459 font-size: 30px;
460}
461.bs3 h3,
462.bs3 .h3 {
463 font-size: 24px;
464}
465.bs3 h4,
466.bs3 .h4 {
467 font-size: 18px;
468}
469.bs3 h5,
470.bs3 .h5 {
471 font-size: 14px;
472}
473.bs3 h6,
474.bs3 .h6 {
475 font-size: 12px;
476}
477.bs3 .page-header {
478 padding-bottom: 9px;
479 margin: 40px 0 20px;
480 border-bottom: 1px solid #eeeeee;
481}
482.bs3 ul,
483.bs3 ol {
484 margin-top: 0;
485 margin-bottom: 10px;
486}
487.bs3 ul ul,
488.bs3 ol ul,
489.bs3 ul ol,
490.bs3 ol ol {
491 margin-bottom: 0;
492}
493.bs3 .list-unstyled {
494 padding-left: 0;
495 list-style: none;
496}
497.bs3 .list-inline {
498 padding-left: 0;
499 list-style: none;
500}
501.bs3 .list-inline > li {
502 display: inline-block;
503 padding-left: 5px;
504 padding-right: 5px;
505}
506.bs3 dl {
507 margin-bottom: 20px;
508}
509.bs3 dt,
510.bs3 dd {
511 line-height: 1.428571429;
512}
513.bs3 dt {
514 font-weight: bold;
515}
516.bs3 dd {
517 margin-left: 0;
518}
519@media (min-width: 768px) {
520 .bs3 .dl-horizontal dt {
521 float: left;
522 width: 160px;
523 clear: left;
524 text-align: right;
525 overflow: hidden;
526 text-overflow: ellipsis;
527 white-space: nowrap;
528 }
529 .bs3 .dl-horizontal dd {
530 margin-left: 180px;
531 }
532 .bs3 .dl-horizontal dd:before,
533 .bs3 .dl-horizontal dd:after {
534 content: " ";
535 /* 1 */
536
537 display: table;
538 /* 2 */
539
540 }
541 .bs3 .dl-horizontal dd:after {
542 clear: both;
543 }
544 .bs3 .dl-horizontal dd:before,
545 .bs3 .dl-horizontal dd:after {
546 content: " ";
547 /* 1 */
548
549 display: table;
550 /* 2 */
551
552 }
553 .bs3 .dl-horizontal dd:after {
554 clear: both;
555 }
556}
557.bs3 abbr[title],
558.bs3 abbr[data-original-title] {
559 cursor: help;
560 border-bottom: 1px dotted #999999;
561}
562.bs3 abbr.initialism {
563 font-size: 90%;
564 text-transform: uppercase;
565}
566.bs3 blockquote {
567 padding: 10px 20px;
568 margin: 0 0 20px;
569 border-left: 5px solid #eeeeee;
570}
571.bs3 blockquote p {
572 font-size: 17.5px;
573 font-weight: 300;
574 line-height: 1.25;
575}
576.bs3 blockquote p:last-child {
577 margin-bottom: 0;
578}
579.bs3 blockquote small {
580 display: block;
581 line-height: 1.428571429;
582 color: #999999;
583}
584.bs3 blockquote small:before {
585 content: '\2014 \00A0';
586}
587.bs3 blockquote.pull-right {
588 padding-right: 15px;
589 padding-left: 0;
590 border-right: 5px solid #eeeeee;
591 border-left: 0;
592}
593.bs3 blockquote.pull-right p,
594.bs3 blockquote.pull-right small {
595 text-align: right;
596}
597.bs3 blockquote.pull-right small:before {
598 content: '';
599}
600.bs3 blockquote.pull-right small:after {
601 content: '\00A0 \2014';
602}
603.bs3 q:before,
604.bs3 q:after,
605.bs3 blockquote:before,
606.bs3 blockquote:after {
607 content: "";
608}
609.bs3 address {
610 display: block;
611 margin-bottom: 20px;
612 font-style: normal;
613 line-height: 1.428571429;
614}
615.bs3 code,
616.bs3 pre {
617 font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
618}
619.bs3 code {
620 padding: 2px 4px;
621 font-size: 90%;
622 color: #c7254e;
623 background-color: #f9f2f4;
624 white-space: nowrap;
625 border-radius: 4px;
626}
627.bs3 pre {
628 display: block;
629 padding: 9.5px;
630 margin: 0 0 10px;
631 font-size: 13px;
632 line-height: 1.428571429;
633 word-break: break-all;
634 word-wrap: break-word;
635 color: #333333;
636 background-color: #f5f5f5;
637 border: 1px solid #cccccc;
638 border-radius: 4px;
639}
640.bs3 pre.prettyprint {
641 margin-bottom: 20px;
642}
643.bs3 pre code {
644 padding: 0;
645 font-size: inherit;
646 color: inherit;
647 white-space: pre-wrap;
648 background-color: transparent;
649 border: 0;
650}
651.bs3 .pre-scrollable {
652 max-height: 340px;
653 overflow-y: scroll;
654}
655.bs3 .container {
656 margin-right: auto;
657 margin-left: auto;
658 padding-left: 15px;
659 padding-right: 15px;
660}
661.bs3 .container:before,
662.bs3 .container:after {
663 content: " ";
664 /* 1 */
665
666 display: table;
667 /* 2 */
668
669}
670.bs3 .container:after {
671 clear: both;
672}
673.bs3 .container:before,
674.bs3 .container:after {
675 content: " ";
676 /* 1 */
677
678 display: table;
679 /* 2 */
680
681}
682.bs3 .container:after {
683 clear: both;
684}
685.bs3 .row {
686 margin-left: -15px;
687 margin-right: -15px;
688}
689.bs3 .row:before,
690.bs3 .row:after {
691 content: " ";
692 /* 1 */
693
694 display: table;
695 /* 2 */
696
697}
698.bs3 .row:after {
699 clear: both;
700}
701.bs3 .row:before,
702.bs3 .row:after {
703 content: " ";
704 /* 1 */
705
706 display: table;
707 /* 2 */
708
709}
710.bs3 .row:after {
711 clear: both;
712}
713.bs3 .col-xs-1,
714.bs3 .col-xs-2,
715.bs3 .col-xs-3,
716.bs3 .col-xs-4,
717.bs3 .col-xs-5,
718.bs3 .col-xs-6,
719.bs3 .col-xs-7,
720.bs3 .col-xs-8,
721.bs3 .col-xs-9,
722.bs3 .col-xs-10,
723.bs3 .col-xs-11,
724.bs3 .col-xs-12,
725.bs3 .col-sm-1,
726.bs3 .col-sm-2,
727.bs3 .col-sm-3,
728.bs3 .col-sm-4,
729.bs3 .col-sm-5,
730.bs3 .col-sm-6,
731.bs3 .col-sm-7,
732.bs3 .col-sm-8,
733.bs3 .col-sm-9,
734.bs3 .col-sm-10,
735.bs3 .col-sm-11,
736.bs3 .col-sm-12,
737.bs3 .col-md-1,
738.bs3 .col-md-2,
739.bs3 .col-md-3,
740.bs3 .col-md-4,
741.bs3 .col-md-5,
742.bs3 .col-md-6,
743.bs3 .col-md-7,
744.bs3 .col-md-8,
745.bs3 .col-md-9,
746.bs3 .col-md-10,
747.bs3 .col-md-11,
748.bs3 .col-md-12,
749.bs3 .col-lg-1,
750.bs3 .col-lg-2,
751.bs3 .col-lg-3,
752.bs3 .col-lg-4,
753.bs3 .col-lg-5,
754.bs3 .col-lg-6,
755.bs3 .col-lg-7,
756.bs3 .col-lg-8,
757.bs3 .col-lg-9,
758.bs3 .col-lg-10,
759.bs3 .col-lg-11,
760.bs3 .col-lg-12 {
761 position: relative;
762 min-height: 1px;
763 padding-left: 15px;
764 padding-right: 15px;
765}
766.bs3 .col-xs-1,
767.bs3 .col-xs-2,
768.bs3 .col-xs-3,
769.bs3 .col-xs-4,
770.bs3 .col-xs-5,
771.bs3 .col-xs-6,
772.bs3 .col-xs-7,
773.bs3 .col-xs-8,
774.bs3 .col-xs-9,
775.bs3 .col-xs-10,
776.bs3 .col-xs-11 {
777 float: left;
778}
779.bs3 .col-xs-1 {
780 width: 8.333333333333332%;
781}
782.bs3 .col-xs-2 {
783 width: 16.666666666666664%;
784}
785.bs3 .col-xs-3 {
786 width: 25%;
787}
788.bs3 .col-xs-4 {
789 width: 33.33333333333333%;
790}
791.bs3 .col-xs-5 {
792 width: 41.66666666666667%;
793}
794.bs3 .col-xs-6 {
795 width: 50%;
796}
797.bs3 .col-xs-7 {
798 width: 58.333333333333336%;
799}
800.bs3 .col-xs-8 {
801 width: 66.66666666666666%;
802}
803.bs3 .col-xs-9 {
804 width: 75%;
805}
806.bs3 .col-xs-10 {
807 width: 83.33333333333334%;
808}
809.bs3 .col-xs-11 {
810 width: 91.66666666666666%;
811}
812.bs3 .col-xs-12 {
813 width: 100%;
814}
815@media (min-width: 768px) {
816 .bs3 .container {
817 width: 750px;
818 }
819 .bs3 .col-sm-1,
820 .bs3 .col-sm-2,
821 .bs3 .col-sm-3,
822 .bs3 .col-sm-4,
823 .bs3 .col-sm-5,
824 .bs3 .col-sm-6,
825 .bs3 .col-sm-7,
826 .bs3 .col-sm-8,
827 .bs3 .col-sm-9,
828 .bs3 .col-sm-10,
829 .bs3 .col-sm-11 {
830 float: left;
831 }
832 .bs3 .col-sm-1 {
833 width: 8.333333333333332%;
834 }
835 .bs3 .col-sm-2 {
836 width: 16.666666666666664%;
837 }
838 .bs3 .col-sm-3 {
839 width: 25%;
840 }
841 .bs3 .col-sm-4 {
842 width: 33.33333333333333%;
843 }
844 .bs3 .col-sm-5 {
845 width: 41.66666666666667%;
846 }
847 .bs3 .col-sm-6 {
848 width: 50%;
849 }
850 .bs3 .col-sm-7 {
851 width: 58.333333333333336%;
852 }
853 .bs3 .col-sm-8 {
854 width: 66.66666666666666%;
855 }
856 .bs3 .col-sm-9 {
857 width: 75%;
858 }
859 .bs3 .col-sm-10 {
860 width: 83.33333333333334%;
861 }
862 .bs3 .col-sm-11 {
863 width: 91.66666666666666%;
864 }
865 .bs3 .col-sm-12 {
866 width: 100%;
867 }
868 .bs3 .col-sm-push-1 {
869 left: 8.333333333333332%;
870 }
871 .bs3 .col-sm-push-2 {
872 left: 16.666666666666664%;
873 }
874 .bs3 .col-sm-push-3 {
875 left: 25%;
876 }
877 .bs3 .col-sm-push-4 {
878 left: 33.33333333333333%;
879 }
880 .bs3 .col-sm-push-5 {
881 left: 41.66666666666667%;
882 }
883 .bs3 .col-sm-push-6 {
884 left: 50%;
885 }
886 .bs3 .col-sm-push-7 {
887 left: 58.333333333333336%;
888 }
889 .bs3 .col-sm-push-8 {
890 left: 66.66666666666666%;
891 }
892 .bs3 .col-sm-push-9 {
893 left: 75%;
894 }
895 .bs3 .col-sm-push-10 {
896 left: 83.33333333333334%;
897 }
898 .bs3 .col-sm-push-11 {
899 left: 91.66666666666666%;
900 }
901 .bs3 .col-sm-pull-1 {
902 right: 8.333333333333332%;
903 }
904 .bs3 .col-sm-pull-2 {
905 right: 16.666666666666664%;
906 }
907 .bs3 .col-sm-pull-3 {
908 right: 25%;
909 }
910 .bs3 .col-sm-pull-4 {
911 right: 33.33333333333333%;
912 }
913 .bs3 .col-sm-pull-5 {
914 right: 41.66666666666667%;
915 }
916 .bs3 .col-sm-pull-6 {
917 right: 50%;
918 }
919 .bs3 .col-sm-pull-7 {
920 right: 58.333333333333336%;
921 }
922 .bs3 .col-sm-pull-8 {
923 right: 66.66666666666666%;
924 }
925 .bs3 .col-sm-pull-9 {
926 right: 75%;
927 }
928 .bs3 .col-sm-pull-10 {
929 right: 83.33333333333334%;
930 }
931 .bs3 .col-sm-pull-11 {
932 right: 91.66666666666666%;
933 }
934 .bs3 .col-sm-offset-1 {
935 margin-left: 8.333333333333332%;
936 }
937 .bs3 .col-sm-offset-2 {
938 margin-left: 16.666666666666664%;
939 }
940 .bs3 .col-sm-offset-3 {
941 margin-left: 25%;
942 }
943 .bs3 .col-sm-offset-4 {
944 margin-left: 33.33333333333333%;
945 }
946 .bs3 .col-sm-offset-5 {
947 margin-left: 41.66666666666667%;
948 }
949 .bs3 .col-sm-offset-6 {
950 margin-left: 50%;
951 }
952 .bs3 .col-sm-offset-7 {
953 margin-left: 58.333333333333336%;
954 }
955 .bs3 .col-sm-offset-8 {
956 margin-left: 66.66666666666666%;
957 }
958 .bs3 .col-sm-offset-9 {
959 margin-left: 75%;
960 }
961 .bs3 .col-sm-offset-10 {
962 margin-left: 83.33333333333334%;
963 }
964 .bs3 .col-sm-offset-11 {
965 margin-left: 91.66666666666666%;
966 }
967}
968@media (min-width: 992px) {
969 .bs3 .container {
970 width: 970px;
971 }
972 .bs3 .col-md-1,
973 .bs3 .col-md-2,
974 .bs3 .col-md-3,
975 .bs3 .col-md-4,
976 .bs3 .col-md-5,
977 .bs3 .col-md-6,
978 .bs3 .col-md-7,
979 .bs3 .col-md-8,
980 .bs3 .col-md-9,
981 .bs3 .col-md-10,
982 .bs3 .col-md-11 {
983 float: left;
984 }
985 .bs3 .col-md-1 {
986 width: 8.333333333333332%;
987 }
988 .bs3 .col-md-2 {
989 width: 16.666666666666664%;
990 }
991 .bs3 .col-md-3 {
992 width: 25%;
993 }
994 .bs3 .col-md-4 {
995 width: 33.33333333333333%;
996 }
997 .bs3 .col-md-5 {
998 width: 41.66666666666667%;
999 }
1000 .bs3 .col-md-6 {
1001 width: 50%;
1002 }
1003 .bs3 .col-md-7 {
1004 width: 58.333333333333336%;
1005 }
1006 .bs3 .col-md-8 {
1007 width: 66.66666666666666%;
1008 }
1009 .bs3 .col-md-9 {
1010 width: 75%;
1011 }
1012 .bs3 .col-md-10 {
1013 width: 83.33333333333334%;
1014 }
1015 .bs3 .col-md-11 {
1016 width: 91.66666666666666%;
1017 }
1018 .bs3 .col-md-12 {
1019 width: 100%;
1020 }
1021 .bs3 .col-md-push-0 {
1022 left: auto;
1023 }
1024 .bs3 .col-md-push-1 {
1025 left: 8.333333333333332%;
1026 }
1027 .bs3 .col-md-push-2 {
1028 left: 16.666666666666664%;
1029 }
1030 .bs3 .col-md-push-3 {
1031 left: 25%;
1032 }
1033 .bs3 .col-md-push-4 {
1034 left: 33.33333333333333%;
1035 }
1036 .bs3 .col-md-push-5 {
1037 left: 41.66666666666667%;
1038 }
1039 .bs3 .col-md-push-6 {
1040 left: 50%;
1041 }
1042 .bs3 .col-md-push-7 {
1043 left: 58.333333333333336%;
1044 }
1045 .bs3 .col-md-push-8 {
1046 left: 66.66666666666666%;
1047 }
1048 .bs3 .col-md-push-9 {
1049 left: 75%;
1050 }
1051 .bs3 .col-md-push-10 {
1052 left: 83.33333333333334%;
1053 }
1054 .bs3 .col-md-push-11 {
1055 left: 91.66666666666666%;
1056 }
1057 .bs3 .col-md-pull-0 {
1058 right: auto;
1059 }
1060 .bs3 .col-md-pull-1 {
1061 right: 8.333333333333332%;
1062 }
1063 .bs3 .col-md-pull-2 {
1064 right: 16.666666666666664%;
1065 }
1066 .bs3 .col-md-pull-3 {
1067 right: 25%;
1068 }
1069 .bs3 .col-md-pull-4 {
1070 right: 33.33333333333333%;
1071 }
1072 .bs3 .col-md-pull-5 {
1073 right: 41.66666666666667%;
1074 }
1075 .bs3 .col-md-pull-6 {
1076 right: 50%;
1077 }
1078 .bs3 .col-md-pull-7 {
1079 right: 58.333333333333336%;
1080 }
1081 .bs3 .col-md-pull-8 {
1082 right: 66.66666666666666%;
1083 }
1084 .bs3 .col-md-pull-9 {
1085 right: 75%;
1086 }
1087 .bs3 .col-md-pull-10 {
1088 right: 83.33333333333334%;
1089 }
1090 .bs3 .col-md-pull-11 {
1091 right: 91.66666666666666%;
1092 }
1093 .bs3 .col-md-offset-0 {
1094 margin-left: 0;
1095 }
1096 .bs3 .col-md-offset-1 {
1097 margin-left: 8.333333333333332%;
1098 }
1099 .bs3 .col-md-offset-2 {
1100 margin-left: 16.666666666666664%;
1101 }
1102 .bs3 .col-md-offset-3 {
1103 margin-left: 25%;
1104 }
1105 .bs3 .col-md-offset-4 {
1106 margin-left: 33.33333333333333%;
1107 }
1108 .bs3 .col-md-offset-5 {
1109 margin-left: 41.66666666666667%;
1110 }
1111 .bs3 .col-md-offset-6 {
1112 margin-left: 50%;
1113 }
1114 .bs3 .col-md-offset-7 {
1115 margin-left: 58.333333333333336%;
1116 }
1117 .bs3 .col-md-offset-8 {
1118 margin-left: 66.66666666666666%;
1119 }
1120 .bs3 .col-md-offset-9 {
1121 margin-left: 75%;
1122 }
1123 .bs3 .col-md-offset-10 {
1124 margin-left: 83.33333333333334%;
1125 }
1126 .bs3 .col-md-offset-11 {
1127 margin-left: 91.66666666666666%;
1128 }
1129}
1130@media (min-width: 1200px) {
1131 .bs3 .container {
1132 width: 1170px;
1133 }
1134 .bs3 .col-lg-1,
1135 .bs3 .col-lg-2,
1136 .bs3 .col-lg-3,
1137 .bs3 .col-lg-4,
1138 .bs3 .col-lg-5,
1139 .bs3 .col-lg-6,
1140 .bs3 .col-lg-7,
1141 .bs3 .col-lg-8,
1142 .bs3 .col-lg-9,
1143 .bs3 .col-lg-10,
1144 .bs3 .col-lg-11 {
1145 float: left;
1146 }
1147 .bs3 .col-lg-1 {
1148 width: 8.333333333333332%;
1149 }
1150 .bs3 .col-lg-2 {
1151 width: 16.666666666666664%;
1152 }
1153 .bs3 .col-lg-3 {
1154 width: 25%;
1155 }
1156 .bs3 .col-lg-4 {
1157 width: 33.33333333333333%;
1158 }
1159 .bs3 .col-lg-5 {
1160 width: 41.66666666666667%;
1161 }
1162 .bs3 .col-lg-6 {
1163 width: 50%;
1164 }
1165 .bs3 .col-lg-7 {
1166 width: 58.333333333333336%;
1167 }
1168 .bs3 .col-lg-8 {
1169 width: 66.66666666666666%;
1170 }
1171 .bs3 .col-lg-9 {
1172 width: 75%;
1173 }
1174 .bs3 .col-lg-10 {
1175 width: 83.33333333333334%;
1176 }
1177 .bs3 .col-lg-11 {
1178 width: 91.66666666666666%;
1179 }
1180 .bs3 .col-lg-12 {
1181 width: 100%;
1182 }
1183 .bs3 .col-lg-push-0 {
1184 left: auto;
1185 }
1186 .bs3 .col-lg-push-1 {
1187 left: 8.333333333333332%;
1188 }
1189 .bs3 .col-lg-push-2 {
1190 left: 16.666666666666664%;
1191 }
1192 .bs3 .col-lg-push-3 {
1193 left: 25%;
1194 }
1195 .bs3 .col-lg-push-4 {
1196 left: 33.33333333333333%;
1197 }
1198 .bs3 .col-lg-push-5 {
1199 left: 41.66666666666667%;
1200 }
1201 .bs3 .col-lg-push-6 {
1202 left: 50%;
1203 }
1204 .bs3 .col-lg-push-7 {
1205 left: 58.333333333333336%;
1206 }
1207 .bs3 .col-lg-push-8 {
1208 left: 66.66666666666666%;
1209 }
1210 .bs3 .col-lg-push-9 {
1211 left: 75%;
1212 }
1213 .bs3 .col-lg-push-10 {
1214 left: 83.33333333333334%;
1215 }
1216 .bs3 .col-lg-push-11 {
1217 left: 91.66666666666666%;
1218 }
1219 .bs3 .col-lg-pull-0 {
1220 right: auto;
1221 }
1222 .bs3 .col-lg-pull-1 {
1223 right: 8.333333333333332%;
1224 }
1225 .bs3 .col-lg-pull-2 {
1226 right: 16.666666666666664%;
1227 }
1228 .bs3 .col-lg-pull-3 {
1229 right: 25%;
1230 }
1231 .bs3 .col-lg-pull-4 {
1232 right: 33.33333333333333%;
1233 }
1234 .bs3 .col-lg-pull-5 {
1235 right: 41.66666666666667%;
1236 }
1237 .bs3 .col-lg-pull-6 {
1238 right: 50%;
1239 }
1240 .bs3 .col-lg-pull-7 {
1241 right: 58.333333333333336%;
1242 }
1243 .bs3 .col-lg-pull-8 {
1244 right: 66.66666666666666%;
1245 }
1246 .bs3 .col-lg-pull-9 {
1247 right: 75%;
1248 }
1249 .bs3 .col-lg-pull-10 {
1250 right: 83.33333333333334%;
1251 }
1252 .bs3 .col-lg-pull-11 {
1253 right: 91.66666666666666%;
1254 }
1255 .bs3 .col-lg-offset-0 {
1256 margin-left: 0;
1257 }
1258 .bs3 .col-lg-offset-1 {
1259 margin-left: 8.333333333333332%;
1260 }
1261 .bs3 .col-lg-offset-2 {
1262 margin-left: 16.666666666666664%;
1263 }
1264 .bs3 .col-lg-offset-3 {
1265 margin-left: 25%;
1266 }
1267 .bs3 .col-lg-offset-4 {
1268 margin-left: 33.33333333333333%;
1269 }
1270 .bs3 .col-lg-offset-5 {
1271 margin-left: 41.66666666666667%;
1272 }
1273 .bs3 .col-lg-offset-6 {
1274 margin-left: 50%;
1275 }
1276 .bs3 .col-lg-offset-7 {
1277 margin-left: 58.333333333333336%;
1278 }
1279 .bs3 .col-lg-offset-8 {
1280 margin-left: 66.66666666666666%;
1281 }
1282 .bs3 .col-lg-offset-9 {
1283 margin-left: 75%;
1284 }
1285 .bs3 .col-lg-offset-10 {
1286 margin-left: 83.33333333333334%;
1287 }
1288 .bs3 .col-lg-offset-11 {
1289 margin-left: 91.66666666666666%;
1290 }
1291}
1292.bs3 table {
1293 max-width: 100%;
1294 background-color: transparent;
1295}
1296.bs3 th {
1297 text-align: left;
1298}
1299.bs3 .table {
1300 width: 100%;
1301 margin-bottom: 20px;
1302}
1303.bs3 .table > thead > tr > th,
1304.bs3 .table > tbody > tr > th,
1305.bs3 .table > tfoot > tr > th,
1306.bs3 .table > thead > tr > td,
1307.bs3 .table > tbody > tr > td,
1308.bs3 .table > tfoot > tr > td {
1309 padding: 8px;
1310 line-height: 1.428571429;
1311 vertical-align: top;
1312 border-top: 1px solid #dddddd;
1313}
1314.bs3 .table > thead > tr > th {
1315 vertical-align: bottom;
1316 border-bottom: 2px solid #dddddd;
1317}
1318.bs3 .table > caption + thead > tr:first-child > th,
1319.bs3 .table > colgroup + thead > tr:first-child > th,
1320.bs3 .table > thead:first-child > tr:first-child > th,
1321.bs3 .table > caption + thead > tr:first-child > td,
1322.bs3 .table > colgroup + thead > tr:first-child > td,
1323.bs3 .table > thead:first-child > tr:first-child > td {
1324 border-top: 0;
1325}
1326.bs3 .table > tbody + tbody {
1327 border-top: 2px solid #dddddd;
1328}
1329.bs3 .table .table {
1330 background-color: #ffffff;
1331}
1332.bs3 .table-condensed > thead > tr > th,
1333.bs3 .table-condensed > tbody > tr > th,
1334.bs3 .table-condensed > tfoot > tr > th,
1335.bs3 .table-condensed > thead > tr > td,
1336.bs3 .table-condensed > tbody > tr > td,
1337.bs3 .table-condensed > tfoot > tr > td {
1338 padding: 5px;
1339}
1340.bs3 .table-bordered {
1341 border: 1px solid #dddddd;
1342}
1343.bs3 .table-bordered > thead > tr > th,
1344.bs3 .table-bordered > tbody > tr > th,
1345.bs3 .table-bordered > tfoot > tr > th,
1346.bs3 .table-bordered > thead > tr > td,
1347.bs3 .table-bordered > tbody > tr > td,
1348.bs3 .table-bordered > tfoot > tr > td {
1349 border: 1px solid #dddddd;
1350}
1351.bs3 .table-bordered > thead > tr > th,
1352.bs3 .table-bordered > thead > tr > td {
1353 border-bottom-width: 2px;
1354}
1355.bs3 .table-striped > tbody > tr:nth-child(odd) > td,
1356.bs3 .table-striped > tbody > tr:nth-child(odd) > th {
1357 background-color: #f9f9f9;
1358}
1359.bs3 .table-hover > tbody > tr:hover > td,
1360.bs3 .table-hover > tbody > tr:hover > th {
1361 background-color: #f5f5f5;
1362}
1363.bs3 table col[class*="col-"] {
1364 float: none;
1365 display: table-column;
1366}
1367.bs3 table td[class*="col-"],
1368.bs3 table th[class*="col-"] {
1369 float: none;
1370 display: table-cell;
1371}
1372.bs3 .table > thead > tr > td.active,
1373.bs3 .table > tbody > tr > td.active,
1374.bs3 .table > tfoot > tr > td.active,
1375.bs3 .table > thead > tr > th.active,
1376.bs3 .table > tbody > tr > th.active,
1377.bs3 .table > tfoot > tr > th.active,
1378.bs3 .table > thead > tr.active > td,
1379.bs3 .table > tbody > tr.active > td,
1380.bs3 .table > tfoot > tr.active > td,
1381.bs3 .table > thead > tr.active > th,
1382.bs3 .table > tbody > tr.active > th,
1383.bs3 .table > tfoot > tr.active > th {
1384 background-color: #f5f5f5;
1385}
1386.bs3 .table > thead > tr > td.success,
1387.bs3 .table > tbody > tr > td.success,
1388.bs3 .table > tfoot > tr > td.success,
1389.bs3 .table > thead > tr > th.success,
1390.bs3 .table > tbody > tr > th.success,
1391.bs3 .table > tfoot > tr > th.success,
1392.bs3 .table > thead > tr.success > td,
1393.bs3 .table > tbody > tr.success > td,
1394.bs3 .table > tfoot > tr.success > td,
1395.bs3 .table > thead > tr.success > th,
1396.bs3 .table > tbody > tr.success > th,
1397.bs3 .table > tfoot > tr.success > th {
1398 background-color: #dff0d8;
1399 border-color: #d6e9c6;
1400}
1401.bs3 .table-hover > tbody > tr > td.success:hover,
1402.bs3 .table-hover > tbody > tr > th.success:hover,
1403.bs3 .table-hover > tbody > tr.success:hover > td,
1404.bs3 .table-hover > tbody > tr.success:hover > th {
1405 background-color: #d0e9c6;
1406 border-color: #c9e2b3;
1407}
1408.bs3 .table > thead > tr > td.danger,
1409.bs3 .table > tbody > tr > td.danger,
1410.bs3 .table > tfoot > tr > td.danger,
1411.bs3 .table > thead > tr > th.danger,
1412.bs3 .table > tbody > tr > th.danger,
1413.bs3 .table > tfoot > tr > th.danger,
1414.bs3 .table > thead > tr.danger > td,
1415.bs3 .table > tbody > tr.danger > td,
1416.bs3 .table > tfoot > tr.danger > td,
1417.bs3 .table > thead > tr.danger > th,
1418.bs3 .table > tbody > tr.danger > th,
1419.bs3 .table > tfoot > tr.danger > th {
1420 background-color: #f2dede;
1421 border-color: #eed3d7;
1422}
1423.bs3 .table-hover > tbody > tr > td.danger:hover,
1424.bs3 .table-hover > tbody > tr > th.danger:hover,
1425.bs3 .table-hover > tbody > tr.danger:hover > td,
1426.bs3 .table-hover > tbody > tr.danger:hover > th {
1427 background-color: #ebcccc;
1428 border-color: #e6c1c7;
1429}
1430.bs3 .table > thead > tr > td.warning,
1431.bs3 .table > tbody > tr > td.warning,
1432.bs3 .table > tfoot > tr > td.warning,
1433.bs3 .table > thead > tr > th.warning,
1434.bs3 .table > tbody > tr > th.warning,
1435.bs3 .table > tfoot > tr > th.warning,
1436.bs3 .table > thead > tr.warning > td,
1437.bs3 .table > tbody > tr.warning > td,
1438.bs3 .table > tfoot > tr.warning > td,
1439.bs3 .table > thead > tr.warning > th,
1440.bs3 .table > tbody > tr.warning > th,
1441.bs3 .table > tfoot > tr.warning > th {
1442 background-color: #fcf8e3;
1443 border-color: #fbeed5;
1444}
1445.bs3 .table-hover > tbody > tr > td.warning:hover,
1446.bs3 .table-hover > tbody > tr > th.warning:hover,
1447.bs3 .table-hover > tbody > tr.warning:hover > td,
1448.bs3 .table-hover > tbody > tr.warning:hover > th {
1449 background-color: #faf2cc;
1450 border-color: #f8e5be;
1451}
1452@media (max-width: 768px) {
1453 .bs3 .table-responsive {
1454 width: 100%;
1455 margin-bottom: 15px;
1456 overflow-y: hidden;
1457 overflow-x: scroll;
1458 -ms-overflow-style: -ms-autohiding-scrollbar;
1459 border: 1px solid #dddddd;
1460 -webkit-overflow-scrolling: touch;
1461 }
1462 .bs3 .table-responsive > .table {
1463 margin-bottom: 0;
1464 background-color: #fff;
1465 }
1466 .bs3 .table-responsive > .table > thead > tr > th,
1467 .bs3 .table-responsive > .table > tbody > tr > th,
1468 .bs3 .table-responsive > .table > tfoot > tr > th,
1469 .bs3 .table-responsive > .table > thead > tr > td,
1470 .bs3 .table-responsive > .table > tbody > tr > td,
1471 .bs3 .table-responsive > .table > tfoot > tr > td {
1472 white-space: nowrap;
1473 }
1474 .bs3 .table-responsive > .table-bordered {
1475 border: 0;
1476 }
1477 .bs3 .table-responsive > .table-bordered > thead > tr > th:first-child,
1478 .bs3 .table-responsive > .table-bordered > tbody > tr > th:first-child,
1479 .bs3 .table-responsive > .table-bordered > tfoot > tr > th:first-child,
1480 .bs3 .table-responsive > .table-bordered > thead > tr > td:first-child,
1481 .bs3 .table-responsive > .table-bordered > tbody > tr > td:first-child,
1482 .bs3 .table-responsive > .table-bordered > tfoot > tr > td:first-child {
1483 border-left: 0;
1484 }
1485 .bs3 .table-responsive > .table-bordered > thead > tr > th:last-child,
1486 .bs3 .table-responsive > .table-bordered > tbody > tr > th:last-child,
1487 .bs3 .table-responsive > .table-bordered > tfoot > tr > th:last-child,
1488 .bs3 .table-responsive > .table-bordered > thead > tr > td:last-child,
1489 .bs3 .table-responsive > .table-bordered > tbody > tr > td:last-child,
1490 .bs3 .table-responsive > .table-bordered > tfoot > tr > td:last-child {
1491 border-right: 0;
1492 }
1493 .bs3 .table-responsive > .table-bordered > thead > tr:last-child > th,
1494 .bs3 .table-responsive > .table-bordered > tbody > tr:last-child > th,
1495 .bs3 .table-responsive > .table-bordered > tfoot > tr:last-child > th,
1496 .bs3 .table-responsive > .table-bordered > thead > tr:last-child > td,
1497 .bs3 .table-responsive > .table-bordered > tbody > tr:last-child > td,
1498 .bs3 .table-responsive > .table-bordered > tfoot > tr:last-child > td {
1499 border-bottom: 0;
1500 }
1501}
1502.bs3 fieldset {
1503 padding: 0;
1504 margin: 0;
1505 border: 0;
1506}
1507.bs3 legend {
1508 display: block;
1509 width: 100%;
1510 padding: 0;
1511 margin-bottom: 20px;
1512 font-size: 21px;
1513 line-height: inherit;
1514 color: #333333;
1515 border: 0;
1516 border-bottom: 1px solid #e5e5e5;
1517}
1518.bs3 label {
1519 display: inline-block;
1520 margin-bottom: 5px;
1521 font-weight: bold;
1522}
1523.bs3 input[type="search"] {
1524 -webkit-box-sizing: border-box;
1525 -moz-box-sizing: border-box;
1526 box-sizing: border-box;
1527}
1528.bs3 input[type="radio"],
1529.bs3 input[type="checkbox"] {
1530 margin: 4px 0 0;
1531 margin-top: 1px \9;
1532 /* IE8-9 */
1533
1534 line-height: normal;
1535}
1536.bs3 input[type="file"] {
1537 display: block;
1538}
1539.bs3 select[multiple],
1540.bs3 select[size] {
1541 height: auto;
1542}
1543.bs3 select optgroup {
1544 font-size: inherit;
1545 font-style: inherit;
1546 font-family: inherit;
1547}
1548.bs3 input[type="file"]:focus,
1549.bs3 input[type="radio"]:focus,
1550.bs3 input[type="checkbox"]:focus {
1551 outline: thin dotted #333;
1552 outline: 5px auto -webkit-focus-ring-color;
1553 outline-offset: -2px;
1554}
1555.bs3 input[type="number"]::-webkit-outer-spin-button,
1556.bs3 input[type="number"]::-webkit-inner-spin-button {
1557 height: auto;
1558}
1559.bs3 output {
1560 display: block;
1561 padding-top: 7px;
1562 font-size: 14px;
1563 line-height: 1.428571429;
1564 color: #555555;
1565 vertical-align: middle;
1566}
1567.bs3 .form-control:-moz-placeholder {
1568 color: #999999;
1569}
1570.bs3 .form-control::-moz-placeholder {
1571 color: #999999;
1572}
1573.bs3 .form-control:-ms-input-placeholder {
1574 color: #999999;
1575}
1576.bs3 .form-control::-webkit-input-placeholder {
1577 color: #999999;
1578}
1579.bs3 .form-control {
1580 display: block;
1581 width: 100%;
1582 height: 34px;
1583 padding: 6px 12px;
1584 font-size: 14px;
1585 line-height: 1.428571429;
1586 color: #555555;
1587 vertical-align: middle;
1588 background-color: #ffffff;
1589 background-image: none;
1590 border: 1px solid #cccccc;
1591 border-radius: 4px;
1592 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1593 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1594 -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
1595 transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
1596}
1597.bs3 .form-control:focus {
1598 border-color: #66afe9;
1599 outline: 0;
1600 -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
1601 box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
1602}
1603.bs3 .form-control[disabled],
1604.bs3 .form-control[readonly],
1605fieldset[disabled] .bs3 .form-control {
1606 cursor: not-allowed;
1607 background-color: #eeeeee;
1608}
1609textarea.bs3 .form-control {
1610 height: auto;
1611}
1612.bs3 .form-group {
1613 margin-bottom: 15px;
1614}
1615.bs3 .radio,
1616.bs3 .checkbox {
1617 display: block;
1618 min-height: 20px;
1619 margin-top: 10px;
1620 margin-bottom: 10px;
1621 padding-left: 20px;
1622 vertical-align: middle;
1623}
1624.bs3 .radio label,
1625.bs3 .checkbox label {
1626 display: inline;
1627 margin-bottom: 0;
1628 font-weight: normal;
1629 cursor: pointer;
1630}
1631.bs3 .radio input[type="radio"],
1632.bs3 .radio-inline input[type="radio"],
1633.bs3 .checkbox input[type="checkbox"],
1634.bs3 .checkbox-inline input[type="checkbox"] {
1635 float: left;
1636 margin-left: -20px;
1637}
1638.bs3 .radio + .radio,
1639.bs3 .checkbox + .checkbox {
1640 margin-top: -5px;
1641}
1642.bs3 .radio-inline,
1643.bs3 .checkbox-inline {
1644 display: inline-block;
1645 padding-left: 20px;
1646 margin-bottom: 0;
1647 vertical-align: middle;
1648 font-weight: normal;
1649 cursor: pointer;
1650}
1651.bs3 .radio-inline + .radio-inline,
1652.bs3 .checkbox-inline + .checkbox-inline {
1653 margin-top: 0;
1654 margin-left: 10px;
1655}
1656.bs3 input[type="radio"][disabled],
1657.bs3 input[type="checkbox"][disabled],
1658.bs3 .radio[disabled],
1659.bs3 .radio-inline[disabled],
1660.bs3 .checkbox[disabled],
1661.bs3 .checkbox-inline[disabled],
1662fieldset[disabled] .bs3 input[type="radio"],
1663fieldset[disabled] .bs3 input[type="checkbox"],
1664fieldset[disabled] .bs3 .radio,
1665fieldset[disabled] .bs3 .radio-inline,
1666fieldset[disabled] .bs3 .checkbox,
1667fieldset[disabled] .bs3 .checkbox-inline {
1668 cursor: not-allowed;
1669}
1670.bs3 .input-sm {
1671 height: 30px;
1672 padding: 5px 10px;
1673 font-size: 12px;
1674 line-height: 1.5;
1675 border-radius: 3px;
1676}
1677select.bs3 .input-sm {
1678 height: 30px;
1679 line-height: 30px;
1680}
1681textarea.bs3 .input-sm {
1682 height: auto;
1683}
1684.bs3 .input-lg {
1685 height: 45px;
1686 padding: 10px 16px;
1687 font-size: 18px;
1688 line-height: 1.33;
1689 border-radius: 6px;
1690}
1691select.bs3 .input-lg {
1692 height: 45px;
1693 line-height: 45px;
1694}
1695textarea.bs3 .input-lg {
1696 height: auto;
1697}
1698.bs3 .has-warning .help-block,
1699.bs3 .has-warning .control-label {
1700 color: #c09853;
1701}
1702.bs3 .has-warning .form-control {
1703 border-color: #c09853;
1704 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1705 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1706}
1707.bs3 .has-warning .form-control:focus {
1708 border-color: #a47e3c;
1709 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
1710 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
1711}
1712.bs3 .has-warning .input-group-addon {
1713 color: #c09853;
1714 border-color: #c09853;
1715 background-color: #fcf8e3;
1716}
1717.bs3 .has-error .help-block,
1718.bs3 .has-error .control-label {
1719 color: #b94a48;
1720}
1721.bs3 .has-error .form-control {
1722 border-color: #b94a48;
1723 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1724 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1725}
1726.bs3 .has-error .form-control:focus {
1727 border-color: #953b39;
1728 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
1729 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
1730}
1731.bs3 .has-error .input-group-addon {
1732 color: #b94a48;
1733 border-color: #b94a48;
1734 background-color: #f2dede;
1735}
1736.bs3 .has-success .help-block,
1737.bs3 .has-success .control-label {
1738 color: #468847;
1739}
1740.bs3 .has-success .form-control {
1741 border-color: #468847;
1742 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1743 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1744}
1745.bs3 .has-success .form-control:focus {
1746 border-color: #356635;
1747 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
1748 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
1749}
1750.bs3 .has-success .input-group-addon {
1751 color: #468847;
1752 border-color: #468847;
1753 background-color: #dff0d8;
1754}
1755.bs3 .form-control-static {
1756 margin-bottom: 0;
1757 padding-top: 7px;
1758}
1759.bs3 .help-block {
1760 display: block;
1761 margin-top: 5px;
1762 margin-bottom: 10px;
1763 color: #737373;
1764}
1765@media (min-width: 768px) {
1766 .bs3 .form-inline .form-group {
1767 display: inline-block;
1768 margin-bottom: 0;
1769 vertical-align: middle;
1770 }
1771 .bs3 .form-inline .form-control {
1772 display: inline-block;
1773 }
1774 .bs3 .form-inline .radio,
1775 .bs3 .form-inline .checkbox {
1776 display: inline-block;
1777 margin-top: 0;
1778 margin-bottom: 0;
1779 padding-left: 0;
1780 }
1781 .bs3 .form-inline .radio input[type="radio"],
1782 .bs3 .form-inline .checkbox input[type="checkbox"] {
1783 float: none;
1784 margin-left: 0;
1785 }
1786}
1787.bs3 .form-horizontal .control-label,
1788.bs3 .form-horizontal .radio,
1789.bs3 .form-horizontal .checkbox,
1790.bs3 .form-horizontal .radio-inline,
1791.bs3 .form-horizontal .checkbox-inline {
1792 margin-top: 0;
1793 margin-bottom: 0;
1794 padding-top: 7px;
1795}
1796.bs3 .form-horizontal .form-group {
1797 margin-left: -15px;
1798 margin-right: -15px;
1799}
1800.bs3 .form-horizontal .form-group:before,
1801.bs3 .form-horizontal .form-group:after {
1802 content: " ";
1803 /* 1 */
1804
1805 display: table;
1806 /* 2 */
1807
1808}
1809.bs3 .form-horizontal .form-group:after {
1810 clear: both;
1811}
1812.bs3 .form-horizontal .form-group:before,
1813.bs3 .form-horizontal .form-group:after {
1814 content: " ";
1815 /* 1 */
1816
1817 display: table;
1818 /* 2 */
1819
1820}
1821.bs3 .form-horizontal .form-group:after {
1822 clear: both;
1823}
1824@media (min-width: 768px) {
1825 .bs3 .form-horizontal .control-label {
1826 text-align: right;
1827 }
1828}
1829.bs3 .btn {
1830 display: inline-block;
1831 padding: 6px 12px;
1832 margin-bottom: 0;
1833 font-size: 14px;
1834 font-weight: normal;
1835 line-height: 1.428571429;
1836 text-align: center;
1837 vertical-align: middle;
1838 cursor: pointer;
1839 background-image: none;
1840 border: 1px solid transparent;
1841 border-radius: 4px;
1842 white-space: nowrap;
1843 -webkit-user-select: none;
1844 -moz-user-select: none;
1845 -ms-user-select: none;
1846 -o-user-select: none;
1847 user-select: none;
1848}
1849.bs3 .btn:focus {
1850 outline: thin dotted #333;
1851 outline: 5px auto -webkit-focus-ring-color;
1852 outline-offset: -2px;
1853}
1854.bs3 .btn:hover,
1855.bs3 .btn:focus {
1856 color: #333333;
1857 text-decoration: none;
1858}
1859.bs3 .btn:active,
1860.bs3 .btn.active {
1861 outline: 0;
1862 background-image: none;
1863 -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1864 box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
1865}
1866.bs3 .btn.disabled,
1867.bs3 .btn[disabled],
1868fieldset[disabled] .bs3 .btn {
1869 cursor: not-allowed;
1870 pointer-events: none;
1871 opacity: 0.65;
1872 filter: alpha(opacity=65);
1873 -webkit-box-shadow: none;
1874 box-shadow: none;
1875}
1876.bs3 .btn-default {
1877 color: #333333;
1878 background-color: #ffffff;
1879 border-color: #cccccc;
1880}
1881.bs3 .btn-default:hover,
1882.bs3 .btn-default:focus,
1883.bs3 .btn-default:active,
1884.bs3 .btn-default.active,
1885.open .dropdown-toggle.bs3 .btn-default {
1886 color: #333333;
1887 background-color: #ebebeb;
1888 border-color: #adadad;
1889}
1890.bs3 .btn-default:active,
1891.bs3 .btn-default.active,
1892.open .dropdown-toggle.bs3 .btn-default {
1893 background-image: none;
1894}
1895.bs3 .btn-default.disabled,
1896.bs3 .btn-default[disabled],
1897fieldset[disabled] .bs3 .btn-default,
1898.bs3 .btn-default.disabled:hover,
1899.bs3 .btn-default[disabled]:hover,
1900fieldset[disabled] .bs3 .btn-default:hover,
1901.bs3 .btn-default.disabled:focus,
1902.bs3 .btn-default[disabled]:focus,
1903fieldset[disabled] .bs3 .btn-default:focus,
1904.bs3 .btn-default.disabled:active,
1905.bs3 .btn-default[disabled]:active,
1906fieldset[disabled] .bs3 .btn-default:active,
1907.bs3 .btn-default.disabled.active,
1908.bs3 .btn-default[disabled].active,
1909fieldset[disabled] .bs3 .btn-default.active {
1910 background-color: #ffffff;
1911 border-color: #cccccc;
1912}
1913.bs3 .btn-primary {
1914 color: #ffffff;
1915 background-color: #428bca;
1916 border-color: #357ebd;
1917}
1918.bs3 .btn-primary:hover,
1919.bs3 .btn-primary:focus,
1920.bs3 .btn-primary:active,
1921.bs3 .btn-primary.active,
1922.open .dropdown-toggle.bs3 .btn-primary {
1923 color: #ffffff;
1924 background-color: #3276b1;
1925 border-color: #285e8e;
1926}
1927.bs3 .btn-primary:active,
1928.bs3 .btn-primary.active,
1929.open .dropdown-toggle.bs3 .btn-primary {
1930 background-image: none;
1931}
1932.bs3 .btn-primary.disabled,
1933.bs3 .btn-primary[disabled],
1934fieldset[disabled] .bs3 .btn-primary,
1935.bs3 .btn-primary.disabled:hover,
1936.bs3 .btn-primary[disabled]:hover,
1937fieldset[disabled] .bs3 .btn-primary:hover,
1938.bs3 .btn-primary.disabled:focus,
1939.bs3 .btn-primary[disabled]:focus,
1940fieldset[disabled] .bs3 .btn-primary:focus,
1941.bs3 .btn-primary.disabled:active,
1942.bs3 .btn-primary[disabled]:active,
1943fieldset[disabled] .bs3 .btn-primary:active,
1944.bs3 .btn-primary.disabled.active,
1945.bs3 .btn-primary[disabled].active,
1946fieldset[disabled] .bs3 .btn-primary.active {
1947 background-color: #428bca;
1948 border-color: #357ebd;
1949}
1950.bs3 .btn-warning {
1951 color: #ffffff;
1952 background-color: #f0ad4e;
1953 border-color: #eea236;
1954}
1955.bs3 .btn-warning:hover,
1956.bs3 .btn-warning:focus,
1957.bs3 .btn-warning:active,
1958.bs3 .btn-warning.active,
1959.open .dropdown-toggle.bs3 .btn-warning {
1960 color: #ffffff;
1961 background-color: #ed9c28;
1962 border-color: #d58512;
1963}
1964.bs3 .btn-warning:active,
1965.bs3 .btn-warning.active,
1966.open .dropdown-toggle.bs3 .btn-warning {
1967 background-image: none;
1968}
1969.bs3 .btn-warning.disabled,
1970.bs3 .btn-warning[disabled],
1971fieldset[disabled] .bs3 .btn-warning,
1972.bs3 .btn-warning.disabled:hover,
1973.bs3 .btn-warning[disabled]:hover,
1974fieldset[disabled] .bs3 .btn-warning:hover,
1975.bs3 .btn-warning.disabled:focus,
1976.bs3 .btn-warning[disabled]:focus,
1977fieldset[disabled] .bs3 .btn-warning:focus,
1978.bs3 .btn-warning.disabled:active,
1979.bs3 .btn-warning[disabled]:active,
1980fieldset[disabled] .bs3 .btn-warning:active,
1981.bs3 .btn-warning.disabled.active,
1982.bs3 .btn-warning[disabled].active,
1983fieldset[disabled] .bs3 .btn-warning.active {
1984 background-color: #f0ad4e;
1985 border-color: #eea236;
1986}
1987.bs3 .btn-danger {
1988 color: #ffffff;
1989 background-color: #d9534f;
1990 border-color: #d43f3a;
1991}
1992.bs3 .btn-danger:hover,
1993.bs3 .btn-danger:focus,
1994.bs3 .btn-danger:active,
1995.bs3 .btn-danger.active,
1996.open .dropdown-toggle.bs3 .btn-danger {
1997 color: #ffffff;
1998 background-color: #d2322d;
1999 border-color: #ac2925;
2000}
2001.bs3 .btn-danger:active,
2002.bs3 .btn-danger.active,
2003.open .dropdown-toggle.bs3 .btn-danger {
2004 background-image: none;
2005}
2006.bs3 .btn-danger.disabled,
2007.bs3 .btn-danger[disabled],
2008fieldset[disabled] .bs3 .btn-danger,
2009.bs3 .btn-danger.disabled:hover,
2010.bs3 .btn-danger[disabled]:hover,
2011fieldset[disabled] .bs3 .btn-danger:hover,
2012.bs3 .btn-danger.disabled:focus,
2013.bs3 .btn-danger[disabled]:focus,
2014fieldset[disabled] .bs3 .btn-danger:focus,
2015.bs3 .btn-danger.disabled:active,
2016.bs3 .btn-danger[disabled]:active,
2017fieldset[disabled] .bs3 .btn-danger:active,
2018.bs3 .btn-danger.disabled.active,
2019.bs3 .btn-danger[disabled].active,
2020fieldset[disabled] .bs3 .btn-danger.active {
2021 background-color: #d9534f;
2022 border-color: #d43f3a;
2023}
2024.bs3 .btn-success {
2025 color: #ffffff;
2026 background-color: #5cb85c;
2027 border-color: #4cae4c;
2028}
2029.bs3 .btn-success:hover,
2030.bs3 .btn-success:focus,
2031.bs3 .btn-success:active,
2032.bs3 .btn-success.active,
2033.open .dropdown-toggle.bs3 .btn-success {
2034 color: #ffffff;
2035 background-color: #47a447;
2036 border-color: #398439;
2037}
2038.bs3 .btn-success:active,
2039.bs3 .btn-success.active,
2040.open .dropdown-toggle.bs3 .btn-success {
2041 background-image: none;
2042}
2043.bs3 .btn-success.disabled,
2044.bs3 .btn-success[disabled],
2045fieldset[disabled] .bs3 .btn-success,
2046.bs3 .btn-success.disabled:hover,
2047.bs3 .btn-success[disabled]:hover,
2048fieldset[disabled] .bs3 .btn-success:hover,
2049.bs3 .btn-success.disabled:focus,
2050.bs3 .btn-success[disabled]:focus,
2051fieldset[disabled] .bs3 .btn-success:focus,
2052.bs3 .btn-success.disabled:active,
2053.bs3 .btn-success[disabled]:active,
2054fieldset[disabled] .bs3 .btn-success:active,
2055.bs3 .btn-success.disabled.active,
2056.bs3 .btn-success[disabled].active,
2057fieldset[disabled] .bs3 .btn-success.active {
2058 background-color: #5cb85c;
2059 border-color: #4cae4c;
2060}
2061.bs3 .btn-info {
2062 color: #ffffff;
2063 background-color: #5bc0de;
2064 border-color: #46b8da;
2065}
2066.bs3 .btn-info:hover,
2067.bs3 .btn-info:focus,
2068.bs3 .btn-info:active,
2069.bs3 .btn-info.active,
2070.open .dropdown-toggle.bs3 .btn-info {
2071 color: #ffffff;
2072 background-color: #39b3d7;
2073 border-color: #269abc;
2074}
2075.bs3 .btn-info:active,
2076.bs3 .btn-info.active,
2077.open .dropdown-toggle.bs3 .btn-info {
2078 background-image: none;
2079}
2080.bs3 .btn-info.disabled,
2081.bs3 .btn-info[disabled],
2082fieldset[disabled] .bs3 .btn-info,
2083.bs3 .btn-info.disabled:hover,
2084.bs3 .btn-info[disabled]:hover,
2085fieldset[disabled] .bs3 .btn-info:hover,
2086.bs3 .btn-info.disabled:focus,
2087.bs3 .btn-info[disabled]:focus,
2088fieldset[disabled] .bs3 .btn-info:focus,
2089.bs3 .btn-info.disabled:active,
2090.bs3 .btn-info[disabled]:active,
2091fieldset[disabled] .bs3 .btn-info:active,
2092.bs3 .btn-info.disabled.active,
2093.bs3 .btn-info[disabled].active,
2094fieldset[disabled] .bs3 .btn-info.active {
2095 background-color: #5bc0de;
2096 border-color: #46b8da;
2097}
2098.bs3 .btn-link {
2099 color: #428bca;
2100 font-weight: normal;
2101 cursor: pointer;
2102 border-radius: 0;
2103}
2104.bs3 .btn-link,
2105.bs3 .btn-link:active,
2106.bs3 .btn-link[disabled],
2107fieldset[disabled] .bs3 .btn-link {
2108 background-color: transparent;
2109 -webkit-box-shadow: none;
2110 box-shadow: none;
2111}
2112.bs3 .btn-link,
2113.bs3 .btn-link:hover,
2114.bs3 .btn-link:focus,
2115.bs3 .btn-link:active {
2116 border-color: transparent;
2117}
2118.bs3 .btn-link:hover,
2119.bs3 .btn-link:focus {
2120 color: #2a6496;
2121 text-decoration: underline;
2122 background-color: transparent;
2123}
2124.bs3 .btn-link[disabled]:hover,
2125fieldset[disabled] .bs3 .btn-link:hover,
2126.bs3 .btn-link[disabled]:focus,
2127fieldset[disabled] .bs3 .btn-link:focus {
2128 color: #999999;
2129 text-decoration: none;
2130}
2131.bs3 .btn-lg {
2132 padding: 10px 16px;
2133 font-size: 18px;
2134 line-height: 1.33;
2135 border-radius: 6px;
2136}
2137.bs3 .btn-sm,
2138.bs3 .btn-xs {
2139 padding: 5px 10px;
2140 font-size: 12px;
2141 line-height: 1.5;
2142 border-radius: 3px;
2143}
2144.bs3 .btn-xs {
2145 padding: 1px 5px;
2146}
2147.bs3 .btn-block {
2148 display: block;
2149 width: 100%;
2150 padding-left: 0;
2151 padding-right: 0;
2152}
2153.bs3 .btn-block + .btn-block {
2154 margin-top: 5px;
2155}
2156.bs3 input[type="submit"].btn-block,
2157.bs3 input[type="reset"].btn-block,
2158.bs3 input[type="button"].btn-block {
2159 width: 100%;
2160}
2161.bs3 .fade {
2162 opacity: 0;
2163 -webkit-transition: opacity 0.15s linear;
2164 transition: opacity 0.15s linear;
2165}
2166.bs3 .fade.in {
2167 opacity: 1;
2168}
2169.bs3 .collapse {
2170 display: none;
2171}
2172.bs3 .collapse.in {
2173 display: block;
2174}
2175.bs3 .collapsing {
2176 position: relative;
2177 height: 0;
2178 overflow: hidden;
2179 -webkit-transition: height 0.35s ease;
2180 transition: height 0.35s ease;
2181}
2182@font-face {
2183 font-family: 'Glyphicons Halflings';
2184 src: url('../fonts/glyphicons-halflings-regular.eot');
2185 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');
2186}
2187.bs3 .glyphicon {
2188 position: relative;
2189 top: 1px;
2190 display: inline-block;
2191 font-family: 'Glyphicons Halflings';
2192 font-style: normal;
2193 font-weight: normal;
2194 line-height: 1;
2195 -webkit-font-smoothing: antialiased;
2196}
2197.bs3 .glyphicon:empty {
2198 width: 1em;
2199}
2200.bs3 .glyphicon-asterisk:before {
2201 content: "\2a";
2202}
2203.bs3 .glyphicon-plus:before {
2204 content: "\2b";
2205}
2206.bs3 .glyphicon-euro:before {
2207 content: "\20ac";
2208}
2209.bs3 .glyphicon-minus:before {
2210 content: "\2212";
2211}
2212.bs3 .glyphicon-cloud:before {
2213 content: "\2601";
2214}
2215.bs3 .glyphicon-envelope:before {
2216 content: "\2709";
2217}
2218.bs3 .glyphicon-pencil:before {
2219 content: "\270f";
2220}
2221.bs3 .glyphicon-glass:before {
2222 content: "\e001";
2223}
2224.bs3 .glyphicon-music:before {
2225 content: "\e002";
2226}
2227.bs3 .glyphicon-search:before {
2228 content: "\e003";
2229}
2230.bs3 .glyphicon-heart:before {
2231 content: "\e005";
2232}
2233.bs3 .glyphicon-star:before {
2234 content: "\e006";
2235}
2236.bs3 .glyphicon-star-empty:before {
2237 content: "\e007";
2238}
2239.bs3 .glyphicon-user:before {
2240 content: "\e008";
2241}
2242.bs3 .glyphicon-film:before {
2243 content: "\e009";
2244}
2245.bs3 .glyphicon-th-large:before {
2246 content: "\e010";
2247}
2248.bs3 .glyphicon-th:before {
2249 content: "\e011";
2250}
2251.bs3 .glyphicon-th-list:before {
2252 content: "\e012";
2253}
2254.bs3 .glyphicon-ok:before {
2255 content: "\e013";
2256}
2257.bs3 .glyphicon-remove:before {
2258 content: "\e014";
2259}
2260.bs3 .glyphicon-zoom-in:before {
2261 content: "\e015";
2262}
2263.bs3 .glyphicon-zoom-out:before {
2264 content: "\e016";
2265}
2266.bs3 .glyphicon-off:before {
2267 content: "\e017";
2268}
2269.bs3 .glyphicon-signal:before {
2270 content: "\e018";
2271}
2272.bs3 .glyphicon-cog:before {
2273 content: "\e019";
2274}
2275.bs3 .glyphicon-trash:before {
2276 content: "\e020";
2277}
2278.bs3 .glyphicon-home:before {
2279 content: "\e021";
2280}
2281.bs3 .glyphicon-file:before {
2282 content: "\e022";
2283}
2284.bs3 .glyphicon-time:before {
2285 content: "\e023";
2286}
2287.bs3 .glyphicon-road:before {
2288 content: "\e024";
2289}
2290.bs3 .glyphicon-download-alt:before {
2291 content: "\e025";
2292}
2293.bs3 .glyphicon-download:before {
2294 content: "\e026";
2295}
2296.bs3 .glyphicon-upload:before {
2297 content: "\e027";
2298}
2299.bs3 .glyphicon-inbox:before {
2300 content: "\e028";
2301}
2302.bs3 .glyphicon-play-circle:before {
2303 content: "\e029";
2304}
2305.bs3 .glyphicon-repeat:before {
2306 content: "\e030";
2307}
2308.bs3 .glyphicon-refresh:before {
2309 content: "\e031";
2310}
2311.bs3 .glyphicon-list-alt:before {
2312 content: "\e032";
2313}
2314.bs3 .glyphicon-flag:before {
2315 content: "\e034";
2316}
2317.bs3 .glyphicon-headphones:before {
2318 content: "\e035";
2319}
2320.bs3 .glyphicon-volume-off:before {
2321 content: "\e036";
2322}
2323.bs3 .glyphicon-volume-down:before {
2324 content: "\e037";
2325}
2326.bs3 .glyphicon-volume-up:before {
2327 content: "\e038";
2328}
2329.bs3 .glyphicon-qrcode:before {
2330 content: "\e039";
2331}
2332.bs3 .glyphicon-barcode:before {
2333 content: "\e040";
2334}
2335.bs3 .glyphicon-tag:before {
2336 content: "\e041";
2337}
2338.bs3 .glyphicon-tags:before {
2339 content: "\e042";
2340}
2341.bs3 .glyphicon-book:before {
2342 content: "\e043";
2343}
2344.bs3 .glyphicon-print:before {
2345 content: "\e045";
2346}
2347.bs3 .glyphicon-font:before {
2348 content: "\e047";
2349}
2350.bs3 .glyphicon-bold:before {
2351 content: "\e048";
2352}
2353.bs3 .glyphicon-italic:before {
2354 content: "\e049";
2355}
2356.bs3 .glyphicon-text-height:before {
2357 content: "\e050";
2358}
2359.bs3 .glyphicon-text-width:before {
2360 content: "\e051";
2361}
2362.bs3 .glyphicon-align-left:before {
2363 content: "\e052";
2364}
2365.bs3 .glyphicon-align-center:before {
2366 content: "\e053";
2367}
2368.bs3 .glyphicon-align-right:before {
2369 content: "\e054";
2370}
2371.bs3 .glyphicon-align-justify:before {
2372 content: "\e055";
2373}
2374.bs3 .glyphicon-list:before {
2375 content: "\e056";
2376}
2377.bs3 .glyphicon-indent-left:before {
2378 content: "\e057";
2379}
2380.bs3 .glyphicon-indent-right:before {
2381 content: "\e058";
2382}
2383.bs3 .glyphicon-facetime-video:before {
2384 content: "\e059";
2385}
2386.bs3 .glyphicon-picture:before {
2387 content: "\e060";
2388}
2389.bs3 .glyphicon-map-marker:before {
2390 content: "\e062";
2391}
2392.bs3 .glyphicon-adjust:before {
2393 content: "\e063";
2394}
2395.bs3 .glyphicon-tint:before {
2396 content: "\e064";
2397}
2398.bs3 .glyphicon-edit:before {
2399 content: "\e065";
2400}
2401.bs3 .glyphicon-share:before {
2402 content: "\e066";
2403}
2404.bs3 .glyphicon-check:before {
2405 content: "\e067";
2406}
2407.bs3 .glyphicon-move:before {
2408 content: "\e068";
2409}
2410.bs3 .glyphicon-step-backward:before {
2411 content: "\e069";
2412}
2413.bs3 .glyphicon-fast-backward:before {
2414 content: "\e070";
2415}
2416.bs3 .glyphicon-backward:before {
2417 content: "\e071";
2418}
2419.bs3 .glyphicon-play:before {
2420 content: "\e072";
2421}
2422.bs3 .glyphicon-pause:before {
2423 content: "\e073";
2424}
2425.bs3 .glyphicon-stop:before {
2426 content: "\e074";
2427}
2428.bs3 .glyphicon-forward:before {
2429 content: "\e075";
2430}
2431.bs3 .glyphicon-fast-forward:before {
2432 content: "\e076";
2433}
2434.bs3 .glyphicon-step-forward:before {
2435 content: "\e077";
2436}
2437.bs3 .glyphicon-eject:before {
2438 content: "\e078";
2439}
2440.bs3 .glyphicon-chevron-left:before {
2441 content: "\e079";
2442}
2443.bs3 .glyphicon-chevron-right:before {
2444 content: "\e080";
2445}
2446.bs3 .glyphicon-plus-sign:before {
2447 content: "\e081";
2448}
2449.bs3 .glyphicon-minus-sign:before {
2450 content: "\e082";
2451}
2452.bs3 .glyphicon-remove-sign:before {
2453 content: "\e083";
2454}
2455.bs3 .glyphicon-ok-sign:before {
2456 content: "\e084";
2457}
2458.bs3 .glyphicon-question-sign:before {
2459 content: "\e085";
2460}
2461.bs3 .glyphicon-info-sign:before {
2462 content: "\e086";
2463}
2464.bs3 .glyphicon-screenshot:before {
2465 content: "\e087";
2466}
2467.bs3 .glyphicon-remove-circle:before {
2468 content: "\e088";
2469}
2470.bs3 .glyphicon-ok-circle:before {
2471 content: "\e089";
2472}
2473.bs3 .glyphicon-ban-circle:before {
2474 content: "\e090";
2475}
2476.bs3 .glyphicon-arrow-left:before {
2477 content: "\e091";
2478}
2479.bs3 .glyphicon-arrow-right:before {
2480 content: "\e092";
2481}
2482.bs3 .glyphicon-arrow-up:before {
2483 content: "\e093";
2484}
2485.bs3 .glyphicon-arrow-down:before {
2486 content: "\e094";
2487}
2488.bs3 .glyphicon-share-alt:before {
2489 content: "\e095";
2490}
2491.bs3 .glyphicon-resize-full:before {
2492 content: "\e096";
2493}
2494.bs3 .glyphicon-resize-small:before {
2495 content: "\e097";
2496}
2497.bs3 .glyphicon-exclamation-sign:before {
2498 content: "\e101";
2499}
2500.bs3 .glyphicon-gift:before {
2501 content: "\e102";
2502}
2503.bs3 .glyphicon-leaf:before {
2504 content: "\e103";
2505}
2506.bs3 .glyphicon-eye-open:before {
2507 content: "\e105";
2508}
2509.bs3 .glyphicon-eye-close:before {
2510 content: "\e106";
2511}
2512.bs3 .glyphicon-warning-sign:before {
2513 content: "\e107";
2514}
2515.bs3 .glyphicon-plane:before {
2516 content: "\e108";
2517}
2518.bs3 .glyphicon-random:before {
2519 content: "\e110";
2520}
2521.bs3 .glyphicon-comment:before {
2522 content: "\e111";
2523}
2524.bs3 .glyphicon-magnet:before {
2525 content: "\e112";
2526}
2527.bs3 .glyphicon-chevron-up:before {
2528 content: "\e113";
2529}
2530.bs3 .glyphicon-chevron-down:before {
2531 content: "\e114";
2532}
2533.bs3 .glyphicon-retweet:before {
2534 content: "\e115";
2535}
2536.bs3 .glyphicon-shopping-cart:before {
2537 content: "\e116";
2538}
2539.bs3 .glyphicon-folder-close:before {
2540 content: "\e117";
2541}
2542.bs3 .glyphicon-folder-open:before {
2543 content: "\e118";
2544}
2545.bs3 .glyphicon-resize-vertical:before {
2546 content: "\e119";
2547}
2548.bs3 .glyphicon-resize-horizontal:before {
2549 content: "\e120";
2550}
2551.bs3 .glyphicon-hdd:before {
2552 content: "\e121";
2553}
2554.bs3 .glyphicon-bullhorn:before {
2555 content: "\e122";
2556}
2557.bs3 .glyphicon-certificate:before {
2558 content: "\e124";
2559}
2560.bs3 .glyphicon-thumbs-up:before {
2561 content: "\e125";
2562}
2563.bs3 .glyphicon-thumbs-down:before {
2564 content: "\e126";
2565}
2566.bs3 .glyphicon-hand-right:before {
2567 content: "\e127";
2568}
2569.bs3 .glyphicon-hand-left:before {
2570 content: "\e128";
2571}
2572.bs3 .glyphicon-hand-up:before {
2573 content: "\e129";
2574}
2575.bs3 .glyphicon-hand-down:before {
2576 content: "\e130";
2577}
2578.bs3 .glyphicon-circle-arrow-right:before {
2579 content: "\e131";
2580}
2581.bs3 .glyphicon-circle-arrow-left:before {
2582 content: "\e132";
2583}
2584.bs3 .glyphicon-circle-arrow-up:before {
2585 content: "\e133";
2586}
2587.bs3 .glyphicon-circle-arrow-down:before {
2588 content: "\e134";
2589}
2590.bs3 .glyphicon-globe:before {
2591 content: "\e135";
2592}
2593.bs3 .glyphicon-tasks:before {
2594 content: "\e137";
2595}
2596.bs3 .glyphicon-filter:before {
2597 content: "\e138";
2598}
2599.bs3 .glyphicon-fullscreen:before {
2600 content: "\e140";
2601}
2602.bs3 .glyphicon-dashboard:before {
2603 content: "\e141";
2604}
2605.bs3 .glyphicon-heart-empty:before {
2606 content: "\e143";
2607}
2608.bs3 .glyphicon-link:before {
2609 content: "\e144";
2610}
2611.bs3 .glyphicon-phone:before {
2612 content: "\e145";
2613}
2614.bs3 .glyphicon-usd:before {
2615 content: "\e148";
2616}
2617.bs3 .glyphicon-gbp:before {
2618 content: "\e149";
2619}
2620.bs3 .glyphicon-sort:before {
2621 content: "\e150";
2622}
2623.bs3 .glyphicon-sort-by-alphabet:before {
2624 content: "\e151";
2625}
2626.bs3 .glyphicon-sort-by-alphabet-alt:before {
2627 content: "\e152";
2628}
2629.bs3 .glyphicon-sort-by-order:before {
2630 content: "\e153";
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches