openstax_kitchen 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/.devcontainer/devcontainer.json +19 -0
  3. data/.github/workflows/tests.yml +36 -0
  4. data/.gitignore +20 -0
  5. data/.rspec +3 -0
  6. data/.solargraph.yml +15 -0
  7. data/CHANGELOG.md +11 -0
  8. data/CODE_OF_CONDUCT.md +74 -0
  9. data/Dockerfile +19 -0
  10. data/Gemfile +9 -0
  11. data/Gemfile.lock +74 -0
  12. data/LICENSE.txt +21 -0
  13. data/README.md +674 -0
  14. data/Rakefile +6 -0
  15. data/bin/console +14 -0
  16. data/bin/normalize +79 -0
  17. data/bin/setup +8 -0
  18. data/books/chemistry2e/bake.rb +133 -0
  19. data/codecov.yaml +27 -0
  20. data/docker-compose.yml +12 -0
  21. data/docker/bash +1 -0
  22. data/docker/entrypoint +9 -0
  23. data/lib/kitchen.rb +57 -0
  24. data/lib/kitchen/ancestor.rb +30 -0
  25. data/lib/kitchen/book_document.rb +18 -0
  26. data/lib/kitchen/book_element.rb +24 -0
  27. data/lib/kitchen/book_element_enumerator.rb +5 -0
  28. data/lib/kitchen/book_recipe.rb +25 -0
  29. data/lib/kitchen/chapter_element.rb +35 -0
  30. data/lib/kitchen/chapter_element_enumerator.rb +13 -0
  31. data/lib/kitchen/clipboard.rb +37 -0
  32. data/lib/kitchen/composite_chapter_element.rb +23 -0
  33. data/lib/kitchen/composite_page_element.rb +27 -0
  34. data/lib/kitchen/composite_page_element_enumerator.rb +13 -0
  35. data/lib/kitchen/config.rb +20 -0
  36. data/lib/kitchen/counter.rb +34 -0
  37. data/lib/kitchen/debug/print_recipe_error.rb +80 -0
  38. data/lib/kitchen/directions/bake_appendix.rb +26 -0
  39. data/lib/kitchen/directions/bake_chapter_glossary.rb +34 -0
  40. data/lib/kitchen/directions/bake_chapter_introductions.rb +58 -0
  41. data/lib/kitchen/directions/bake_chapter_key_equations.rb +30 -0
  42. data/lib/kitchen/directions/bake_chapter_summary.rb +52 -0
  43. data/lib/kitchen/directions/bake_composite_pages.rb +13 -0
  44. data/lib/kitchen/directions/bake_example.rb +31 -0
  45. data/lib/kitchen/directions/bake_exercises.rb +164 -0
  46. data/lib/kitchen/directions/bake_figure.rb +25 -0
  47. data/lib/kitchen/directions/bake_footnotes/main.rb +11 -0
  48. data/lib/kitchen/directions/bake_footnotes/v1.rb +38 -0
  49. data/lib/kitchen/directions/bake_index/main.rb +11 -0
  50. data/lib/kitchen/directions/bake_index/v1.rb +138 -0
  51. data/lib/kitchen/directions/bake_index/v1.xhtml.erb +28 -0
  52. data/lib/kitchen/directions/bake_math_in_paragraph.rb +13 -0
  53. data/lib/kitchen/directions/bake_notes.rb +58 -0
  54. data/lib/kitchen/directions/bake_numbered_table/main.rb +11 -0
  55. data/lib/kitchen/directions/bake_numbered_table/v1.rb +47 -0
  56. data/lib/kitchen/directions/bake_stepwise.rb +27 -0
  57. data/lib/kitchen/directions/bake_toc.rb +103 -0
  58. data/lib/kitchen/directions/bake_unnumbered_tables.rb +14 -0
  59. data/lib/kitchen/directions/move_title_text_into_span.rb +15 -0
  60. data/lib/kitchen/document.rb +142 -0
  61. data/lib/kitchen/element.rb +15 -0
  62. data/lib/kitchen/element_base.rb +444 -0
  63. data/lib/kitchen/element_enumerator.rb +12 -0
  64. data/lib/kitchen/element_enumerator_base.rb +101 -0
  65. data/lib/kitchen/element_enumerator_factory.rb +111 -0
  66. data/lib/kitchen/element_factory.rb +32 -0
  67. data/lib/kitchen/errors.rb +4 -0
  68. data/lib/kitchen/example_element.rb +20 -0
  69. data/lib/kitchen/example_element_enumerator.rb +13 -0
  70. data/lib/kitchen/figure_element.rb +20 -0
  71. data/lib/kitchen/figure_element_enumerator.rb +13 -0
  72. data/lib/kitchen/mixins/block_error_if.rb +19 -0
  73. data/lib/kitchen/note_element.rb +43 -0
  74. data/lib/kitchen/note_element_enumerator.rb +13 -0
  75. data/lib/kitchen/oven.rb +61 -0
  76. data/lib/kitchen/page_element.rb +51 -0
  77. data/lib/kitchen/page_element_enumerator.rb +13 -0
  78. data/lib/kitchen/pantry.rb +35 -0
  79. data/lib/kitchen/patches/nokogiri.rb +31 -0
  80. data/lib/kitchen/patches/renderable.rb +31 -0
  81. data/lib/kitchen/patches/string.rb +5 -0
  82. data/lib/kitchen/recipe.rb +78 -0
  83. data/lib/kitchen/search_history.rb +33 -0
  84. data/lib/kitchen/selectors/base.rb +8 -0
  85. data/lib/kitchen/selectors/standard_1.rb +12 -0
  86. data/lib/kitchen/table_element.rb +36 -0
  87. data/lib/kitchen/table_element_enumerator.rb +13 -0
  88. data/lib/kitchen/term_element.rb +16 -0
  89. data/lib/kitchen/term_element_enumerator.rb +13 -0
  90. data/lib/kitchen/transliterations.rb +19 -0
  91. data/lib/kitchen/type_casting_element_enumerator.rb +23 -0
  92. data/lib/kitchen/utils.rb +19 -0
  93. data/lib/kitchen/version.rb +3 -0
  94. data/lib/locales/en.yml +21 -0
  95. data/lib/notes.md +9 -0
  96. data/openstax_kitchen.gemspec +39 -0
  97. data/tutorials/00/expected_baked.html +3 -0
  98. data/tutorials/00/raw.html +3 -0
  99. data/tutorials/00/solution_1.rb +7 -0
  100. data/tutorials/00/solution_2.rb +6 -0
  101. data/tutorials/01/expected_baked.html +66 -0
  102. data/tutorials/01/raw.html +62 -0
  103. data/tutorials/01/solution_1.rb +16 -0
  104. data/tutorials/01/solution_2.rb +24 -0
  105. data/tutorials/02/expected_baked.html +207 -0
  106. data/tutorials/02/raw.html +201 -0
  107. data/tutorials/02/solution_1.rb +29 -0
  108. data/tutorials/03/expected_baked.html +33 -0
  109. data/tutorials/03/raw.html +31 -0
  110. data/tutorials/03/solution_1.rb +16 -0
  111. data/tutorials/03/solution_2.rb +15 -0
  112. data/tutorials/04/expected_baked.html +36 -0
  113. data/tutorials/04/raw.html +36 -0
  114. data/tutorials/04/solution_1.rb +20 -0
  115. data/tutorials/04/solution_2.rb +25 -0
  116. data/tutorials/05/expected_baked.html +11 -0
  117. data/tutorials/05/raw.html +11 -0
  118. data/tutorials/05/solution_1.rb +9 -0
  119. data/tutorials/check_it +64 -0
  120. data/tutorials/setup_my_recipes +30 -0
  121. metadata +278 -0
