vasille 1.2.8 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/.gitlab-ci.yml +20 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +160 -119
  4. package/cdn/es2015.js +3221 -0
  5. package/cdn/es5.js +3673 -0
  6. package/flow-typed/vasille.js +837 -0
  7. package/lib/binding/attribute.js +32 -0
  8. package/lib/binding/binding.js +39 -0
  9. package/lib/binding/class.js +51 -0
  10. package/lib/binding/style.js +29 -0
  11. package/lib/core/core.js +178 -0
  12. package/lib/core/destroyable.js +45 -0
  13. package/lib/core/errors.js +16 -0
  14. package/lib/core/executor.js +154 -0
  15. package/lib/core/ivalue.js +56 -0
  16. package/lib/core/signal.js +50 -0
  17. package/lib/core/slot.js +47 -0
  18. package/lib/index.js +27 -22
  19. package/lib/models/array-model.js +208 -0
  20. package/lib/models/listener.js +130 -0
  21. package/lib/models/map-model.js +66 -0
  22. package/lib/models/model.js +1 -0
  23. package/lib/models/object-model.js +78 -0
  24. package/lib/models/set-model.js +62 -0
  25. package/lib/node/app.js +38 -0
  26. package/lib/node/interceptor.js +83 -0
  27. package/lib/node/node.js +1202 -0
  28. package/lib/node/watch.js +27 -0
  29. package/lib/value/expression.js +83 -0
  30. package/lib/value/mirror.js +58 -0
  31. package/lib/value/pointer.js +26 -0
  32. package/lib/value/reference.js +55 -0
  33. package/lib/views/array-view.js +23 -0
  34. package/lib/views/base-view.js +49 -0
  35. package/lib/views/map-view.js +20 -0
  36. package/lib/views/object-view.js +20 -0
  37. package/lib/views/repeat-node.js +106 -0
  38. package/lib/views/repeater.js +63 -0
  39. package/lib/views/set-view.js +23 -0
  40. package/package.json +27 -19
  41. package/types/binding/attribute.d.ts +23 -0
  42. package/types/binding/binding.d.ts +30 -0
  43. package/types/binding/class.d.ts +23 -0
  44. package/types/binding/style.d.ts +23 -0
  45. package/types/core/core.d.ts +140 -0
  46. package/types/core/destroyable.d.ts +15 -0
  47. package/types/core/errors.d.ts +4 -0
  48. package/types/core/executor.d.ts +87 -0
  49. package/types/core/ivalue.d.ts +45 -0
  50. package/types/core/signal.d.ts +35 -0
  51. package/types/core/slot.d.ts +45 -0
  52. package/types/index.d.ts +27 -21
  53. package/types/models/array-model.d.ts +103 -0
  54. package/types/models/listener.d.ts +74 -0
  55. package/types/models/map-model.d.ts +35 -0
  56. package/types/models/model.d.ts +19 -0
  57. package/types/models/object-model.d.ts +36 -0
  58. package/types/models/set-model.d.ts +34 -0
  59. package/types/node/app.d.ts +37 -0
  60. package/types/node/interceptor.d.ts +50 -0
  61. package/types/node/node.d.ts +741 -0
  62. package/types/node/watch.d.ts +23 -0
  63. package/types/value/expression.d.ts +60 -0
  64. package/types/value/mirror.d.ts +35 -0
  65. package/types/value/pointer.d.ts +19 -0
  66. package/types/value/reference.d.ts +30 -0
  67. package/types/views/array-view.d.ts +13 -0
  68. package/types/views/base-view.d.ts +43 -0
  69. package/types/views/map-view.d.ts +11 -0
  70. package/types/views/object-view.d.ts +11 -0
  71. package/types/views/repeat-node.d.ts +35 -0
  72. package/types/views/repeater.d.ts +38 -0
  73. package/types/views/set-view.d.ts +11 -0
  74. package/CHANGELOG.md +0 -23
  75. package/img/favicon.svg +0 -441
  76. package/img/getLocus.svg +0 -18
  77. package/img/logo.png +0 -0
  78. package/img/logo.svg +0 -550
  79. package/img/scores-o-log.png +0 -0
  80. package/img/scores-o.png +0 -0
  81. package/img/scores-wo-log.png +0 -0
  82. package/img/scores-wo.png +0 -0
  83. package/img/x1-x32.png +0 -0
  84. package/lib/attribute.js +0 -71
  85. package/lib/attribute.js.map +0 -1
  86. package/lib/bind.js +0 -286
  87. package/lib/bind.js.map +0 -1
  88. package/lib/class.js +0 -97
  89. package/lib/class.js.map +0 -1
  90. package/lib/executor.js +0 -167
  91. package/lib/executor.js.map +0 -1
  92. package/lib/index.js.map +0 -1
  93. package/lib/interfaces/core.js +0 -247
  94. package/lib/interfaces/core.js.map +0 -1
  95. package/lib/interfaces/destroyable.js +0 -39
  96. package/lib/interfaces/destroyable.js.map +0 -1
  97. package/lib/interfaces/errors.js +0 -49
  98. package/lib/interfaces/errors.js.map +0 -1
  99. package/lib/interfaces/ibind.js +0 -31
  100. package/lib/interfaces/ibind.js.map +0 -1
  101. package/lib/interfaces/idefinition.js +0 -64
  102. package/lib/interfaces/idefinition.js.map +0 -1
  103. package/lib/interfaces/ivalue.js +0 -60
  104. package/lib/interfaces/ivalue.js.map +0 -1
  105. package/lib/models.js +0 -579
  106. package/lib/models.js.map +0 -1
  107. package/lib/node.js +0 -2155
  108. package/lib/node.js.map +0 -1
  109. package/lib/property.js +0 -38
  110. package/lib/property.js.map +0 -1
  111. package/lib/style.js +0 -66
  112. package/lib/style.js.map +0 -1
  113. package/lib/value.js +0 -203
  114. package/lib/value.js.map +0 -1
  115. package/lib/views.js +0 -688
  116. package/lib/views.js.map +0 -1
  117. package/src/attribute.js +0 -70
  118. package/src/bind.js +0 -285
  119. package/src/class.js +0 -96
  120. package/src/executor.js +0 -165
  121. package/src/index.js +0 -20
  122. package/src/interfaces/core.js +0 -248
  123. package/src/interfaces/destroyable.js +0 -37
  124. package/src/interfaces/errors.js +0 -47
  125. package/src/interfaces/ibind.js +0 -29
  126. package/src/interfaces/idefinition.js +0 -62
  127. package/src/interfaces/ivalue.js +0 -58
  128. package/src/models.js +0 -577
  129. package/src/node.js +0 -2162
  130. package/src/property.js +0 -36
  131. package/src/style.js +0 -65
  132. package/src/value.js +0 -201
  133. package/src/views.js +0 -686
  134. package/types/attribute.d.ts +0 -18
  135. package/types/bind.d.ts +0 -72
  136. package/types/class.d.ts +0 -19
  137. package/types/data.d.ts +0 -11
  138. package/types/event.d.ts +0 -10
  139. package/types/executor.d.ts +0 -57
  140. package/types/interfaces/core.d.ts +0 -129
  141. package/types/interfaces/destroyable.d.ts +0 -11
  142. package/types/interfaces/errors.d.ts +0 -24
  143. package/types/interfaces/ibind.d.ts +0 -19
  144. package/types/interfaces/idefinition.d.ts +0 -29
  145. package/types/interfaces/ivalue.d.ts +0 -40
  146. package/types/models.d.ts +0 -179
  147. package/types/node.d.ts +0 -906
  148. package/types/property.d.ts +0 -9
  149. package/types/style.d.ts +0 -28
  150. package/types/value.d.ts +0 -43
  151. package/types/views.d.ts +0 -135
