promethee 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +53 -50
- data/app/assets/javascripts/promethee-editor.js +8 -0
- data/app/assets/javascripts/promethee.js +0 -59
- data/app/assets/stylesheets/promethee-editor.sass +23 -78
- data/app/assets/stylesheets/promethee-editor/_component.sass +10 -0
- data/app/assets/stylesheets/promethee-editor/_mover.sass +67 -0
- data/app/assets/stylesheets/promethee-editor/_preview.sass +25 -0
- data/app/assets/stylesheets/promethee.sass +1 -2
- data/app/controllers/promethee_controller.rb +8 -0
- data/app/views/promethee/_edit.html.erb +52 -123
- data/app/views/promethee/_show.html.erb +1 -1
- data/app/views/promethee/components/_children.html.erb +4 -0
- data/app/views/promethee/components/_children_edit.html.erb +5 -0
- data/app/views/promethee/components/_column.html.erb +1 -1
- data/app/views/promethee/components/_column_edit.html.erb +35 -33
- data/app/views/promethee/components/_image_edit.html.erb +23 -28
- data/app/views/promethee/components/_page.html.erb +1 -0
- data/app/views/promethee/components/_page_edit.html.erb +10 -0
- data/app/views/promethee/components/_row.html.erb +1 -4
- data/app/views/promethee/components/_row_edit.html.erb +19 -22
- data/app/views/promethee/components/_text_edit.html.erb +16 -20
- data/app/views/promethee/components/_video_edit.html.erb +23 -22
- data/app/views/promethee/partials/_adder.html.erb +64 -0
- data/app/views/promethee/partials/_include_components.html.erb +9 -0
- data/app/views/promethee/partials/_mover.html.erb +98 -0
- data/app/views/promethee/partials/_navbar.html.erb +26 -0
- data/app/views/promethee/partials/_page.html.erb +6 -0
- data/app/views/promethee/partials/_preview.html.erb +12 -0
- data/app/views/promethee/partials/_toolbar_buttons.html.erb +2 -2
- data/app/views/promethee/preview.html.erb +1 -0
- data/config/routes.rb +3 -0
- data/lib/promethee.rb +2 -21
- data/lib/promethee/core_ext/tags.rb +2 -5
- data/lib/promethee/rails/version.rb +1 -1
- metadata +34 -27
- data/app/assets/javascripts/promethee/controller.js +0 -22
- data/app/assets/stylesheets/promethee-editor/_mixins.sass +0 -19
- data/app/assets/stylesheets/promethee-editor/_variables.sass +0 -4
- data/app/views/promethee/components/_index.html.erb +0 -3
- data/app/views/promethee/components/_index_edit.html.erb +0 -7
- data/app/views/promethee/components/_show.html.erb +0 -4
- data/app/views/promethee/components/_show_edit.html.erb +0 -3
- data/lib/promethee/component.rb +0 -28
- data/lib/promethee/component/attribute.rb +0 -42
- data/lib/promethee/component/attribute/boolean.rb +0 -4
- data/lib/promethee/component/attribute/float.rb +0 -3
- data/lib/promethee/component/attribute/integer.rb +0 -3
- data/lib/promethee/component/attribute/string.rb +0 -3
- data/lib/promethee/component/attributes.rb +0 -50
- data/lib/promethee/component/attributes/definer.rb +0 -13
- data/lib/promethee/component/base.rb +0 -68
- data/lib/promethee/component/collection.rb +0 -17
- data/lib/promethee/component/column.rb +0 -8
- data/lib/promethee/component/image.rb +0 -6
- data/lib/promethee/component/row.rb +0 -3
- data/lib/promethee/component/text.rb +0 -5
- data/lib/promethee/component/video.rb +0 -5
- data/lib/promethee/grid.rb +0 -52
- data/vendor/assets/javascripts/angular-drag-and-drop-lists.js +0 -49
@@ -1,16 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
promethee_data = promethee.data
|
4
|
-
promethee_data = promethee_data.to_json unless promethee_data.is_a? String
|
2
|
+
data = data.to_json unless data.is_a? String
|
5
3
|
%>
|
6
4
|
|
7
5
|
<script>
|
8
6
|
var promethee = angular
|
9
|
-
.module('
|
10
|
-
.
|
11
|
-
.value('state', {
|
12
|
-
editing: false
|
13
|
-
})
|
7
|
+
.module('Promethee', ['ui.tinymce', 'ngAnimate'])
|
8
|
+
.value('data', <%= data.html_safe %>)
|
14
9
|
.value('definitions', [])
|
15
10
|
.filter('htmlSafe', ['$sce', function($sce) {
|
16
11
|
return function(val) {
|
@@ -28,111 +23,43 @@ promethee_data = promethee_data.to_json unless promethee_data.is_a? String
|
|
28
23
|
return val[0].toUpperCase() + val.substring(1).toLowerCase();
|
29
24
|
};
|
30
25
|
});
|
31
|
-
</script>
|
32
|
-
|
33
|
-
<div id="<%= promethee_id %>"
|
34
|
-
class="promethee-editor"
|
35
|
-
ng-app="<%= promethee_id %>"
|
36
|
-
ng-controller="PrometheeController as prometheeController"
|
37
|
-
ng-class="{
|
38
|
-
'fullscreen': fullscreen,
|
39
|
-
'promethee-editor--preview': preview,
|
40
|
-
'promethee-editor--preview--mobile': preview && previewMode == 'mobile',
|
41
|
-
'promethee-editor--preview--tablet': preview && previewMode == 'tablet',
|
42
|
-
'promethee-editor--preview--desktop': preview && previewMode == 'desktop'
|
43
|
-
}">
|
44
|
-
|
45
|
-
<% # TODO custom views %>
|
46
|
-
<% Dir['app/views/promethee/components/*'].each do |file| %>
|
47
|
-
<% end %>
|
48
|
-
<% # TODO iterate over files in gem %>
|
49
|
-
<% ['index', 'show', 'row', 'column', 'text', 'image', 'video'].each do |type| %>
|
50
|
-
<%= render partial: "promethee/components/#{type}_edit", locals: { promethee_id: promethee_id } %>
|
51
|
-
<% end %>
|
52
|
-
|
53
|
-
<input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
|
54
26
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
<%= image_tag 'icon-promethee.png', class: 'navbar-brand' %>
|
59
|
-
</div>
|
60
|
-
<div id="navbar">
|
61
|
-
<ul class="nav navbar-nav navbar-right">
|
62
|
-
<li ng-click="enablePreview()" ng-hide="preview"><a><%= fa_icon :eye %></a></li>
|
63
|
-
<li ng-click="previewMode = 'mobile'" ng-class="{ active: previewMode == 'mobile' }" ng-show="preview">
|
64
|
-
<a><%= fa_icon :mobile %></a>
|
65
|
-
</li>
|
66
|
-
<li ng-click="previewMode = 'tablet'" ng-class="{ active: previewMode == 'tablet' }" ng-show="preview"><a>
|
67
|
-
<%= fa_icon :tablet %></a>
|
68
|
-
</li>
|
69
|
-
<li ng-click="previewMode = 'desktop'" ng-class="{ active: previewMode == 'desktop' }" ng-show="preview"><a>
|
70
|
-
<%= fa_icon :desktop %></a>
|
71
|
-
</li>
|
72
|
-
<li ng-click="disablePreview()" ng-show="preview"><a><%= fa_icon 'eye-slash' %></a>
|
73
|
-
</li>
|
74
|
-
<li ng-click="enableFullscreen()" ng-hide="fullscreen"><a><%= fa_icon :expand %></a></li>
|
75
|
-
<li ng-click="disableFullscreen()" ng-show="fullscreen"><a><%= fa_icon :compress %></a></li>
|
76
|
-
</ul>
|
77
|
-
</div>
|
78
|
-
</div>
|
79
|
-
</nav>
|
80
|
-
<div class="promethee-editor__page" ng-class="{ 'container-fluid': fullscreen }">
|
81
|
-
<ng-include src="'promethee/components/index'"></ng-include>
|
82
|
-
</div>
|
83
|
-
|
84
|
-
<span type="button" class="btn btn-default btn-block" ng-click="addComponentTo(data)" style="margin-bottom: 6px">Add component</span>
|
85
|
-
|
86
|
-
<div class="promethee-editor__adder" ng-controller="AdderController">
|
87
|
-
<div class="modal fade in" tabindex="-1" role="dialog" style="display: {{adding ? 'block' : 'none'}}">
|
88
|
-
<div class="modal-dialog modal-lg" role="document">
|
89
|
-
<div class="modal-content">
|
90
|
-
<div class="modal-header">
|
91
|
-
<button type="button" class="close" ng-click="close()"><span aria-hidden="true">×</span></button>
|
92
|
-
<h4 class="modal-title">Select component</h4>
|
93
|
-
</div>
|
94
|
-
<div class="modal-body">
|
95
|
-
<div class="row">
|
96
|
-
<div ng-repeat="definition in definitions"
|
97
|
-
ng-click="pushComponent(definition)"
|
98
|
-
class="col-md-3">
|
99
|
-
<div class="thumbnail">
|
100
|
-
<img ng-src="{{definition.thumb}}" class="img-responsive">
|
101
|
-
<h4>{{definition.name}}</h4>
|
102
|
-
</div>
|
103
|
-
</div>
|
104
|
-
</div>
|
105
|
-
</div>
|
106
|
-
</div>
|
107
|
-
</div>
|
108
|
-
</div>
|
109
|
-
</div>
|
110
|
-
|
111
|
-
<!-- Work in progress -->
|
112
|
-
<!-- <iframe id="iframe"></iframe> !-->
|
113
|
-
</div>
|
114
|
-
|
115
|
-
<script>
|
116
|
-
promethee.controller('PrometheeController', ['data', '$scope', 'definitions', function(data, $scope, definitions) {
|
27
|
+
promethee.controller('PrometheeController', ['data', '$scope', 'definitions', '$http', function(data, $scope, definitions, $http) {
|
28
|
+
|
29
|
+
// Data (TODO use Adder and probably page definition to init)
|
117
30
|
if (data === null || data === '') {
|
118
|
-
data =
|
31
|
+
data = {
|
32
|
+
type: 'page',
|
33
|
+
children: []
|
34
|
+
};
|
119
35
|
}
|
120
36
|
$scope.data = data;
|
37
|
+
// $scope.component = {
|
38
|
+
// children: data
|
39
|
+
// };
|
40
|
+
|
41
|
+
// Preview modes
|
121
42
|
$scope.fullscreen = false;
|
43
|
+
$scope.move = false;
|
122
44
|
$scope.preview = false;
|
123
45
|
$scope.previewMode = 'desktop';
|
124
|
-
$scope.component = {
|
125
|
-
children: data
|
126
|
-
};
|
127
|
-
|
128
|
-
$scope.allowedTypes = definitions.map(function(definition) {
|
129
|
-
return definition.data.type;
|
130
|
-
});
|
131
46
|
|
132
47
|
$scope.enablePreview = function() {
|
133
48
|
this.preview = true;
|
134
|
-
|
135
|
-
|
49
|
+
this.move = false;
|
50
|
+
|
51
|
+
var form = document.createElement('form');
|
52
|
+
document.body.appendChild(form);
|
53
|
+
form.method = 'POST';
|
54
|
+
form.action = 'promethee/preview';
|
55
|
+
form.target = 'preview';
|
56
|
+
var input = document.createElement('input');
|
57
|
+
input.type = 'text';
|
58
|
+
input.value = JSON.stringify(data);
|
59
|
+
input.name = 'data';
|
60
|
+
form.appendChild(input);
|
61
|
+
form.submit();
|
62
|
+
document.body.removeChild(form);
|
136
63
|
}
|
137
64
|
|
138
65
|
$scope.disablePreview = function() {
|
@@ -147,26 +74,28 @@ promethee_data = promethee_data.to_json unless promethee_data.is_a? String
|
|
147
74
|
this.fullscreen = false;
|
148
75
|
}
|
149
76
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
$scope.adding = null;
|
155
|
-
$scope.definitions = definitions;
|
156
|
-
|
157
|
-
$scope.close = function() {
|
158
|
-
$scope.adding = null;
|
159
|
-
};
|
160
|
-
|
161
|
-
$scope.pushComponent = function(definition) {
|
162
|
-
var definition = angular.copy(definition.data);
|
163
|
-
$scope.adding.push(definition);
|
164
|
-
$scope.close();
|
165
|
-
};
|
166
|
-
|
167
|
-
$rootScope.addComponentTo = function(components) {
|
168
|
-
$scope.adding = components;
|
169
|
-
};
|
77
|
+
$scope.remove = function(component, components) {
|
78
|
+
var index = components.indexOf(component);
|
79
|
+
components.splice(index, 1);
|
80
|
+
}
|
170
81
|
|
171
82
|
}]);
|
83
|
+
|
172
84
|
</script>
|
85
|
+
|
86
|
+
<div id="promethee"
|
87
|
+
class="promethee-editor"
|
88
|
+
ng-app="Promethee"
|
89
|
+
ng-controller="PrometheeController as prometheeController"
|
90
|
+
ng-class="{
|
91
|
+
'promethee-editor--fullscreen': fullscreen,
|
92
|
+
'promethee-editor--move': move,
|
93
|
+
'promethee-editor--preview': preview
|
94
|
+
}">
|
95
|
+
<input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
|
96
|
+
<%= render 'promethee/partials/include_components' %>
|
97
|
+
<%= render 'promethee/partials/navbar' %>
|
98
|
+
<%= render 'promethee/partials/preview' %>
|
99
|
+
<%= render 'promethee/partials/mover' %>
|
100
|
+
<%= render 'promethee/partials/page' %>
|
101
|
+
</div>
|
@@ -4,5 +4,5 @@ offset = component[:attributes][:offset]
|
|
4
4
|
children = component[:children]
|
5
5
|
%>
|
6
6
|
<div class="col col-md-<%= size %><%= " col-md-offset-#{offset}" if offset > 0 %> <%= promethee_class_for component %>">
|
7
|
-
<%= render
|
7
|
+
<%= render 'promethee/components/children', children: children %>
|
8
8
|
</div>
|
@@ -1,40 +1,42 @@
|
|
1
1
|
<script type="text/ng-template" id="promethee/components/column">
|
2
|
-
<div
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
<ng-include src="'promethee/components/index'"></ng-include>
|
21
|
-
|
22
|
-
<span type="button" class="btn btn-default btn-block" ng-click="addComponentTo(component.children)" style="margin: 0 6px 6px 6px;width: auto">Add component</span>
|
2
|
+
<div class="col
|
3
|
+
col-md-{{component.attributes.size}}
|
4
|
+
col-md-offset-{{component.attributes.offset}}
|
5
|
+
promethee-editor__component
|
6
|
+
promethee-editor__component--column">
|
7
|
+
<div class="promethee-editor__toolbar">
|
8
|
+
Column
|
9
|
+
<%= render 'promethee/partials/toolbar_buttons' %>
|
10
|
+
</div>
|
11
|
+
<div ng-show="editing" class="promethee-editor__wrapper">
|
12
|
+
<div class="form-group">
|
13
|
+
<label class="label-control">Size</label>
|
14
|
+
<input ng-model="component.attributes.size" class="form-control" type="number"/>
|
15
|
+
</div>
|
16
|
+
<div class="form-group">
|
17
|
+
<label class="label-control">Offset</label>
|
18
|
+
<input ng-model="component.attributes.offset" class="form-control" type="number"/>
|
23
19
|
</div>
|
24
20
|
</div>
|
25
|
-
</div>
|
26
|
-
</script>
|
27
|
-
|
28
|
-
<script>
|
29
|
-
promethee.controller('ColumnController', ['$scope', 'definitions', function($scope, definitions) {
|
30
21
|
|
31
|
-
|
32
|
-
return definition.data.type;
|
33
|
-
});
|
22
|
+
<ng-include src="'promethee/components/children'"></ng-include>
|
34
23
|
|
35
|
-
|
36
|
-
|
37
|
-
|
24
|
+
<span type="button"
|
25
|
+
class="btn btn-default btn-block"
|
26
|
+
ng-click="addComponentTo(component.children)">Add component</span>
|
27
|
+
</div>
|
28
|
+
</script>
|
38
29
|
|
39
|
-
|
30
|
+
<script type="text/ng-template" id="promethee/components/column/move">
|
31
|
+
<div class="col col-md-{{component.attributes.size}} col-md-offset-{{component.attributes.offset}}">
|
32
|
+
<h1>Column</h1>
|
33
|
+
<ng-include src="'promethee/partials/mover'"></ng-include>
|
34
|
+
<div class=" promethee-editor__mover--droppable
|
35
|
+
promethee-editor__mover--droppable--row
|
36
|
+
promethee-editor__mover--droppable--row--inside-column"
|
37
|
+
droppable
|
38
|
+
data-index="{{$index+1}}"
|
39
|
+
data-type="{{type}}"
|
40
|
+
>
|
41
|
+
</div>
|
40
42
|
</script>
|
@@ -1,35 +1,34 @@
|
|
1
1
|
<script type="text/ng-template" id="promethee/components/image">
|
2
|
-
<div ng-controller="ImageController"
|
3
|
-
<div
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<div ng-show="editing" class="promethee-editor__wrapper">
|
12
|
-
<div class="form-group">
|
13
|
-
<label class="label-control">Url</label>
|
14
|
-
<input ng-model="component.attributes.src" class="form-control" type="text"/>
|
15
|
-
</div>
|
16
|
-
<div class="form-group">
|
17
|
-
<label class="label-control">Alt</label>
|
18
|
-
<input ng-model="component.attributes.alt" class="form-control" type="text"/>
|
19
|
-
</div>
|
20
|
-
</div>
|
21
|
-
<div ng-show="component.attributes.src">
|
22
|
-
<img ng-click="edit()" ng-src="{{component.attributes.src}}" class="img-responsive">
|
2
|
+
<div ng-controller="ImageController" class="promethee-editor__component promethee-editor__component--image">
|
3
|
+
<div class="promethee-editor__toolbar">
|
4
|
+
Image
|
5
|
+
<%= render 'promethee/partials/toolbar_buttons' %>
|
6
|
+
</div>
|
7
|
+
<div ng-show="editing" class="promethee-editor__wrapper">
|
8
|
+
<div class="form-group">
|
9
|
+
<label class="label-control">Url</label>
|
10
|
+
<input ng-model="component.attributes.src" class="form-control" type="text"/>
|
23
11
|
</div>
|
24
|
-
<div
|
25
|
-
<
|
12
|
+
<div class="form-group">
|
13
|
+
<label class="label-control">Alt</label>
|
14
|
+
<input ng-model="component.attributes.alt" class="form-control" type="text"/>
|
26
15
|
</div>
|
27
16
|
</div>
|
17
|
+
<div ng-show="component.attributes.src">
|
18
|
+
<img ng-click="edit()" ng-src="{{component.attributes.src}}" class="img-responsive">
|
19
|
+
</div>
|
20
|
+
<div ng-hide="component.attributes.src">
|
21
|
+
<p ng-hide="editing" ng-click="edit()" class="text-center">Click to set the image</p>
|
22
|
+
</div>
|
28
23
|
</div>
|
29
24
|
</script>
|
30
25
|
|
26
|
+
<script type="text/ng-template" id="promethee/components/image/move">
|
27
|
+
<img ng-src="{{component.attributes.src}}" class="img-responsive">
|
28
|
+
</script>
|
29
|
+
|
31
30
|
<script>
|
32
|
-
angular.injector(['ng', '
|
31
|
+
angular.injector(['ng', 'Promethee']).get('definitions').push({
|
33
32
|
name: 'Image',
|
34
33
|
thumb: 'http://via.placeholder.com/300x200',
|
35
34
|
data: {
|
@@ -52,9 +51,5 @@
|
|
52
51
|
this.editing = false;
|
53
52
|
};
|
54
53
|
|
55
|
-
$scope.remove = function() {
|
56
|
-
this.components.splice(this.components.indexOf(this.component), 1);
|
57
|
-
};
|
58
|
-
|
59
54
|
}]);
|
60
55
|
</script>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'promethee/components/children', children: page[:children] %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<script type="text/ng-template" id="promethee/components/page">
|
2
|
+
<div ng-init="component = data"
|
3
|
+
class="promethee-editor__component promethee-editor__component--page">
|
4
|
+
<ng-include src="'promethee/components/children'"></ng-include>
|
5
|
+
</div>
|
6
|
+
</script>
|
7
|
+
|
8
|
+
<script type="text/ng-template" id="promethee/components/page/move">
|
9
|
+
<ng-include src="'promethee/partials/mover'"></ng-include>
|
10
|
+
</script>
|
@@ -1,6 +1,3 @@
|
|
1
|
-
<%
|
2
|
-
children = component[:children]
|
3
|
-
%>
|
4
1
|
<div class="row <%= promethee_class_for component %>">
|
5
|
-
<%= render
|
2
|
+
<%= render 'promethee/components/children', children: component[:children] %>
|
6
3
|
</div>
|
@@ -1,26 +1,27 @@
|
|
1
1
|
<script type="text/ng-template" id="promethee/components/row">
|
2
|
-
<div
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<%= render 'promethee/partials/toolbar_buttons' %>
|
8
|
-
</div>
|
9
|
-
<div ng-show="editing" class="promethee-editor__wrapper">
|
10
|
-
Nothing to edit (yet...)
|
11
|
-
</div>
|
12
|
-
|
13
|
-
<ng-include src="'promethee/components/index'"></ng-include>
|
14
|
-
|
15
|
-
<div class="clearfix"></div>
|
16
|
-
<span class="btn btn-default btn-block" ng-click="addColumn()" style="margin: 0 6px 6px 6px;width: auto">Add column</span>
|
17
|
-
</div>
|
2
|
+
<div ng-controller="RowController"
|
3
|
+
class="row promethee-editor__component promethee-editor__component--row">
|
4
|
+
<div class="promethee-editor__toolbar">
|
5
|
+
Row
|
6
|
+
<%= render 'promethee/partials/toolbar_buttons' %>
|
18
7
|
</div>
|
8
|
+
<div ng-show="editing" class="promethee-editor__wrapper">
|
9
|
+
</div>
|
10
|
+
<ng-include src="'promethee/components/children'"></ng-include>
|
11
|
+
<div class="clearfix"></div>
|
12
|
+
<span class="btn btn-default btn-block" ng-click="addColumn()" style="margin: 0 6px 6px 6px;width: auto">Add column</span>
|
13
|
+
</div>
|
14
|
+
</script>
|
15
|
+
|
16
|
+
<script type="text/ng-template" id="promethee/components/row/move">
|
17
|
+
<h1>Row</h1>
|
18
|
+
<div class="row">
|
19
|
+
<ng-include src="'promethee/partials/mover'"></ng-include>
|
19
20
|
</div>
|
20
21
|
</script>
|
21
22
|
|
22
23
|
<script>
|
23
|
-
angular.injector(['ng', '
|
24
|
+
angular.injector(['ng', 'Promethee']).get('definitions').push({
|
24
25
|
name: 'Row',
|
25
26
|
thumb: 'http://via.placeholder.com/300x200',
|
26
27
|
data: {
|
@@ -38,16 +39,12 @@
|
|
38
39
|
this.component.children.push({
|
39
40
|
type: 'column',
|
40
41
|
attributes: {
|
41
|
-
size:
|
42
|
+
size: 4,
|
42
43
|
offset: 0
|
43
44
|
},
|
44
45
|
children: []
|
45
46
|
})
|
46
47
|
}
|
47
48
|
|
48
|
-
$scope.remove = function() {
|
49
|
-
this.components.splice(this.components.indexOf(this.component), 1);
|
50
|
-
};
|
51
|
-
|
52
49
|
}]);
|
53
50
|
</script>
|