@@ -0,0 +1,3 @@
1
+ module Kitchen
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ en:
2
+ figure: Figure
3
+ table_label: Table
4
+ appendix: Appendix
5
+ example_label: Example
6
+ exercise_label: Exercise
7
+ stepwise_step_label: Step
8
+ eoc_key_terms_title: Key Terms
9
+ eoc_summary_title: Summary
10
+ eoc_exercises_title: Exercises
11
+ eoc_answer_key_title: Answer Key
12
+ eoc_key_equations: Key Equations
13
+ eob_index_title: Index
14
+ eob_index_symbols_group: Symbols
15
+ notes:
16
+ link-to-learning: Link to Learning
17
+ sciences-interconnect: How Sciences Interconnect
18
+ chemistry:
19
+ link-to-learning: Link to Learning
20
+ everyday-life: Chemistry in Everyday Life
21
+ chemist-portrait: Portrait of a Chemist
@@ -0,0 +1,9 @@
1
+ ```ruby
2
+ def first_of
3
+ FirstOfEnumerator(book.units.chapters, book.chapters, book).pages.each do |page|
4
+
5
+ end
6
+ end
7
+ ```
8
+
9
+ When baking moves an important element (e.g. something with a data-type that we latch onto), it should update how to find that element in the future by changing the selector on the doc.
@@ -0,0 +1,39 @@
1
+ require_relative 'lib/kitchen/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "openstax_kitchen"
5
+ spec.version = Kitchen::VERSION
6
+ spec.authors = ["JP Slavinsky"]
7
+ spec.email = ["jpslav@gmail.com"]
8
+
9
+ spec.summary = %q{OpenStax content baking library}
10
+ spec.description = %q{OpenStax content baking library}
11
+ spec.homepage = "https://github.com/openstax/kitchen"
12
+ spec.license = "MIT"
13
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
+
15
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/openstax/kitchen"
19
+ spec.metadata["changelog_uri"] = "https://github.com/openstax/kitchen/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency 'nokogiri'
31
+ spec.add_dependency 'rainbow'
32
+ spec.add_dependency 'activesupport'
33
+ spec.add_dependency 'i18n'
34
+
35
+ spec.add_development_dependency 'byebug'
36
+ spec.add_development_dependency 'yard'
37
+ spec.add_development_dependency 'nokogiri-diff'
38
+ spec.add_development_dependency 'rainbow'
39
+ end
@@ -0,0 +1,3 @@
1
+ <h1 class="hello">
2
+ <span>World!</span>
3
+ </h1>
@@ -0,0 +1,3 @@
1
+ <div class="hello">
2
+ <span>Planet?</span>
3
+ </div>
@@ -0,0 +1,7 @@
1
+ @solution_1 = Kitchen::Recipe.new do |doc|
2
+
3
+ div = doc.search("div").first
4
+ div.name = "h1"
5
+ div.search("span").first.replace_children(with: "World!")
6
+
7
+ end
@@ -0,0 +1,6 @@
1
+ @solution_2 = Kitchen::Recipe.new do |doc|
2
+
3
+ doc.search("div").first.name = "h1"
4
+ doc.search("span").first.replace_children(with: "World!")
5
+
6
+ end
@@ -0,0 +1,66 @@
1
+ <!--
2
+ 1. Move the `will-move` divs to an new container with a class of `eoc` at the end of the chapter
3
+ 2. Add a section title with the class "os-title" and the value "End of Chapter Collations"
4
+ 3. Change `will-move` divs to sections
5
+ -->
6
+ <!DOCTYPE html>
7
+ <html>
8
+ <head>
9
+ <title>Move-to, creating containers</title>
10
+ </head>
11
+ <body>
12
+ <div data-type="chapter">
13
+ <h1 data-type="document-title">Chapter Title</h1>
14
+ <div data-type="page">
15
+ <h2 data-type="document-title">Page Title</h2>
16
+ <div class="will-not-move">
17
+ <h3>I didn't go anywhere</h3>
18
+ <p>
19
+ Content will not move <br /> Lorem ipsum.
20
+ </p>
21
+ </div>
22
+
23
+ <div class="will-not-move">
24
+ <h3> I'm here to stay.</h3>
25
+ <p>
26
+ Content will not move <br /> Lorem ipsum.
27
+ </p>
28
+ <p>
29
+ Content will not move <br /> Lorem ipsum.
30
+ </p>
31
+ </div>
32
+
33
+ <div class="will-not-move">
34
+ <h3>Don't make me move!</h3>
35
+ <p>
36
+ Content will not move <br /> Lorem ipsum.
37
+ </p>
38
+ <p>
39
+ Lorem ipsum.
40
+ </p>
41
+ </div>
42
+ </div>
43
+ <div class="eoc">
44
+ <div class="os-title">End of Chapter Collations</div>
45
+ <section class="will-move">
46
+ <h3>I cannot stand still</h3>
47
+ <p>
48
+ Content will move <br /> Lorem ipsum.
49
+ </p>
50
+ <p>
51
+ Lorem ipsum.
52
+ </p>
53
+ </section>
54
+ <section class="will-move">
55
+ <h3>I have to go!</h3>
56
+ <p>
57
+ Content will move <br /> Lorem ipsum.
58
+ </p>
59
+ <p>
60
+ Lorem ipsum.
61
+ </p>
62
+ </section>
63
+ </div>
64
+ </div>
65
+ </body>
66
+ </html>
@@ -0,0 +1,62 @@
1
+ <!--
2
+ 1. Move the `will-move` divs to an new container with a class of `eoc` at the end of the chapter
3
+ 2. Add a section title with the class "os-title" and the value "End of Chapter Collations"
4
+ 3. Change `will-move` divs to sections
5
+ -->
6
+
7
+ <!DOCTYPE html>
8
+ <html>
9
+ <head>
10
+ <title>Move-to, creating containers</title>
11
+ </head>
12
+ <body>
13
+ <div data-type="chapter">
14
+ <h1 data-type="document-title">Chapter Title</h1>
15
+ <div data-type="page">
16
+ <h2 data-type="document-title">Page Title</h2>
17
+ <div class="will-not-move">
18
+ <h3>I didn't go anywhere</h3>
19
+ <p>
20
+ Content will not move <br /> Lorem ipsum.
21
+ </p>
22
+ </div>
23
+ <div class="will-move">
24
+ <h3>I cannot stand still</h3>
25
+ <p>
26
+ Content will move <br /> Lorem ipsum.
27
+ </p>
28
+ <p>
29
+ Lorem ipsum.
30
+ </p>
31
+ </div>
32
+ <div class="will-not-move">
33
+ <h3> I'm here to stay.</h3>
34
+ <p>
35
+ Content will not move <br /> Lorem ipsum.
36
+ </p>
37
+ <p>
38
+ Content will not move <br /> Lorem ipsum.
39
+ </p>
40
+ </div>
41
+ <div class="will-move">
42
+ <h3>I have to go!</h3>
43
+ <p>
44
+ Content will move <br /> Lorem ipsum.
45
+ </p>
46
+ <p>
47
+ Lorem ipsum.
48
+ </p>
49
+ </div>
50
+ <div class="will-not-move">
51
+ <h3>Don't make me move!</h3>
52
+ <p>
53
+ Content will not move <br /> Lorem ipsum.
54
+ </p>
55
+ <p>
56
+ Lorem ipsum.
57
+ </p>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </body>
62
+ </html>
@@ -0,0 +1,16 @@
1
+ @solution_1 = Kitchen::Recipe.new do |doc|
2
+
3
+ doc.search("[data-type='chapter']").each do |chapter|
4
+ movers = chapter.search(".will-move").cut
5
+ movers.each{|mover| mover.name = "section"}
6
+
7
+ chapter.append(child: <<~HTML
8
+ <div class="eoc">
9
+ <div class="os-title">End of Chapter Collations</div>
10
+ #{movers.paste}
11
+ </div>
12
+ HTML
13
+ )
14
+ end
15
+
16
+ end
@@ -0,0 +1,24 @@
1
+ @solution_2 = Kitchen::BookRecipe.new do |doc|
2
+
3
+ # ^
4
+ # |
5
+ #
6
+ # BookRecipe gives us `doc.book` and `book.chapters` to make the code cleaner
7
+ #
8
+ # | |
9
+ # v v
10
+
11
+ doc.book.chapters.each do |chapter|
12
+ movers = chapter.search(".will-move").cut
13
+ movers.each{|mover| mover.name = "section"}
14
+
15
+ chapter.append(child: <<~HTML
16
+ <div class="eoc">
17
+ <div class="os-title">End of Chapter Collations</div>
18
+ #{movers.paste}
19
+ </div>
20
+ HTML
21
+ )
22
+ end
23
+
24
+ end
@@ -0,0 +1,207 @@
1
+ <!--
2
+ 1. For each chapter, add a new container as its last child with class "eoc"
3
+ 2. Give it a title of "End of Chapter Stuff". Use the proper header
4
+ container based on nesting, and give it a data-type of 'document-title'.
5
+ 3. Inside each "eoc" container, make two new containers, one with class
6
+ "critical-thinking-container" and title "Critical Thinking Questions" and
7
+ another with class "review-questions-container" and title "Review Questions".
8
+ 4. To the "critical-thinking-container" move all of the containers from each
9
+ chapter that have the class "critical-thinking".
10
+ 5. To the "review-questions-container" move all of the containers from each chapter
11
+ that have the class "review-questions".
12
+ 6. Remove the h3 tags from the containers that are moving.
13
+ -->
14
+ <!DOCTYPE html>
15
+ <html>
16
+ <head>
17
+ <title>Move-to, creating containers</title>
18
+ </head>
19
+ <body>
20
+ <div class="book">
21
+ <div data-type="chapter">
22
+ <h1 data-type="document-title">Chapter Title (1)</h1>
23
+ <div data-type="page">
24
+ <h2 data-type="document-title">Page title (1.1)</h2>
25
+ <div class="will-not-move">
26
+ <h3>I didn't go anywhere</h3>
27
+ <p>
28
+ Content will not move <br /> Lorem ipsum dolor ...
29
+ </p>
30
+ </div>
31
+ <div class="will-not-move">
32
+ <h3> I'm here to stay.</h3>
33
+ <p>
34
+ Content will not move <br /> Lorem ipsum dolor ...
35
+ </p>
36
+ </div>
37
+ <div class="will-not-move">
38
+ <h3>Don't make me move!</h3>
39
+ <p>
40
+ Content will not move <br /> Lorem ipsum dolor ...
41
+ </p>
42
+ </div>
43
+ </div>
44
+ <div data-type="page">
45
+ <h2 data-type="document-title">Page title (1.2)</h2>
46
+ <div class="will-not-move">
47
+ <h3>I didn't go anywhere</h3>
48
+ <p>
49
+ Content will not move <br /> Lorem ipsum dolor ...
50
+ </p>
51
+ </div>
52
+ <div class="will-not-move">
53
+ <h3> I'm here to stay.</h3>
54
+ <p>
55
+ Content will not move <br /> Lorem ipsum dolor ...
56
+ </p>
57
+ </div>
58
+ <div class="will-not-move">
59
+ <h3>Don't make me move!</h3>
60
+ <p>
61
+ Content will not move <br /> Lorem ipsum dolor ...
62
+ </p>
63
+ </div>
64
+ </div>
65
+ <div data-type="page">
66
+ <h2 data-type="document-title">Page title (1.3)</h2>
67
+ <div class="will-not-move">
68
+ <h3>I didn't go anywhere</h3>
69
+ <p>
70
+ Content will not move <br /> Lorem ipsum dolor ...
71
+ </p>
72
+ </div>
73
+ <div class="will-not-move">
74
+ <h3> I'm here to stay.</h3>
75
+ <p>
76
+ Content will not move <br /> Lorem ipsum dolor ...
77
+ </p>
78
+ </div>
79
+ <div class="will-not-move">
80
+ <h3>Don't make me move!</h3>
81
+ <p>
82
+ Content will not move <br /> Lorem ipsum dolor ...
83
+ </p>
84
+ </div>
85
+ </div>
86
+ <div class="eoc">
87
+ <h2 data-type="document-title">End of Chapter Stuff</h2>
88
+ <div class="critical-thinking-container">
89
+ <div class="os-title">Critical Thinking Questions</div>
90
+ <div class="critical-thinking" id="03">
91
+ <p>
92
+ Content will move <br /> Lorem ipsum dolor ...
93
+ </p>
94
+ </div>
95
+ <div class="critical-thinking" id="05">
96
+ <p>
97
+ Content will move <br /> Lorem ipsum dolor ...
98
+ </p>
99
+ </div>
100
+ <div class="critical-thinking" id="07">
101
+ <p>
102
+ Content will move <br /> Lorem ipsum dolor ...
103
+ </p>
104
+ </div>
105
+ </div>
106
+ <div class="review-questions-container">
107
+ <div class="os-title">Review Questions</div>
108
+ <div class="review-questions" id="01">
109
+ <p>
110
+ Content will move <br /> Lorem ipsum dolor ...
111
+ </p>
112
+ </div>
113
+ <div class="review-questions" id="02">
114
+ <p>
115
+ Content will move <br /> Lorem ipsum dolor ...
116
+ </p>
117
+ </div>
118
+ <div class="review-questions" id="04">
119
+ <p>
120
+ Content will move <br /> Lorem ipsum dolor ...
121
+ </p>
122
+ </div>
123
+ <div class="review-questions" id="06">
124
+ <p>
125
+ Content will move <br /> Lorem ipsum dolor ...
126
+ </p>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ <div data-type="chapter">
132
+ <h1 data-type="document-title">Chapter Title (2)</h1>
133
+ <div data-type="page">
134
+ <h2 data-type="document-title">Page title (2.1)</h2>
135
+ <div class="will-not-move">
136
+ <h3>I didn't go anywhere</h3>
137
+ <p>
138
+ Content will not move <br /> Lorem ipsum dolor ...
139
+ </p>
140
+ </div>
141
+ <div class="will-not-move">
142
+ <h3> I'm here to stay.</h3>
143
+ <p>
144
+ Content will not move <br /> Lorem ipsum dolor ...
145
+ </p>
146
+ </div>
147
+ <div class="will-not-move">
148
+ <h3>Don't make me move!</h3>
149
+ <p>
150
+ Content will not move <br /> Lorem ipsum dolor ...
151
+ </p>
152
+ </div>
153
+ </div>
154
+ <div data-type="page">
155
+ <h2 data-type="document-title">Page title (2.2)</h2>
156
+ <div class="will-not-move">
157
+ <h3>I didn't go anywhere</h3>
158
+ <p>
159
+ Content will not move <br /> Lorem ipsum dolor ...
160
+ </p>
161
+ </div>
162
+ <div class="will-not-move">
163
+ <h3> I'm here to stay.</h3>
164
+ <p>
165
+ Content will not move <br /> Lorem ipsum dolor ...
166
+ </p>
167
+ </div>
168
+ <div class="will-not-move">
169
+ <h3>Don't make me move!</h3>
170
+ <p>
171
+ Content will not move <br /> Lorem ipsum dolor ...
172
+ </p>
173
+ </div>
174
+ </div>
175
+ <div class="eoc">
176
+ <h2 data-type="document-title">End of Chapter Stuff</h2>
177
+ <div class="critical-thinking-container">
178
+ <div class="os-title">Critical Thinking Questions</div>
179
+ <div class="critical-thinking" id="09">
180
+ <p>
181
+ Content will move <br /> Lorem ipsum dolor ...
182
+ </p>
183
+ </div>
184
+ <div class="critical-thinking" id="11">
185
+ <p>
186
+ Content will move <br /> Lorem ipsum dolor ...
187
+ </p>
188
+ </div>
189
+ </div>
190
+ <div class="review-questions-container">
191
+ <div class="os-title">Review Questions</div>
192
+ <div class="review-questions" id="08">
193
+ <p>
194
+ Content will move <br /> Lorem ipsum dolor ...
195
+ </p>
196
+ </div>
197
+ <div class="review-questions" id="10">
198
+ <p>
199
+ Content will move <br /> Lorem ipsum dolor ...
200
+ </p>
201
+ </div>
202
+ </div>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ </body>
207
+ </html>