package/.gitlab-ci.yml ADDED
@@ -0,0 +1,20 @@
1
+ # This file is a template, and might need editing before it works on your project.
2
+ # To contribute improvements to CI/CD templates, please follow the Development guide at:
3
+ # https://docs.gitlab.com/ee/development/cicd/templates.html
4
+ # This specific template is located at:
5
+ # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Nodejs.gitlab-ci.yml
6
+
7
+ # Official framework image. Look for the different tagged releases at:
8
+ # https://hub.docker.com/r/library/node/tags/
9
+ image: node:latest
10
+
11
+ # This folder is cached between builds
12
+ # https://docs.gitlab.com/ee/ci/yaml/index.html#cache
13
+ cache:
14
+ paths:
15
+ - node_modules/
16
+
17
+ test_async:
18
+ script:
19
+ - npm install
20
+ - npm run build
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Vasile Lelițac
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,132 +1,173 @@
1
- # Vasille.js
1
+ # Vasille
2
2
 
3
- |Intro|
4
- |:---:|
5
- |![Vasille.js logo](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/logo.png)|
6
- |Vasille.js is **very fast** javascript frontend framework, it is not using virtual DOM, it updates DOM directly using an own reactive mechanism.|
3
+ ![Vasille.js logo](https://gitlab.com/vasille-js/vasille-js/-/raw/v2/img/logo.png)
7
4
 
8
- This framework is in active development, if you want to contribute contact
9
- the maintainer: Lelițac Vasile (lixcode@vivaldi.net).
5
+ `Vasille` core library is frontend solution for `safe`, `fast` & `powerful` applications.
10
6
 
11
- ### Table of content
7
+ ## Table of content
12
8
  [[_TOC_]]
13
9
 
14
10
 
15
- ## Project roadmap
11
+ <hr>
16
12
 
17
- | Feature | Deadline | Status |
18
- |---------------------------------------------|--------------|------------|
19
- | Initial Version | 01.07.2021 | Ready |
20
- | Patch to 1.1 | 02.12.2021 | Ready |
21
- | Describe API | 02.14.2021 | Ready |
22
- | Describe JS API | 02.15.2021 | Ready |
23
- | Describe VCC architecture | 02.22.2021 | Waiting |
24
- | Code and debug VCC | 03.xx.2021 | |
25
- | First enterprise ready version | xx.xx.2021 | |
26
- | Boost by HTML templates | xx.xx.2021 | |
13
+ ## Installation
27
14
 
28
- ## API documentation
15
+ ```
16
+ npm install vasille --save
17
+ ```
18
+
19
+ ### CDN
20
+
21
+ ```html
22
+ <script src="https://unpkg.com/vasille"></script> - ES215 version
23
+ <script src="https://unpkg.com/vasille/cdn/es5.js"></script> - ES5 Compatible version
24
+ ```
25
+
26
+ ### Getting ready be example
27
+ * JavaScript Example
28
+ * TypeScript Example
29
+ * Flow.js Example
30
+
31
+ ### Flow.js typedef
32
+ Add the next line to `[libs]` section in your `.flowconfig` file
33
+ ```
34
+ node_modules/vasille/flow-typed
35
+ ```
36
+
37
+ <hr>
38
+
39
+ ## How SAFE is Vasille
40
+
41
+ The safe of your application is ensured by
42
+ * `100%` coverage of `vasille` code by unit tests.
43
+ Each function, each branch are working as designed.
44
+ * `strong typing` makes your javascript/typescript code safe as C++ code.
45
+ All entities of `vasille` core library are strong typed, including:
46
+ * data fields & properties.
47
+ * computed properties (function parameters & result).
48
+ * methods.
49
+ * events (defined handlers & event emit).
50
+ * DOM events & DOM operation (attributing, styling, etc.).
51
+ * slots of component.
52
+ * references to children.
53
+ * What you write is what you get - there is no hidden operations, you can control everything.
54
+ * No asynchronous code, when the line of code is executed, the DOM and reactive things are already synced.
55
+
56
+ ## How FAST is Vasille
57
+
58
+ The test project was coded using the next frameworks:
59
+ * Angular /
60
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/angular/) /
61
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/angular/).
62
+ * React /
63
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/react/) /
64
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/react/).
65
+ * Vue 2 /
66
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/vue-2/) /
67
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/vue-2/).
68
+ * Vue 3 /
69
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/vue-3/) /
70
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/vue-3/).
71
+ * Svelte /
72
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/svelte/) /
73
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/svelte/).
74
+ * Vasille /
75
+ [Try Initial](https://vasille-js.gitlab.io/project-x32/vasille-js/) /
76
+ [Try Optimized](https://vasille-js.gitlab.io/project-x32-if/vasille-js/).
77
+
78
+ The result of test are demonstrated in figures 1 & 2.
79
+ The test result are measured in FPS (frames per second), which is calculated as `1000 / ft`,
80
+ where `ft` is an average frame time in ms of 20 frames. All values are absolute. Higher is better.
81
+
82
+ The initial version is updating all the page content in each frame.
83
+ The page reactivity connections are very complex, and we get poor results in Angular, React, Vue & Svelte.
84
+
85
+ The optimized version disables the offscreen & non-actual content, which simplifies the
86
+ reactivity complexity in time. Angular & Svelte give result similar to Vasille.
87
+ React & Vue continue to be slow in the beginning of test.
29
88
 
89
+ **Conclusion:** The reactivity system of Vasille is very fast
90
+ and its complexity is not slowing down the application.
91
+
92
+ <hr>
93
+
94
+ &nbsp;
95
+
96
+ Figure 1: Initial version
97
+
98
+ ![results 1](https://gitlab.com/vasille-js/vasille-js/-/raw/v2/img/scores-wo.png)
99
+
100
+ <hr>
101
+
102
+ &nbsp;
103
+
104
+ Figure 2: Optimized version
105
+
106
+ ![results 2](https://gitlab.com/vasille-js/vasille-js/-/raw/v2/img/scores-o.png)
107
+
108
+ <hr>
109
+
110
+ ## How POWERFUL is Vasille
111
+
112
+ The secret of `Vasille` is a good task decomposition. The core library is composed of
113
+ an effective reactive module and a DOM generation engine based on it.
114
+
115
+ <hr>
116
+
117
+ ### Reactivity Module
118
+
119
+ Reactivity module is used to create a model of data. It can contain self-updating values,
120
+ forward-only shared data. Reactivity of objects/fields can be disabled/enabled manually.
121
+
122
+ ![Reactivity Module](https://gitlab.com/vasille-js/vasille-js/-/raw/v2/img/reactive.png)
123
+
124
+ * `Destroyable` is an entity which has a custom destructor.
125
+ * `IValue<T>` is a common interface for any value container, with next members:
126
+ * `get $` gets the encapsulated value.
127
+ * `set $` manually update the encapsulated value, if enabled triggers updating of all linked data.
128
+ * `disable` disables the reactivity.
129
+ * `enable` enables the reactivity and triggers updating of all linked data.
130
+ * `Reference<T>` contains a value of type `T`.
131
+ * `Mirror<T>` syncs self value with another `IValue` container, can be used to share a value forward-only.
132
+ * `Pointer<T>` same as `Mirror`, but it can switch between `IValue` target anytime.
133
+ * `Expression<ReturnType, Args...>` is a self-updating value.
134
+ * `Reactive` is a reactive object which can have multiple reactive fields, emit/receive events/signals.
135
+
136
+ <hr>
137
+
138
+ ### DOM Generation Engine
139
+
140
+ DOM Generation Engine is used to describe a virtual DOM of reactive fragments,
141
+ which will be reflected into a browser DOM and keep up to date it.
142
+
143
+ ![DOM Generation Engine](https://gitlab.com/vasille-js/vasille-js/-/raw/v2/img/nodes.png)
144
+
145
+ * `Fragment` describes a virtual DOM node, which has siblings, children, parent & slots.
146
+ * `TextNode` reflects a `Text` node.
147
+ * `INode` reflects a `Element` node.
148
+ * `Tag` reflect a self created `Element` node.
149
+ * `Extension` reflects an existing `Element` node.
150
+ * `Component` reflects a `Element` node created by a `Tag` child.
151
+ * `AppNode` is root of a `Vasille` application, can be used to create applications in application.
152
+ * `App` is root of a definitive `Vasille` application.
153
+ * `DebugNode` reflects a `Comment` node, useful for debug.
154
+ * `Watch` recompose children nodes on model value change.
155
+ * `RepeatNode` creates multiples children nodes using the same code multiple time.
156
+ * `Repeater` repeat slot content `n` times.
157
+ * `BaseView` represent a view in context of MVC (Model-View-Controller).
158
+ * `ObjectView` repeats slot content for each value of `ObjectModel`.
159
+ * `MapView` repeats slot content for each `MapModel` value.
160
+ * `SetView` repeats slot content for each `SetModel` value.
161
+ * `ArrayView` repeats slot content for each `ArrayModel` value respecting its order.
162
+ * `InterceptorNode` is used to send an event/signal from one child to other
163
+ without manually creating of interceptors.
164
+
165
+ ## API documentation
30
166
 
31
- Currently, the [API](pages/API.md) is in development,
32
- but the [JavaScript API](pages/JavaScriptAPI.md)
33
- is available.
34
-
35
- * [API Documentation](https://gitlab.com/vasille-js/vasille-js/-/blob/master/pages/API.md)
36
- * [JS API Documentation](https://gitlab.com/vasille-js/vasille-js/-/blob/master/pages/JavaScriptAPI.md)
37
-
38
- ## Tools in development
39
-
40
- * **Vasille.js** is a component based framework without any dependencies
41
- * **Reactive Reference** is a build in reactivity library of Vasille.js
42
- * **Vasille Language** is a user-friendy language to describe Vasille.js
43
- components
44
- * **VCC** (*Vasille Component Compiler*) translate code from Vasille
45
- language to high-effective Vasille.js components performing a
46
- lot of performance improvements.
47
-
48
- ## How it works
49
-
50
- To test the speed of frameworks (inclusive Vasille JS) I had created a map,
51
- which can be zoomed up to 32x, this project was called "Project x32".
52
-
53
- On the next image is demonstrated the difference between 1x zoom (on the
54
- left side) and x32 zoom (on the right side):
55
- ![x1-x32](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/x1-x32.png)
56
-
57
- There are 100 random squares over each brick, on small zoom the squares
58
- are hidden to optimize browser performance, because the page is composed
59
- of over than 23 000 nodes. The random squares added one by one to not
60
- freeze zoom animation. The zoom animation duration is 300ms, and it
61
- must consist of 20 frames on 60Hz screen.
62
-
63
- The project x32 was coded using the next frameworks:
64
- * Angular.
65
- * React.
66
- * Vue 2.
67
- * Vue 3.
68
- * Svelte.
69
- * Vasille JS.
70
-
71
- ### Measuring zoom performance
72
-
73
- After zooming in each production build and measuring performance
74
- I had got the next results:
75
- ![results 1](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/scores-wo.png)
76
-
77
- The Vue & React builds are the slowest: the average frame time of:
78
- * React build is 1263.48ms.
79
- * Vue 3 build is 971.80ms.
80
- * Vue 2 build is 823.56ms.
81
-
82
- There is the same graphic in logarithmic scale:
83
- ![results 1](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/scores-wo-log.png)
84
-
85
- Let's analyze the Angular, Svelte & Vasille JS results:
86
- * Angular & Svelte has a similar result, the average time of frame
87
- is 53.94ms for Angular & 53.98 for Svelte.
88
- * The Vasille JS is the unique framework which support the zoom
89
- animation at 60fps without any additional optimization.
90
- Average time of frame is 3.22ms.
91
-
92
- #### Try it:
93
- * [Project x32 powered by Angular](https://vasille-js.gitlab.io/project-x32/angular/)
94
- * [Project x32 powered by React](https://vasille-js.gitlab.io/project-x32/react/)
95
- * [Project x32 powered by Vue 2](https://vasille-js.gitlab.io/project-x32/vue-2/)
96
- * [Project x32 powered by Vue 3](https://vasille-js.gitlab.io/project-x32/vue-3/)
97
- * [Project x32 powered by Svelte](https://vasille-js.gitlab.io/project-x32/svelte/)
98
- * [Project x32 powered by Vasille JS](https://vasille-js.gitlab.io/project-x32/vasille-js/)
99
-
100
- ### Let's optimize Project x32
101
-
102
- To optimize the Project x32 realizations, the optimization consist
103
- of removing the off-screen components, that change will decrease
104
- the number of components. So let's zoom each optimized build
105
- from x1 to x32.
106
-
107
- Tests results:
108
- ![results 2](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/scores-o.png)
109
-
110
- After X8 the number of onscreen components is very small, the optimization has a good result.
111
- The Reactive frameworks are the slowest before and after optimization.
112
-
113
- There is the same graphic in logarithmic scale:
114
- ![results 2](https://gitlab.com/vasille-js/vasille-js/-/raw/master/img/scores-o-log.png)
115
-
116
- After optimization Angular, Svelte & Vasille JS has very good
117
- results close to Vasille JS before optimization.
118
-
119
- #### Try it:
120
- * [Optimized Project x32 powered by Angular](https://vasille-js.gitlab.io/project-x32-if/angular/)
121
- * [Optimized Project x32 powered by React](https://vasille-js.gitlab.io/project-x32-if/react/)
122
- * [Optimized Project x32 powered by Vue 2](https://vasille-js.gitlab.io/project-x32-if/vue-2/)
123
- * [Optimized Project x32 powered by Vue 3](https://vasille-js.gitlab.io/project-x32-if/vue-3/)
124
- * [Optimized Project x32 powered by Svelte](https://vasille-js.gitlab.io/project-x32-if/svelte/)
125
- * [Optimized Project x32 powered by Vasille JS](https://vasille-js.gitlab.io/project-x32-if/vasille-js/)
126
-
127
- ## Conclusions
128
- The main goal of Vasille JS is not to be the fastest JavaScript framework,
129
- but to ensure excellent performance without any optimizations.
167
+ There are several API, and most of it are WIP (Work In Progress):
168
+ * [OOP API - Ready](https://gitlab.com/vasille-js/vasille-js/-/blob/v2/pages/OOP-API.md)
169
+ * [Procedural API - WIP](https://gitlab.com/vasille-js/vasille-js/-/blob/v2/pages/Procedural-API.md)
170
+ * [Final API - WIP](https://gitlab.com/vasille-js/vasille-js/-/blob/v2/pages/API.md)
130
171
 
131
172
  ## Questions
132
173