batman-rails 0.0.9 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +22 -0
- data/README.md +43 -39
- data/Rakefile +2 -9
- data/batman-rails.gemspec +20 -21
- data/lib/batman-rails.rb +8 -1
- data/lib/batman-rails/version.rb +6 -0
- data/lib/generators/batman/app_generator.rb +117 -0
- data/lib/generators/batman/controller_generator.rb +8 -17
- data/lib/generators/batman/html_generator.rb +42 -0
- data/lib/generators/batman/model_generator.rb +2 -2
- data/lib/generators/batman/scaffold_generator.rb +14 -4
- data/lib/generators/batman/view_generator.rb +18 -0
- data/lib/generators/{batman/common.rb → common.rb} +19 -5
- data/lib/templates/batman/application_controller.coffee +1 -0
- data/lib/templates/batman/batman_app.coffee +20 -0
- data/lib/templates/batman/controller.coffee +7 -0
- data/lib/templates/batman/html/edit.html +2 -0
- data/lib/templates/batman/html/index.html +2 -0
- data/lib/templates/batman/html/main_index.html +259 -0
- data/lib/templates/batman/html/show.html +2 -0
- data/lib/templates/batman/main_controller.coffee +8 -0
- data/lib/templates/batman/model.coffee +13 -0
- data/lib/templates/batman/view.coffee +7 -0
- data/lib/templates/rails/controller.rb +7 -0
- data/lib/templates/rails/index.html +0 -0
- data/lib/templates/rails/layout.html +15 -0
- data/test/app_generator_test.rb +111 -0
- data/test/controller_generator_test.rb +41 -15
- data/test/model_generator_test.rb +47 -16
- data/test/test_helper.rb +3 -3
- data/test/view_generator_test.rb +36 -0
- data/vendor/assets/images/batman/bullet.png +0 -0
- data/vendor/assets/images/batman/content-bg-fade.png +0 -0
- data/vendor/assets/images/batman/content-bg.png +0 -0
- data/vendor/assets/images/batman/header-wrapper-bg.jpg +0 -0
- data/vendor/assets/images/batman/logo.png +0 -0
- data/vendor/assets/javascripts/batman/batman.jquery.js +16 -74
- data/vendor/assets/javascripts/batman/batman.js +8951 -8551
- data/vendor/assets/javascripts/batman/batman.paginator.js +216 -0
- data/vendor/assets/javascripts/batman/batman.rails.js +78 -33
- data/vendor/assets/javascripts/batman/es5-shim.js +0 -0
- metadata +76 -57
- data/lib/batman/rails.rb +0 -6
- data/lib/batman/rails/engine.rb +0 -6
- data/lib/batman/rails/version.rb +0 -6
- data/lib/generators/batman/helper_generator.rb +0 -14
- data/lib/generators/batman/install_generator.rb +0 -93
- data/lib/generators/batman/templates/batman_app.coffee +0 -24
- data/lib/generators/batman/templates/controller.coffee +0 -5
- data/lib/generators/batman/templates/helper.coffee +0 -5
- data/lib/generators/batman/templates/model.coffee +0 -7
- data/test/install_generator_test.rb +0 -105
- data/vendor/assets/javascripts/batman/batman.i18n.js +0 -116
- data/vendor/assets/javascripts/batman/batman.solo.js +0 -558
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= application_name.titleize %></title>
|
5
|
+
<%%= stylesheet_link_tag "application", :media => "all" %>
|
6
|
+
<%%= javascript_include_tag "<%= application_name %>" %>
|
7
|
+
<%%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<div data-yield="main"></div>
|
12
|
+
|
13
|
+
<%= js_application_name %>.run()
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'mocha'
|
2
|
+
require 'test_helper'
|
3
|
+
require 'generators/batman/app_generator'
|
4
|
+
|
5
|
+
module AppGeneratorTests
|
6
|
+
|
7
|
+
def setup
|
8
|
+
mkdir_p "#{destination_root}/app/assets"
|
9
|
+
cp fixture(application_javascript_path), "#{destination_root}/app/assets"
|
10
|
+
Rails.application.class.stubs(:name).returns("Dummy::Application")
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
Rails.application.class.unstub(:name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_batman_application_file_is_created
|
19
|
+
run_generator
|
20
|
+
|
21
|
+
assert_file "#{javascripts_path}batman/dummy.js.coffee" do |app|
|
22
|
+
assert_match /class Dummy extends Batman\.App/, app
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_batman_application_file_is_created_for_two_word_application_name
|
27
|
+
Rails.application.class.stubs(:name).returns("FooBar::Application")
|
28
|
+
run_generator
|
29
|
+
|
30
|
+
assert_file "#{javascripts_path}batman/foo_bar.js.coffee" do |app|
|
31
|
+
assert_match /class FooBar extends Batman\.App/, app
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_batman_directory_structure_is_created
|
36
|
+
run_generator
|
37
|
+
|
38
|
+
%W{controllers models views html lib}.each do |dir|
|
39
|
+
assert_directory "#{javascripts_path}/batman/#{dir}"
|
40
|
+
assert_file "#{javascripts_path}batman/#{dir}/.gitkeep"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_no_gitkeep_files_are_created_when_skipping_git
|
45
|
+
run_generator [destination_root, "--skip-git"]
|
46
|
+
|
47
|
+
%W{controllers models views html lib}.each do |dir|
|
48
|
+
assert_directory "#{javascripts_path}/batman/#{dir}"
|
49
|
+
assert_no_file "#{javascripts_path}/batman/#{dir}/.gitkeep"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_jquery_isnt_added_when_skipping_jquery
|
54
|
+
run_generator [destination_root, "--skip-jquery"]
|
55
|
+
|
56
|
+
assert_file "#{javascripts_path}batman/dummy.js.coffee" do |app|
|
57
|
+
assert_no_match /require jquery/, app
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_es5_shim_isnt_added_when_skipping_es5_shim
|
62
|
+
run_generator [destination_root, "--skip-es5"]
|
63
|
+
|
64
|
+
assert_file "#{javascripts_path}batman/dummy.js.coffee" do |app|
|
65
|
+
assert_no_match /require batman\/es5-shim/, app
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_batmanjs_require_batman_jquery_rails
|
70
|
+
run_generator
|
71
|
+
|
72
|
+
assert_file "#{javascripts_path}batman/dummy.js.coffee" do |app|
|
73
|
+
%W{batman batman.jquery batman.rails}.each do |require|
|
74
|
+
assert_equal 1, app.scan(%r{require batman\/#{require}$}).length
|
75
|
+
end
|
76
|
+
|
77
|
+
%W{models controllers views lib}.each do |require|
|
78
|
+
assert_equal 1, app.scan(/require_tree \.\/#{require}/).length
|
79
|
+
end
|
80
|
+
|
81
|
+
assert_equal 1, app.scan(/Dummy\.run\(\)/).length
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def fixture(file)
|
89
|
+
File.expand_path("fixtures/#{file}", File.dirname(__FILE__))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class AppGeneratorWithApplicationJavascriptTest < Rails::Generators::TestCase
|
94
|
+
tests Batman::Generators::AppGenerator
|
95
|
+
|
96
|
+
def application_javascript_path
|
97
|
+
"application.js"
|
98
|
+
end
|
99
|
+
|
100
|
+
include AppGeneratorTests
|
101
|
+
end
|
102
|
+
|
103
|
+
# class AppGeneratorWithApplicationCoffeescriptTest < Rails::Generators::TestCase
|
104
|
+
# tests Batman::Generators::AppGenerator
|
105
|
+
|
106
|
+
# def application_javascript_path
|
107
|
+
# "application.js.coffee"
|
108
|
+
# end
|
109
|
+
|
110
|
+
# include AppGeneratorTests
|
111
|
+
# end
|
@@ -3,38 +3,64 @@ require 'generators/batman/controller_generator'
|
|
3
3
|
|
4
4
|
class ControllerGeneratorTest < Rails::Generators::TestCase
|
5
5
|
tests Batman::Generators::ControllerGenerator
|
6
|
-
|
6
|
+
|
7
7
|
test "simple controller" do
|
8
8
|
run_generator %w(Task index show)
|
9
|
-
|
10
|
-
assert_file "#{javascripts_path}/controllers/
|
11
|
-
controller_class = Regexp.escape("class Sample.
|
12
|
-
|
9
|
+
|
10
|
+
assert_file "#{javascripts_path}/batman/controllers/task_controller.js.coffee" do |controller|
|
11
|
+
controller_class = Regexp.escape("class Sample.TaskController extends Sample.ApplicationController")
|
12
|
+
|
13
13
|
assert_match /#{controller_class}/, controller
|
14
14
|
assert_match %r{ index: \(params\) ->}, controller
|
15
15
|
assert_match %r{ show: \(params\) ->}, controller
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
|
+
test "controller pluralization [singular]" do
|
20
|
+
run_generator %w(Task index show)
|
21
|
+
assert_file "#{javascripts_path}/batman/controllers/task_controller.js.coffee" do |controller|
|
22
|
+
controller_class = Regexp.escape("class Sample.TaskController extends Sample.ApplicationController")
|
23
|
+
assert_match /#{controller_class}/, controller
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
test "controller pluralization [plural]" do
|
28
|
+
run_generator %w(Tasks index show)
|
29
|
+
assert_file "#{javascripts_path}/batman/controllers/tasks_controller.js.coffee" do |controller|
|
30
|
+
controller_class = Regexp.escape("class Sample.TasksController extends Sample.ApplicationController")
|
31
|
+
assert_match /#{controller_class}/, controller
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
19
35
|
test "two word controller is camelcased" do
|
20
36
|
run_generator %w(RegularUser index)
|
21
|
-
|
22
|
-
assert_file "#{javascripts_path}/controllers/
|
23
|
-
controller_class = Regexp.escape("class Sample.
|
24
|
-
|
37
|
+
|
38
|
+
assert_file "#{javascripts_path}/batman/controllers/regular_user_controller.js.coffee" do |controller|
|
39
|
+
controller_class = Regexp.escape("class Sample.RegularUserController extends Sample.ApplicationController")
|
40
|
+
|
25
41
|
assert_match /#{controller_class}/, controller
|
26
42
|
assert_match %r{ index: \(params\) ->}, controller
|
27
43
|
end
|
28
44
|
end
|
29
|
-
|
45
|
+
|
30
46
|
test "simple controller with app_name" do
|
31
47
|
run_generator %w(Task index --app_name MyApp)
|
32
|
-
|
33
|
-
assert_file "#{javascripts_path}/controllers/
|
34
|
-
controller_class = Regexp.escape("class MyApp.
|
35
|
-
|
48
|
+
|
49
|
+
assert_file "#{javascripts_path}/MyApp/controllers/task_controller.js.coffee" do |controller|
|
50
|
+
controller_class = Regexp.escape("class MyApp.TaskController extends MyApp.ApplicationController")
|
51
|
+
|
36
52
|
assert_match /#{controller_class}/, controller
|
37
53
|
assert_match %r{ index: \(params\) ->}, controller
|
38
54
|
end
|
39
55
|
end
|
56
|
+
|
57
|
+
test "routingKey is present" do
|
58
|
+
run_generator %w(Resource)
|
59
|
+
|
60
|
+
assert_file "#{javascripts_path}/batman/controllers/resource_controller.js.coffee" do |controller|
|
61
|
+
routing_key = Regexp.escape("routingKey: 'resource'")
|
62
|
+
|
63
|
+
assert_match /#{routing_key}/ , controller
|
64
|
+
end
|
65
|
+
end
|
40
66
|
end
|
@@ -3,42 +3,73 @@ require 'generators/batman/model_generator'
|
|
3
3
|
|
4
4
|
class ModelGeneratorTest < Rails::Generators::TestCase
|
5
5
|
tests Batman::Generators::ModelGenerator
|
6
|
-
|
6
|
+
|
7
7
|
test "simple model" do
|
8
8
|
run_generator %w(Task title:string created_at:date)
|
9
|
-
|
10
|
-
assert_file "#{javascripts_path}/models/task.js.coffee" do |model|
|
9
|
+
|
10
|
+
assert_file "#{javascripts_path}/batman/models/task.js.coffee" do |model|
|
11
11
|
model_class = Regexp.escape("class Sample.Task extends Batman.Model")
|
12
|
-
|
12
|
+
|
13
13
|
assert_match /#{model_class}/, model
|
14
|
-
|
14
|
+
|
15
15
|
assert_match /@storageKey: 'tasks'/, model
|
16
16
|
assert_match /@persist Batman.RailsStorage/, model
|
17
|
-
|
17
|
+
|
18
18
|
assert_match /@encode 'title'/, model
|
19
19
|
assert_match /@encode 'created_at', Batman.Encoders.railsDate/, model
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
|
+
test "model pluralization [singular]" do
|
24
|
+
run_generator %w(Task)
|
25
|
+
assert_file "#{javascripts_path}/batman/models/task.js.coffee" do |model|
|
26
|
+
model_class = Regexp.escape("class Sample.Task extends Batman.Model")
|
27
|
+
assert_match /#{model_class}/, model
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
test "model pluralization [plural]" do
|
32
|
+
run_generator %w(Tasks)
|
33
|
+
assert_file "#{javascripts_path}/batman/models/task.js.coffee" do |model|
|
34
|
+
model_class = Regexp.escape("class Sample.Task extends Batman.Model")
|
35
|
+
assert_match /#{model_class}/, model
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
23
39
|
test "two word model is camelcased" do
|
24
40
|
run_generator %w(RegularUser name:string)
|
25
|
-
|
26
|
-
assert_file "#{javascripts_path}/models/regular_user.js.coffee" do |model|
|
41
|
+
|
42
|
+
assert_file "#{javascripts_path}/batman/models/regular_user.js.coffee" do |model|
|
27
43
|
model_class = Regexp.escape("class Sample.RegularUser extends Batman.Model")
|
28
|
-
|
44
|
+
|
29
45
|
assert_match /#{model_class}/, model
|
30
|
-
|
46
|
+
|
31
47
|
assert_match /@storageKey: 'regular_users'/, model
|
48
|
+
assert_match /@encode 'name'/, model
|
32
49
|
end
|
33
50
|
end
|
34
|
-
|
35
|
-
test "simple model with
|
51
|
+
|
52
|
+
test "simple model with app_nam and created_at date" do
|
36
53
|
run_generator %w(Task title:string created_at:date --app_name MyApp)
|
37
|
-
|
38
|
-
assert_file "#{javascripts_path}/models/task.js.coffee" do |model|
|
54
|
+
|
55
|
+
assert_file "#{javascripts_path}/MyApp/models/task.js.coffee" do |model|
|
56
|
+
model_class = Regexp.escape("class MyApp.Task extends Batman.Model")
|
57
|
+
|
58
|
+
assert_match /#{model_class}/, model
|
59
|
+
assert_match /@encode 'title'/, model
|
60
|
+
assert_match /@encode 'created_at', Batman.Encoders.railsDate/, model
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
test "simple model with duck-typing" do
|
65
|
+
run_generator %w(Task title created_at:date --app_name MyApp)
|
66
|
+
|
67
|
+
assert_file "#{javascripts_path}/MyApp/models/task.js.coffee" do |model|
|
39
68
|
model_class = Regexp.escape("class MyApp.Task extends Batman.Model")
|
40
|
-
|
69
|
+
|
41
70
|
assert_match /#{model_class}/, model
|
71
|
+
assert_match /@encode 'title'/, model
|
72
|
+
assert_match /@encode 'created_at', Batman.Encoders.railsDate/, model
|
42
73
|
end
|
43
74
|
end
|
44
75
|
end
|
data/test/test_helper.rb
CHANGED
@@ -16,9 +16,9 @@ require 'rails/generators/test_case'
|
|
16
16
|
class Rails::Generators::TestCase
|
17
17
|
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
18
18
|
setup :prepare_destination
|
19
|
-
|
19
|
+
|
20
20
|
def javascripts_path
|
21
|
-
"app/assets/
|
21
|
+
"app/assets/"
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'generators/batman/view_generator'
|
3
|
+
|
4
|
+
class ViewGeneratorTest < Rails::Generators::TestCase
|
5
|
+
tests Batman::Generators::ViewGenerator
|
6
|
+
|
7
|
+
test "simple view" do
|
8
|
+
run_generator %w(Task index show)
|
9
|
+
|
10
|
+
assert_file "#{javascripts_path}/batman/views/task_view.js.coffee" do |view|
|
11
|
+
view_class = Regexp.escape("class Sample.TaskView extends Batman.View")
|
12
|
+
view_index_class = Regexp.escape("class Sample.TaskIndexView extends Sample.TaskView")
|
13
|
+
view_show_class = Regexp.escape("class Sample.TaskShowView extends Sample.TaskView")
|
14
|
+
|
15
|
+
assert_match /#{view_class}/, view
|
16
|
+
assert_match /#{view_index_class}/, view
|
17
|
+
assert_match /#{view_show_class}/, view
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
test "view pluralization [singular]" do
|
22
|
+
run_generator %w(Task)
|
23
|
+
assert_file "#{javascripts_path}/batman/views/task_view.js.coffee" do |view|
|
24
|
+
view_class = Regexp.escape("class Sample.TaskView extends Batman.View")
|
25
|
+
assert_match /#{view_class}/, view
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
test "view pluralization [plural]" do
|
30
|
+
run_generator %w(Tasks)
|
31
|
+
assert_file "#{javascripts_path}/batman/views/tasks_view.js.coffee" do |view|
|
32
|
+
view_class = Regexp.escape("class Sample.TasksView extends Batman.View")
|
33
|
+
assert_match /#{view_class}/, view
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,5 +1,4 @@
|
|
1
1
|
(function() {
|
2
|
-
|
3
2
|
Batman.extend(Batman.DOM, {
|
4
3
|
querySelectorAll: function(node, selector) {
|
5
4
|
return jQuery(selector, node);
|
@@ -8,47 +7,26 @@
|
|
8
7
|
return jQuery(selector, node)[0];
|
9
8
|
},
|
10
9
|
setInnerHTML: function(node, html) {
|
11
|
-
|
12
|
-
childNodes = (function() {
|
13
|
-
var _i, _len, _ref, _results;
|
14
|
-
_ref = node.childNodes;
|
15
|
-
_results = [];
|
16
|
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
17
|
-
child = _ref[_i];
|
18
|
-
_results.push(child);
|
19
|
-
}
|
20
|
-
return _results;
|
21
|
-
})();
|
22
|
-
for (_i = 0, _len = childNodes.length; _i < _len; _i++) {
|
23
|
-
child = childNodes[_i];
|
24
|
-
Batman.DOM.willRemoveNode(child);
|
25
|
-
}
|
26
|
-
result = jQuery(node).html(html);
|
27
|
-
for (_j = 0, _len1 = childNodes.length; _j < _len1; _j++) {
|
28
|
-
child = childNodes[_j];
|
29
|
-
Batman.DOM.didRemoveNode(child);
|
30
|
-
}
|
31
|
-
return result;
|
32
|
-
},
|
33
|
-
removeNode: function(node) {
|
34
|
-
var _ref;
|
35
|
-
Batman.DOM.willRemoveNode(node);
|
36
|
-
if ((_ref = node.parentNode) != null) {
|
37
|
-
_ref.removeChild(node);
|
38
|
-
}
|
39
|
-
return Batman.DOM.didRemoveNode(node);
|
10
|
+
return jQuery(node).html(html);
|
40
11
|
},
|
41
12
|
destroyNode: function(node) {
|
42
|
-
Batman.DOM.
|
43
|
-
Batman.DOM.willRemoveNode(node);
|
13
|
+
Batman.DOM.cleanupNode(node);
|
44
14
|
jQuery(node).remove();
|
45
|
-
Batman.DOM.didRemoveNode(node);
|
46
|
-
return Batman.DOM.didDestroyNode(node);
|
47
15
|
},
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
16
|
+
textContent: function(node) {
|
17
|
+
return jQuery(node).text();
|
18
|
+
},
|
19
|
+
addEventListener: function(node, eventName, callback) {
|
20
|
+
return $(node).on(eventName, callback);
|
21
|
+
},
|
22
|
+
removeEventListener: function(node, eventName, callback) {
|
23
|
+
return $(node).off(eventName, callback);
|
24
|
+
}
|
25
|
+
});
|
26
|
+
|
27
|
+
Batman.View.accessor('$node', function() {
|
28
|
+
if (this.get('node')) {
|
29
|
+
return $(this.node);
|
52
30
|
}
|
53
31
|
});
|
54
32
|
|
@@ -122,40 +100,4 @@
|
|
122
100
|
return jQuery.ajax(this._prepareOptions(data));
|
123
101
|
};
|
124
102
|
|
125
|
-
Batman.mixins.animation = {
|
126
|
-
show: function(addToParent) {
|
127
|
-
var jq, show, _ref, _ref1;
|
128
|
-
jq = $(this);
|
129
|
-
show = function() {
|
130
|
-
return jq.show(600);
|
131
|
-
};
|
132
|
-
if (addToParent) {
|
133
|
-
if ((_ref = addToParent.append) != null) {
|
134
|
-
_ref.appendChild(this);
|
135
|
-
}
|
136
|
-
if ((_ref1 = addToParent.before) != null) {
|
137
|
-
_ref1.parentNode.insertBefore(this, addToParent.before);
|
138
|
-
}
|
139
|
-
jq.hide();
|
140
|
-
setTimeout(show, 0);
|
141
|
-
} else {
|
142
|
-
show();
|
143
|
-
}
|
144
|
-
return this;
|
145
|
-
},
|
146
|
-
hide: function(removeFromParent) {
|
147
|
-
var _this = this;
|
148
|
-
$(this).hide(600, function() {
|
149
|
-
var _ref;
|
150
|
-
if (removeFromParent) {
|
151
|
-
if ((_ref = _this.parentNode) != null) {
|
152
|
-
_ref.removeChild(_this);
|
153
|
-
}
|
154
|
-
}
|
155
|
-
return Batman.DOM.didRemoveNode(_this);
|
156
|
-
});
|
157
|
-
return this;
|
158
|
-
}
|
159
|
-
};
|
160
|
-
|
161
103
|
}).call(this);
|