diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..11a8f13 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,76 @@ +{ + "cmake.configureOnOpen": false, + "files.associations": { + "algorithm": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "format": "cpp", + "forward_list": "cpp", + "fstream": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "locale": "cpp", + "map": "cpp", + "memory": "cpp", + "mutex": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "set": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocbuf": "cpp", + "xlocinfo": "cpp", + "xlocmes": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstddef": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" + } +} \ No newline at end of file diff --git a/README.md b/README.md index d63a6a1..e2d0b3a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,58 @@ **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 1 - Flocking** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Richard Chen + * [LinkedIn](https://www.linkedin.com/in/richardrlchen) +* Tested on: Windows 11, i7-10875H @ 2.3GHz 16GB, RTX 2060 MAX-Q 6GB (Personal Computer) -### (TODO: Your README) +## Overview +This project involved computing and rendering flocks of boids all on the GPU. +First was a naive O(n^2) approach that involved pairwise checking all the boids. +Next, a uniform grid data structure was employed so that only close boids would be checked, reducing the amount of math needed. Lastly, the uniform grid was improved by rearranging the buffers on the GPU rather than adding a layer of indirection. This should greatly improve memory access times. + +## Videos and Images +100,000 Boids +<br> +<img src="images/recording1.gif"> + +10,000 Boids +<br> +<img src="images/recording2.gif"> + +### Naive Implementation +Naive barely handles 50k Boids +<br> +<img src="images/naiveIsSlow.png"> + +### Uniform Grid +Uniform Grid handles 50k Boids just fine +<br> +<img src="images/uniformIsFine.png"> + +## Performance +Visualize On +<br> +<img src="images/Visualize On.svg"> + +Visualize Off +<br> +<img src="images/Visualize Off.svg"> + +* As the number of boids increases, the naive approach does not scale +* At lower boid numbers, the coherent approach incurs overhead from reshuffling arrays but with more boids, the memory indirection time saved overcomes this + +Block Size +<br> +<img src="images/blocksize.svg"> + +## Questions +* Increasing the boids increases the number of computations needed. With the naive +implmentation acting on every pair, it is O(n^2) while for the spatial grid based +implementations, the repelling behavior at close distances means that we should not +hit the strict n choose 2 case. +* Each Streaming Multiprocessor runs one warp at a time so as long as all the SMs are saturated, +there should not be a significant difference +* The coherent grid trades some extra copies and assigns to avoid reading from slow memory and needing to refresh the cache. With a small number of boids, the overhead outweighs the time saved but large boid numbers is where it shines +* The performance was slightly slower but perhaps it could have benefits as the physical area being checked is smaller, it just has to be done in a way that the extra checks overhead is compensated for by the time saved checking a smaller area, perhaps with high boid density and large grid squares. As it currently was for +50,000 boids on the coherent implmentation, the fps dropped from around 360 to 333. -Include screenshots, analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) diff --git a/images/Visualize Off.svg b/images/Visualize Off.svg new file mode 100644 index 0000000..1ba4a5b --- /dev/null +++ b/images/Visualize Off.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 600.0 371.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" width="600" height="371" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" d="M0 0L600.0 0L600.0 371.0L0 371.0L0 0Z" fill-rule="nonzero"/><path stroke="#333333" stroke-width="1.0" stroke-linecap="butt" d="M84.5 300.5L581.5 300.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M84.5 229.5L581.5 229.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M84.5 159.5L581.5 159.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M84.5 88.5L581.5 88.5" fill-rule="nonzero"/><clipPath id="id_0"><path d="M84.55 88.28333L581.45 88.28333L581.45 300.45L84.55 300.45L84.55 88.28333Z" clip-rule="nonzero"/></clipPath><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M168.0 300.0L138.0 300.0L138.0 268.0C138.0 266.89542 138.89543 266.0 140.0 266.0L166.0 266.0C167.10457 266.0 168.0 266.89542 168.0 268.0Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M168.0 300.0L138.0 300.0L138.0 268.0C138.0 266.89542 138.89543 266.0 140.0 266.0L166.0 266.0C167.10457 266.0 168.0 266.89542 168.0 268.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M316.0 300.0L286.0 300.0L286.0 300.0C286.0 300.0 286.0 300.0 286.0 300.0L316.0 300.0C316.0 300.0 316.0 300.0 316.0 300.0Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M316.0 300.0L286.0 300.0L286.0 300.0C286.0 300.0 286.0 300.0 286.0 300.0L316.0 300.0C316.0 300.0 316.0 300.0 316.0 300.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M464.0 300.0L434.0 300.0L434.0 300.0L464.0 300.0Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M464.0 300.0L434.0 300.0L434.0 300.0L464.0 300.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M200.0 300.0L170.0 300.0L170.0 90.0C170.0 88.89543 170.89543 88.0 172.0 88.0L198.0 88.0C199.10457 88.0 200.0 88.89543 200.0 90.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M200.0 300.0L170.0 300.0L170.0 90.0C170.0 88.89543 170.89543 88.0 172.0 88.0L198.0 88.0C199.10457 88.0 200.0 88.89543 200.0 90.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M348.0 300.0L318.0 300.0L318.0 211.0C318.0 209.89543 318.89542 209.0 320.0 209.0L346.0 209.0C347.10458 209.0 348.0 209.89543 348.0 211.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M348.0 300.0L318.0 300.0L318.0 211.0C318.0 209.89543 318.89542 209.0 320.0 209.0L346.0 209.0C347.10458 209.0 348.0 209.89543 348.0 211.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M496.0 300.0L466.0 300.0L466.0 296.0C466.0 294.89542 466.89542 294.0 468.0 294.0L494.0 294.0C495.10458 294.0 496.0 294.89542 496.0 296.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M496.0 300.0L466.0 300.0L466.0 296.0C466.0 294.89542 466.89542 294.0 468.0 294.0L494.0 294.0C495.10458 294.0 496.0 294.89542 496.0 296.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M232.0 300.0L202.0 300.0L202.0 119.0C202.0 117.89543 202.89543 117.0 204.0 117.0L230.0 117.0C231.10457 117.0 232.0 117.89543 232.0 119.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M232.0 300.0L202.0 300.0L202.0 119.0C202.0 117.89543 202.89543 117.0 204.0 117.0L230.0 117.0C231.10457 117.0 232.0 117.89543 232.0 119.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M380.0 300.0L350.0 300.0L350.0 189.0C350.0 187.89543 350.89542 187.0 352.0 187.0L378.0 187.0C379.10458 187.0 380.0 187.89543 380.0 189.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M380.0 300.0L350.0 300.0L350.0 189.0C350.0 187.89543 350.89542 187.0 352.0 187.0L378.0 187.0C379.10458 187.0 380.0 187.89543 380.0 189.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M528.0 300.0L498.0 300.0L498.0 296.0C498.0 294.89542 498.89542 294.0 500.0 294.0L526.0 294.0C527.10455 294.0 528.0 294.89542 528.0 296.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M528.0 300.0L498.0 300.0L498.0 296.0C498.0 294.89542 498.89542 294.0 500.0 294.0L526.0 294.0C527.10455 294.0 528.0 294.89542 528.0 296.0Z" fill-rule="nonzero"/><path fill="#000000" d="M317.875 349.45L317.875 340.85626L321.10938 340.85626Q322.09375 340.85626 322.6875 341.1219Q323.28125 341.3875 323.60938 341.9344Q323.95312 342.46564 323.95312 343.0594Q323.95312 343.60626 323.65625 344.09064Q323.35938 344.575 322.75 344.8719Q323.53125 345.10626 323.9375 345.66876Q324.35938 346.21564 324.35938 346.96564Q324.35938 347.5594 324.10938 348.09064Q323.85938 348.60626 323.48438 348.8875Q323.10938 349.16876 322.53125 349.3094Q321.96875 349.45 321.15625 349.45L317.875 349.45ZM319.01562 344.46564L320.875 344.46564Q321.625 344.46564 321.95312 344.3719Q322.39062 344.2469 322.60938 343.95Q322.82812 343.6375 322.82812 343.1844Q322.82812 342.7625 322.625 342.4344Q322.42188 342.10626 322.03125 341.9969Q321.65625 341.8719 320.73438 341.8719L319.01562 341.8719L319.01562 344.46564ZM319.01562 348.4344L321.15625 348.4344Q321.70312 348.4344 321.92188 348.3875Q322.32812 348.325 322.57812 348.16876Q322.84375 347.9969 323.01562 347.6844Q323.1875 347.3719 323.1875 346.96564Q323.1875 346.48126 322.9375 346.1219Q322.70312 345.7625 322.26562 345.6219Q321.82812 345.48126 321.0 345.48126L319.01562 345.48126L319.01562 348.4344ZM325.40625 346.34064Q325.40625 344.60626 326.35938 343.77814Q327.15625 343.09064 328.3125 343.09064Q329.59375 343.09064 330.40625 343.9344Q331.23438 344.7625 331.23438 346.2469Q331.23438 347.45 330.875 348.1375Q330.51562 348.825 329.8125 349.21564Q329.125 349.59064 328.3125 349.59064Q327.01562 349.59064 326.20312 348.7625Q325.40625 347.91876 325.40625 346.34064ZM326.48438 346.34064Q326.48438 347.52814 327.0 348.1219Q327.53125 348.71564 328.3125 348.71564Q329.10938 348.71564 329.625 348.1219Q330.14062 347.52814 330.14062 346.3094Q330.14062 345.15314 329.60938 344.5594Q329.09375 343.96564 328.3125 343.96564Q327.53125 343.96564 327.0 344.5594Q326.48438 345.1375 326.48438 346.34064ZM332.79688 342.075L332.79688 340.85626L333.85938 340.85626L333.85938 342.075L332.79688 342.075ZM332.79688 349.45L332.79688 343.23126L333.85938 343.23126L333.85938 349.45L332.79688 349.45ZM339.82812 349.45L339.82812 348.66876Q339.23438 349.59064 338.09375 349.59064Q337.34375 349.59064 336.71875 349.1844Q336.09375 348.7625 335.75 348.02814Q335.40625 347.29376 335.40625 346.34064Q335.40625 345.41876 335.71875 344.65314Q336.03125 343.8875 336.65625 343.4969Q337.28125 343.09064 338.04688 343.09064Q338.60938 343.09064 339.04688 343.325Q339.48438 343.5594 339.76562 343.9344L339.76562 340.85626L340.8125 340.85626L340.8125 349.45L339.82812 349.45ZM336.5 346.34064Q336.5 347.54376 337.0 348.1375Q337.5 348.71564 338.1875 348.71564Q338.875 348.71564 339.35938 348.15314Q339.84375 347.59064 339.84375 346.4344Q339.84375 345.15314 339.34375 344.5594Q338.85938 343.96564 338.14062 343.96564Q337.4375 343.96564 336.96875 344.54376Q336.5 345.10626 336.5 346.34064ZM342.375 347.59064L343.40625 347.4344Q343.5 348.0594 343.89062 348.3875Q344.29688 348.71564 345.03125 348.71564Q345.75 348.71564 346.09375 348.4344Q346.45312 348.1375 346.45312 347.73126Q346.45312 347.3719 346.14062 347.16876Q345.92188 347.02814 345.0625 346.8094Q343.90625 346.5125 343.45312 346.3094Q343.01562 346.09064 342.78125 345.71564Q342.54688 345.34064 342.54688 344.8719Q342.54688 344.46564 342.73438 344.10626Q342.92188 343.7469 343.25 343.5125Q343.5 343.34064 343.92188 343.21564Q344.34375 343.09064 344.84375 343.09064Q345.5625 343.09064 346.10938 343.3094Q346.67188 343.5125 346.9375 343.8719Q347.20312 344.23126 347.29688 344.825L346.26562 344.96564Q346.20312 344.4969 345.85938 344.23126Q345.53125 343.95 344.90625 343.95Q344.1875 343.95 343.875 344.2Q343.5625 344.4344 343.5625 344.7625Q343.5625 344.96564 343.6875 345.1219Q343.82812 345.29376 344.09375 345.40314Q344.25 345.46564 345.03125 345.66876Q346.15625 345.98126 346.59375 346.16876Q347.03125 346.35626 347.28125 346.71564Q347.53125 347.075 347.53125 347.6219Q347.53125 348.15314 347.21875 348.6219Q346.92188 349.075 346.34375 349.34064Q345.76562 349.59064 345.03125 349.59064Q343.8125 349.59064 343.17188 349.09064Q342.54688 348.575 342.375 347.59064Z" fill-rule="nonzero"/><path fill="#000000" d="M29.550013 211.3823L20.956263 211.3823L20.956263 205.58542L21.971888 205.58542L21.971888 210.24167L24.628138 210.24167L24.628138 206.21042L25.643763 206.21042L25.643763 210.24167L29.550013 210.24167L29.550013 211.3823ZM29.550013 204.4448L20.956263 204.4448L20.956263 201.1948Q20.956263 200.35104 21.034388 199.89792Q21.143763 199.2573 21.440638 198.83542Q21.737513 198.39792 22.268763 198.14792Q22.800013 197.8823 23.440638 197.8823Q24.534388 197.8823 25.300013 198.58542Q26.050013 199.27292 26.050013 201.10104L26.050013 203.30417L29.550013 203.30417L29.550013 204.4448ZM25.050013 203.30417L25.050013 201.08542Q25.050013 199.97604 24.643763 199.52292Q24.221888 199.05417 23.471888 199.05417Q22.940638 199.05417 22.565638 199.33542Q22.175013 199.60104 22.050013 200.03854Q21.971888 200.33542 21.971888 201.10104L21.971888 203.30417L25.050013 203.30417ZM26.784388 196.8198L26.690638 195.7573Q27.346888 195.67917 27.753138 195.39792Q28.159388 195.11667 28.425013 194.53854Q28.675013 193.9448 28.675013 193.21042Q28.675013 192.5698 28.487513 192.0698Q28.284388 191.5698 27.956263 191.33542Q27.612513 191.08542 27.221888 191.08542Q26.815638 191.08542 26.518763 191.3198Q26.206263 191.55417 26.003138 192.08542Q25.862513 192.4448 25.581263 193.6323Q25.300013 194.80417 25.050013 195.27292Q24.721888 195.89792 24.253138 196.1948Q23.768763 196.49167 23.175013 196.49167Q22.534388 196.49167 21.971888 196.1323Q21.393763 195.7573 21.112513 195.05417Q20.815638 194.33542 20.815638 193.47604Q20.815638 192.52292 21.128138 191.78854Q21.425013 191.05417 22.034388 190.66354Q22.628138 190.27292 23.378138 190.24167L23.456263 191.33542Q22.643763 191.42917 22.237513 191.9448Q21.815638 192.4448 21.815638 193.42917Q21.815638 194.46042 22.190638 194.92917Q22.565638 195.39792 23.096888 195.39792Q23.565638 195.39792 23.862513 195.0698Q24.159388 194.74167 24.471888 193.36667Q24.784388 191.97604 25.018763 191.46042Q25.378138 190.71042 25.909388 190.35104Q26.425013 189.99167 27.128138 189.99167Q27.815638 189.99167 28.425013 190.3823Q29.018763 190.77292 29.362513 191.5073Q29.690638 192.24167 29.690638 193.16354Q29.690638 194.33542 29.362513 195.1323Q29.018763 195.91354 28.331263 196.36667Q27.643763 196.80417 26.784388 196.8198Z" fill-rule="nonzero"/><path fill="#000000" d="M72.05 300.21564Q72.05 298.6844 72.3625 297.7625Q72.675 296.825 73.28438 296.325Q73.90938 295.825 74.84688 295.825Q75.53438 295.825 76.05 296.10626Q76.58125 296.3875 76.925 296.91876Q77.26875 297.4344 77.45625 298.1844Q77.64375 298.9344 77.64375 300.21564Q77.64375 301.73126 77.33125 302.65314Q77.03438 303.575 76.40938 304.09064Q75.8 304.59064 74.84688 304.59064Q73.6125 304.59064 72.89375 303.7Q72.05 302.6375 72.05 300.21564ZM73.12813 300.21564Q73.12813 302.325 73.62813 303.02814Q74.12813 303.73126 74.84688 303.73126Q75.58125 303.73126 76.06563 303.02814Q76.56563 302.325 76.56563 300.21564Q76.56563 298.09064 76.06563 297.40314Q75.58125 296.7 74.83125 296.7Q74.1125 296.7 73.675 297.3094Q73.12813 298.09064 73.12813 300.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M58.05 231.47778L59.159374 231.38403Q59.284374 232.19653 59.721874 232.60278Q60.175 233.00903 60.815624 233.00903Q61.565624 233.00903 62.096874 232.43091Q62.628124 231.85278 62.628124 230.91528Q62.628124 230.00903 62.1125 229.49341Q61.6125 228.96216 60.784374 228.96216Q60.284374 228.96216 59.8625 229.19653Q59.45625 229.43091 59.221874 229.79028L58.2375 229.66528L59.065624 225.25903L63.346874 225.25903L63.346874 226.25903L59.909374 226.25903L59.45625 228.57153Q60.221874 228.02466 61.065624 228.02466Q62.190624 228.02466 62.95625 228.80591Q63.7375 229.58716 63.7375 230.82153Q63.7375 231.97778 63.065624 232.83716Q62.2375 233.86841 60.815624 233.86841Q59.64375 233.86841 58.89375 233.21216Q58.159374 232.55591 58.05 231.47778ZM65.05 229.49341Q65.05 227.96216 65.3625 227.04028Q65.675 226.10278 66.28438 225.60278Q66.90938 225.10278 67.84688 225.10278Q68.53438 225.10278 69.05 225.38403Q69.58125 225.66528 69.925 226.19653Q70.26875 226.71216 70.45625 227.46216Q70.64375 228.21216 70.64375 229.49341Q70.64375 231.00903 70.33125 231.93091Q70.03438 232.85278 69.40938 233.36841Q68.8 233.86841 67.84688 233.86841Q66.6125 233.86841 65.89375 232.97778Q65.05 231.91528 65.05 229.49341ZM66.12813 229.49341Q66.12813 231.60278 66.62813 232.30591Q67.12813 233.00903 67.84688 233.00903Q68.58125 233.00903 69.06563 232.30591Q69.56563 231.60278 69.56563 229.49341Q69.56563 227.36841 69.06563 226.68091Q68.58125 225.97778 67.83125 225.97778Q67.1125 225.97778 66.675 226.58716Q66.12813 227.36841 66.12813 229.49341ZM72.05 229.49341Q72.05 227.96216 72.3625 227.04028Q72.675 226.10278 73.28438 225.60278Q73.90938 225.10278 74.84688 225.10278Q75.53438 225.10278 76.05 225.38403Q76.58125 225.66528 76.925 226.19653Q77.26875 226.71216 77.45625 227.46216Q77.64375 228.21216 77.64375 229.49341Q77.64375 231.00903 77.33125 231.93091Q77.03438 232.85278 76.40938 233.36841Q75.8 233.86841 74.84688 233.86841Q73.6125 233.86841 72.89375 232.97778Q72.05 231.91528 72.05 229.49341ZM73.12813 229.49341Q73.12813 231.60278 73.62813 232.30591Q74.12813 233.00903 74.84688 233.00903Q75.58125 233.00903 76.06563 232.30591Q76.56563 231.60278 76.56563 229.49341Q76.56563 227.36841 76.06563 226.68091Q75.58125 225.97778 74.83125 225.97778Q74.1125 225.97778 73.675 226.58716Q73.12813 227.36841 73.12813 229.49341Z" fill-rule="nonzero"/><path fill="#000000" d="M55.01875 163.00555L53.971874 163.00555L53.971874 156.2868Q53.58125 156.64618 52.95625 157.02118Q52.346874 157.38055 51.8625 157.55243L51.8625 156.5368Q52.7375 156.11493 53.39375 155.5368Q54.065624 154.94305 54.346874 154.38055L55.01875 154.38055L55.01875 163.00555ZM58.05 158.77118Q58.05 157.23993 58.3625 156.31805Q58.675 155.38055 59.284374 154.88055Q59.909374 154.38055 60.846874 154.38055Q61.534374 154.38055 62.05 154.6618Q62.58125 154.94305 62.925 155.4743Q63.26875 155.98993 63.45625 156.73993Q63.64375 157.48993 63.64375 158.77118Q63.64375 160.2868 63.33125 161.20868Q63.034374 162.13055 62.409374 162.64618Q61.8 163.14618 60.846874 163.14618Q59.6125 163.14618 58.89375 162.25555Q58.05 161.19305 58.05 158.77118ZM59.128124 158.77118Q59.128124 160.88055 59.628124 161.58368Q60.128124 162.2868 60.846874 162.2868Q61.58125 162.2868 62.065624 161.58368Q62.565624 160.88055 62.565624 158.77118Q62.565624 156.64618 62.065624 155.95868Q61.58125 155.25555 60.83125 155.25555Q60.1125 155.25555 59.675 155.86493Q59.128124 156.64618 59.128124 158.77118ZM65.05 158.77118Q65.05 157.23993 65.3625 156.31805Q65.675 155.38055 66.28438 154.88055Q66.90938 154.38055 67.84688 154.38055Q68.53438 154.38055 69.05 154.6618Q69.58125 154.94305 69.925 155.4743Q70.26875 155.98993 70.45625 156.73993Q70.64375 157.48993 70.64375 158.77118Q70.64375 160.2868 70.33125 161.20868Q70.03438 162.13055 69.40938 162.64618Q68.8 163.14618 67.84688 163.14618Q66.6125 163.14618 65.89375 162.25555Q65.05 161.19305 65.05 158.77118ZM66.12813 158.77118Q66.12813 160.88055 66.62813 161.58368Q67.12813 162.2868 67.84688 162.2868Q68.58125 162.2868 69.06563 161.58368Q69.56563 160.88055 69.56563 158.77118Q69.56563 156.64618 69.06563 155.95868Q68.58125 155.25555 67.83125 155.25555Q67.1125 155.25555 66.675 155.86493Q66.12813 156.64618 66.12813 158.77118ZM72.05 158.77118Q72.05 157.23993 72.3625 156.31805Q72.675 155.38055 73.28438 154.88055Q73.90938 154.38055 74.84688 154.38055Q75.53438 154.38055 76.05 154.6618Q76.58125 154.94305 76.925 155.4743Q77.26875 155.98993 77.45625 156.73993Q77.64375 157.48993 77.64375 158.77118Q77.64375 160.2868 77.33125 161.20868Q77.03438 162.13055 76.40938 162.64618Q75.8 163.14618 74.84688 163.14618Q73.6125 163.14618 72.89375 162.25555Q72.05 161.19305 72.05 158.77118ZM73.12813 158.77118Q73.12813 160.88055 73.62813 161.58368Q74.12813 162.2868 74.84688 162.2868Q75.58125 162.2868 76.06563 161.58368Q76.56563 160.88055 76.56563 158.77118Q76.56563 156.64618 76.06563 155.95868Q75.58125 155.25555 74.83125 155.25555Q74.1125 155.25555 73.675 155.86493Q73.12813 156.64618 73.12813 158.77118Z" fill-rule="nonzero"/><path fill="#000000" d="M55.01875 92.28333L53.971874 92.28333L53.971874 85.56458Q53.58125 85.92396 52.95625 86.29896Q52.346874 86.65833 51.8625 86.83021L51.8625 85.81458Q52.7375 85.39271 53.39375 84.81458Q54.065624 84.22083 54.346874 83.65833L55.01875 83.65833L55.01875 92.28333ZM58.05 90.03333L59.159374 89.93958Q59.284374 90.75208 59.721874 91.15833Q60.175 91.56458 60.815624 91.56458Q61.565624 91.56458 62.096874 90.98646Q62.628124 90.40833 62.628124 89.47083Q62.628124 88.56458 62.1125 88.04896Q61.6125 87.51771 60.784374 87.51771Q60.284374 87.51771 59.8625 87.75208Q59.45625 87.98646 59.221874 88.34583L58.2375 88.22083L59.065624 83.81458L63.346874 83.81458L63.346874 84.81458L59.909374 84.81458L59.45625 87.12708Q60.221874 86.58021 61.065624 86.58021Q62.190624 86.58021 62.95625 87.36146Q63.7375 88.14271 63.7375 89.37708Q63.7375 90.53333 63.065624 91.39271Q62.2375 92.42396 60.815624 92.42396Q59.64375 92.42396 58.89375 91.76771Q58.159374 91.11146 58.05 90.03333ZM65.05 88.04896Q65.05 86.51771 65.3625 85.59583Q65.675 84.65833 66.28438 84.15833Q66.90938 83.65833 67.84688 83.65833Q68.53438 83.65833 69.05 83.93958Q69.58125 84.22083 69.925 84.75208Q70.26875 85.26771 70.45625 86.01771Q70.64375 86.76771 70.64375 88.04896Q70.64375 89.56458 70.33125 90.48646Q70.03438 91.40833 69.40938 91.92396Q68.8 92.42396 67.84688 92.42396Q66.6125 92.42396 65.89375 91.53333Q65.05 90.47083 65.05 88.04896ZM66.12813 88.04896Q66.12813 90.15833 66.62813 90.86146Q67.12813 91.56458 67.84688 91.56458Q68.58125 91.56458 69.06563 90.86146Q69.56563 90.15833 69.56563 88.04896Q69.56563 85.92396 69.06563 85.23646Q68.58125 84.53333 67.83125 84.53333Q67.1125 84.53333 66.675 85.14271Q66.12813 85.92396 66.12813 88.04896ZM72.05 88.04896Q72.05 86.51771 72.3625 85.59583Q72.675 84.65833 73.28438 84.15833Q73.90938 83.65833 74.84688 83.65833Q75.53438 83.65833 76.05 83.93958Q76.58125 84.22083 76.925 84.75208Q77.26875 85.26771 77.45625 86.01771Q77.64375 86.76771 77.64375 88.04896Q77.64375 89.56458 77.33125 90.48646Q77.03438 91.40833 76.40938 91.92396Q75.8 92.42396 74.84688 92.42396Q73.6125 92.42396 72.89375 91.53333Q72.05 90.47083 72.05 88.04896ZM73.12813 88.04896Q73.12813 90.15833 73.62813 90.86146Q74.12813 91.56458 74.84688 91.56458Q75.58125 91.56458 76.06563 90.86146Q76.56563 90.15833 76.56563 88.04896Q76.56563 85.92396 76.06563 85.23646Q75.58125 84.53333 74.83125 84.53333Q74.1125 84.53333 73.675 85.14271Q73.12813 85.92396 73.12813 88.04896Z" fill-rule="nonzero"/><path fill="#000000" d="M171.17165 315.2L172.28102 315.10626Q172.40602 315.91876 172.84352 316.325Q173.29665 316.73126 173.93727 316.73126Q174.68727 316.73126 175.21852 316.15314Q175.74977 315.575 175.74977 314.6375Q175.74977 313.73126 175.23415 313.21564Q174.73415 312.6844 173.90602 312.6844Q173.40602 312.6844 172.98415 312.91876Q172.5779 313.15314 172.34352 313.5125L171.35915 313.3875L172.18727 308.98126L176.46852 308.98126L176.46852 309.98126L173.03102 309.98126L172.5779 312.29376Q173.34352 311.7469 174.18727 311.7469Q175.31227 311.7469 176.0779 312.52814Q176.85915 313.3094 176.85915 314.54376Q176.85915 315.7 176.18727 316.5594Q175.35915 317.59064 173.93727 317.59064Q172.7654 317.59064 172.0154 316.9344Q171.28102 316.27814 171.17165 315.2ZM178.17165 313.21564Q178.17165 311.6844 178.48415 310.7625Q178.79665 309.825 179.40602 309.325Q180.03102 308.825 180.96852 308.825Q181.65602 308.825 182.17165 309.10626Q182.7029 309.3875 183.04665 309.91876Q183.3904 310.4344 183.5779 311.1844Q183.7654 311.9344 183.7654 313.21564Q183.7654 314.73126 183.4529 315.65314Q183.15602 316.575 182.53102 317.09064Q181.92165 317.59064 180.96852 317.59064Q179.73415 317.59064 179.0154 316.7Q178.17165 315.6375 178.17165 313.21564ZM179.24977 313.21564Q179.24977 315.325 179.74977 316.02814Q180.24977 316.73126 180.96852 316.73126Q181.7029 316.73126 182.18727 316.02814Q182.68727 315.325 182.68727 313.21564Q182.68727 311.09064 182.18727 310.40314Q181.7029 309.7 180.9529 309.7Q180.23415 309.7 179.79665 310.3094Q179.24977 311.09064 179.24977 313.21564ZM185.17165 313.21564Q185.17165 311.6844 185.48415 310.7625Q185.79665 309.825 186.40602 309.325Q187.03102 308.825 187.96852 308.825Q188.65602 308.825 189.17165 309.10626Q189.7029 309.3875 190.04665 309.91876Q190.3904 310.4344 190.5779 311.1844Q190.7654 311.9344 190.7654 313.21564Q190.7654 314.73126 190.4529 315.65314Q190.15602 316.575 189.53102 317.09064Q188.92165 317.59064 187.96852 317.59064Q186.73415 317.59064 186.0154 316.7Q185.17165 315.6375 185.17165 313.21564ZM186.24977 313.21564Q186.24977 315.325 186.74977 316.02814Q187.24977 316.73126 187.96852 316.73126Q188.7029 316.73126 189.18727 316.02814Q189.68727 315.325 189.68727 313.21564Q189.68727 311.09064 189.18727 310.40314Q188.7029 309.7 187.9529 309.7Q187.23415 309.7 186.79665 310.3094Q186.24977 311.09064 186.24977 313.21564ZM192.17165 313.21564Q192.17165 311.6844 192.48415 310.7625Q192.79665 309.825 193.40602 309.325Q194.03102 308.825 194.96852 308.825Q195.65602 308.825 196.17165 309.10626Q196.7029 309.3875 197.04665 309.91876Q197.3904 310.4344 197.5779 311.1844Q197.7654 311.9344 197.7654 313.21564Q197.7654 314.73126 197.4529 315.65314Q197.15602 316.575 196.53102 317.09064Q195.92165 317.59064 194.96852 317.59064Q193.73415 317.59064 193.0154 316.7Q192.17165 315.6375 192.17165 313.21564ZM193.24977 313.21564Q193.24977 315.325 193.74977 316.02814Q194.24977 316.73126 194.96852 316.73126Q195.7029 316.73126 196.18727 316.02814Q196.68727 315.325 196.68727 313.21564Q196.68727 311.09064 196.18727 310.40314Q195.7029 309.7 194.9529 309.7Q194.23415 309.7 193.79665 310.3094Q193.24977 311.09064 193.24977 313.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M316.0 315.2L317.10938 315.10626Q317.23438 315.91876 317.67188 316.325Q318.125 316.73126 318.76562 316.73126Q319.51562 316.73126 320.04688 316.15314Q320.57812 315.575 320.57812 314.6375Q320.57812 313.73126 320.0625 313.21564Q319.5625 312.6844 318.73438 312.6844Q318.23438 312.6844 317.8125 312.91876Q317.40625 313.15314 317.17188 313.5125L316.1875 313.3875L317.01562 308.98126L321.29688 308.98126L321.29688 309.98126L317.85938 309.98126L317.40625 312.29376Q318.17188 311.7469 319.01562 311.7469Q320.14062 311.7469 320.90625 312.52814Q321.6875 313.3094 321.6875 314.54376Q321.6875 315.7 321.01562 316.5594Q320.1875 317.59064 318.76562 317.59064Q317.59375 317.59064 316.84375 316.9344Q316.10938 316.27814 316.0 315.2ZM323.0 313.21564Q323.0 311.6844 323.3125 310.7625Q323.625 309.825 324.23438 309.325Q324.85938 308.825 325.79688 308.825Q326.48438 308.825 327.0 309.10626Q327.53125 309.3875 327.875 309.91876Q328.21875 310.4344 328.40625 311.1844Q328.59375 311.9344 328.59375 313.21564Q328.59375 314.73126 328.28125 315.65314Q327.98438 316.575 327.35938 317.09064Q326.75 317.59064 325.79688 317.59064Q324.5625 317.59064 323.84375 316.7Q323.0 315.6375 323.0 313.21564ZM324.07812 313.21564Q324.07812 315.325 324.57812 316.02814Q325.07812 316.73126 325.79688 316.73126Q326.53125 316.73126 327.01562 316.02814Q327.51562 315.325 327.51562 313.21564Q327.51562 311.09064 327.01562 310.40314Q326.53125 309.7 325.78125 309.7Q325.0625 309.7 324.625 310.3094Q324.07812 311.09064 324.07812 313.21564ZM330.0 313.21564Q330.0 311.6844 330.3125 310.7625Q330.625 309.825 331.23438 309.325Q331.85938 308.825 332.79688 308.825Q333.48438 308.825 334.0 309.10626Q334.53125 309.3875 334.875 309.91876Q335.21875 310.4344 335.40625 311.1844Q335.59375 311.9344 335.59375 313.21564Q335.59375 314.73126 335.28125 315.65314Q334.98438 316.575 334.35938 317.09064Q333.75 317.59064 332.79688 317.59064Q331.5625 317.59064 330.84375 316.7Q330.0 315.6375 330.0 313.21564ZM331.07812 313.21564Q331.07812 315.325 331.57812 316.02814Q332.07812 316.73126 332.79688 316.73126Q333.53125 316.73126 334.01562 316.02814Q334.51562 315.325 334.51562 313.21564Q334.51562 311.09064 334.01562 310.40314Q333.53125 309.7 332.78125 309.7Q332.0625 309.7 331.625 310.3094Q331.07812 311.09064 331.07812 313.21564ZM337.0 313.21564Q337.0 311.6844 337.3125 310.7625Q337.625 309.825 338.23438 309.325Q338.85938 308.825 339.79688 308.825Q340.48438 308.825 341.0 309.10626Q341.53125 309.3875 341.875 309.91876Q342.21875 310.4344 342.40625 311.1844Q342.59375 311.9344 342.59375 313.21564Q342.59375 314.73126 342.28125 315.65314Q341.98438 316.575 341.35938 317.09064Q340.75 317.59064 339.79688 317.59064Q338.5625 317.59064 337.84375 316.7Q337.0 315.6375 337.0 313.21564ZM338.07812 313.21564Q338.07812 315.325 338.57812 316.02814Q339.07812 316.73126 339.79688 316.73126Q340.53125 316.73126 341.01562 316.02814Q341.51562 315.325 341.51562 313.21564Q341.51562 311.09064 341.01562 310.40314Q340.53125 309.7 339.78125 309.7Q339.0625 309.7 338.625 310.3094Q338.07812 311.09064 338.07812 313.21564ZM344.0 313.21564Q344.0 311.6844 344.3125 310.7625Q344.625 309.825 345.23438 309.325Q345.85938 308.825 346.79688 308.825Q347.48438 308.825 348.0 309.10626Q348.53125 309.3875 348.875 309.91876Q349.21875 310.4344 349.40625 311.1844Q349.59375 311.9344 349.59375 313.21564Q349.59375 314.73126 349.28125 315.65314Q348.98438 316.575 348.35938 317.09064Q347.75 317.59064 346.79688 317.59064Q345.5625 317.59064 344.84375 316.7Q344.0 315.6375 344.0 313.21564ZM345.07812 313.21564Q345.07812 315.325 345.57812 316.02814Q346.07812 316.73126 346.79688 316.73126Q347.53125 316.73126 348.01562 316.02814Q348.51562 315.325 348.51562 313.21564Q348.51562 311.09064 348.01562 310.40314Q347.53125 309.7 346.78125 309.7Q346.0625 309.7 345.625 310.3094Q345.07812 311.09064 345.07812 313.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M460.82837 315.2L461.93774 315.10626Q462.06274 315.91876 462.50024 316.325Q462.95337 316.73126 463.594 316.73126Q464.344 316.73126 464.87524 316.15314Q465.4065 315.575 465.4065 314.6375Q465.4065 313.73126 464.89087 313.21564Q464.39087 312.6844 463.56274 312.6844Q463.06274 312.6844 462.64087 312.91876Q462.23462 313.15314 462.00024 313.5125L461.01587 313.3875L461.844 308.98126L466.12524 308.98126L466.12524 309.98126L462.68774 309.98126L462.23462 312.29376Q463.00024 311.7469 463.844 311.7469Q464.969 311.7469 465.73462 312.52814Q466.51587 313.3094 466.51587 314.54376Q466.51587 315.7 465.844 316.5594Q465.01587 317.59064 463.594 317.59064Q462.42212 317.59064 461.67212 316.9344Q460.93774 316.27814 460.82837 315.2ZM467.82837 313.21564Q467.82837 311.6844 468.14087 310.7625Q468.45337 309.825 469.06274 309.325Q469.68774 308.825 470.62524 308.825Q471.31274 308.825 471.82837 309.10626Q472.35962 309.3875 472.70337 309.91876Q473.04712 310.4344 473.23462 311.1844Q473.42212 311.9344 473.42212 313.21564Q473.42212 314.73126 473.10962 315.65314Q472.81274 316.575 472.18774 317.09064Q471.57837 317.59064 470.62524 317.59064Q469.39087 317.59064 468.67212 316.7Q467.82837 315.6375 467.82837 313.21564ZM468.9065 313.21564Q468.9065 315.325 469.4065 316.02814Q469.9065 316.73126 470.62524 316.73126Q471.35962 316.73126 471.844 316.02814Q472.344 315.325 472.344 313.21564Q472.344 311.09064 471.844 310.40314Q471.35962 309.7 470.60962 309.7Q469.89087 309.7 469.45337 310.3094Q468.9065 311.09064 468.9065 313.21564ZM474.82837 313.21564Q474.82837 311.6844 475.14087 310.7625Q475.45337 309.825 476.06274 309.325Q476.68774 308.825 477.62524 308.825Q478.31274 308.825 478.82837 309.10626Q479.35962 309.3875 479.70337 309.91876Q480.04712 310.4344 480.23462 311.1844Q480.42212 311.9344 480.42212 313.21564Q480.42212 314.73126 480.10962 315.65314Q479.81274 316.575 479.18774 317.09064Q478.57837 317.59064 477.62524 317.59064Q476.39087 317.59064 475.67212 316.7Q474.82837 315.6375 474.82837 313.21564ZM475.9065 313.21564Q475.9065 315.325 476.4065 316.02814Q476.9065 316.73126 477.62524 316.73126Q478.35962 316.73126 478.844 316.02814Q479.344 315.325 479.344 313.21564Q479.344 311.09064 478.844 310.40314Q478.35962 309.7 477.60962 309.7Q476.89087 309.7 476.45337 310.3094Q475.9065 311.09064 475.9065 313.21564ZM481.82837 313.21564Q481.82837 311.6844 482.14087 310.7625Q482.45337 309.825 483.06274 309.325Q483.68774 308.825 484.62524 308.825Q485.31274 308.825 485.82837 309.10626Q486.35962 309.3875 486.70337 309.91876Q487.04712 310.4344 487.23462 311.1844Q487.42212 311.9344 487.42212 313.21564Q487.42212 314.73126 487.10962 315.65314Q486.81274 316.575 486.18774 317.09064Q485.57837 317.59064 484.62524 317.59064Q483.39087 317.59064 482.67212 316.7Q481.82837 315.6375 481.82837 313.21564ZM482.9065 313.21564Q482.9065 315.325 483.4065 316.02814Q483.9065 316.73126 484.62524 316.73126Q485.35962 316.73126 485.844 316.02814Q486.344 315.325 486.344 313.21564Q486.344 311.09064 485.844 310.40314Q485.35962 309.7 484.60962 309.7Q483.89087 309.7 483.45337 310.3094Q482.9065 311.09064 482.9065 313.21564ZM488.82837 313.21564Q488.82837 311.6844 489.14087 310.7625Q489.45337 309.825 490.06274 309.325Q490.68774 308.825 491.62524 308.825Q492.31274 308.825 492.82837 309.10626Q493.35962 309.3875 493.70337 309.91876Q494.04712 310.4344 494.23462 311.1844Q494.42212 311.9344 494.42212 313.21564Q494.42212 314.73126 494.10962 315.65314Q493.81274 316.575 493.18774 317.09064Q492.57837 317.59064 491.62524 317.59064Q490.39087 317.59064 489.67212 316.7Q488.82837 315.6375 488.82837 313.21564ZM489.9065 313.21564Q489.9065 315.325 490.4065 316.02814Q490.9065 316.73126 491.62524 316.73126Q492.35962 316.73126 492.844 316.02814Q493.344 315.325 493.344 313.21564Q493.344 311.09064 492.844 310.40314Q492.35962 309.7 491.60962 309.7Q490.89087 309.7 490.45337 310.3094Q489.9065 311.09064 489.9065 313.21564ZM495.82837 313.21564Q495.82837 311.6844 496.14087 310.7625Q496.45337 309.825 497.06274 309.325Q497.68774 308.825 498.62524 308.825Q499.31274 308.825 499.82837 309.10626Q500.35962 309.3875 500.70337 309.91876Q501.04712 310.4344 501.23462 311.1844Q501.42212 311.9344 501.42212 313.21564Q501.42212 314.73126 501.10962 315.65314Q500.81274 316.575 500.18774 317.09064Q499.57837 317.59064 498.62524 317.59064Q497.39087 317.59064 496.67212 316.7Q495.82837 315.6375 495.82837 313.21564ZM496.9065 313.21564Q496.9065 315.325 497.4065 316.02814Q497.9065 316.73126 498.62524 316.73126Q499.35962 316.73126 499.844 316.02814Q500.344 315.325 500.344 313.21564Q500.344 311.09064 499.844 310.40314Q499.35962 309.7 498.60962 309.7Q497.89087 309.7 497.45337 310.3094Q496.9065 311.09064 496.9065 313.21564Z" fill-rule="nonzero"/><path fill="#4285f4" d="M191.0 56.916668C191.0 56.364384 191.44771 55.916668 192.0 55.916668L202.0 55.916668C202.55229 55.916668 203.0 56.364384 203.0 56.916668L203.0 66.916664C203.0 67.46895 202.55229 67.916664 202.0 67.916664L192.0 67.916664C191.44771 67.916664 191.0 67.46895 191.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M211.92188 65.916664L211.92188 57.322914L213.07812 57.322914L217.59375 64.072914L217.59375 57.322914L218.6875 57.322914L218.6875 65.916664L217.51562 65.916664L213.0 59.166664L213.0 65.916664L211.92188 65.916664ZM224.85938 65.15104Q224.26562 65.65104 223.71875 65.854164Q223.1875 66.05729 222.5625 66.05729Q221.53125 66.05729 220.98438 65.55729Q220.4375 65.05729 220.4375 64.27604Q220.4375 63.822914 220.64062 63.447914Q220.84375 63.05729 221.1875 62.83854Q221.53125 62.604164 221.95312 62.49479Q222.25 62.40104 222.89062 62.322914Q224.15625 62.18229 224.76562 61.96354Q224.76562 61.74479 224.76562 61.697914Q224.76562 61.041664 224.46875 60.77604Q224.0625 60.43229 223.26562 60.43229Q222.53125 60.43229 222.17188 60.697914Q221.8125 60.947914 221.64062 61.604164L220.60938 61.46354Q220.75 60.80729 221.07812 60.40104Q221.40625 59.99479 222.01562 59.77604Q222.625 59.55729 223.42188 59.55729Q224.21875 59.55729 224.71875 59.74479Q225.21875 59.93229 225.45312 60.21354Q225.6875 60.49479 225.78125 60.93229Q225.82812 61.197914 225.82812 61.90104L225.82812 63.30729Q225.82812 64.77604 225.89062 65.166664Q225.96875 65.55729 226.17188 65.916664L225.0625 65.916664Q224.90625 65.58854 224.85938 65.15104ZM224.76562 62.791664Q224.1875 63.02604 223.04688 63.197914Q222.39062 63.291664 222.125 63.416664Q221.85938 63.52604 221.70312 63.74479Q221.5625 63.96354 221.5625 64.24479Q221.5625 64.666664 221.875 64.947914Q222.20312 65.229164 222.8125 65.229164Q223.42188 65.229164 223.89062 64.96354Q224.375 64.697914 224.59375 64.229164Q224.76562 63.86979 224.76562 63.18229L224.76562 62.791664ZM227.79688 58.541664L227.79688 57.322914L228.85938 57.322914L228.85938 58.541664L227.79688 58.541664ZM227.79688 65.916664L227.79688 59.697914L228.85938 59.697914L228.85938 65.916664L227.79688 65.916664ZM232.51562 65.916664L230.15625 59.697914L231.26562 59.697914L232.60938 63.416664Q232.8125 64.02604 233.0 64.666664Q233.14062 64.18229 233.39062 63.49479L234.78125 59.697914L235.85938 59.697914L233.5 65.916664L232.51562 65.916664ZM240.04688 63.916664L241.14062 64.041664Q240.89062 64.99479 240.1875 65.52604Q239.48438 66.05729 238.40625 66.05729Q237.04688 66.05729 236.23438 65.21354Q235.4375 64.36979 235.4375 62.854164Q235.4375 61.291664 236.25 60.43229Q237.0625 59.55729 238.34375 59.55729Q239.59375 59.55729 240.375 60.40104Q241.17188 61.24479 241.17188 62.791664Q241.17188 62.885414 241.17188 63.072914L236.53125 63.072914Q236.59375 64.104164 237.10938 64.65104Q237.625 65.18229 238.40625 65.18229Q238.98438 65.18229 239.39062 64.885414Q239.8125 64.572914 240.04688 63.916664ZM236.59375 62.21354L240.0625 62.21354Q240.0 61.416664 239.67188 61.02604Q239.15625 60.416664 238.35938 60.416664Q237.625 60.416664 237.125 60.90104Q236.64062 61.385414 236.59375 62.21354Z" fill-rule="nonzero"/><path fill="#ea4335" d="M258.0 56.916668C258.0 56.364384 258.44772 55.916668 259.0 55.916668L269.0 55.916668C269.55228 55.916668 270.0 56.364384 270.0 56.916668L270.0 66.916664C270.0 67.46895 269.55228 67.916664 269.0 67.916664L259.0 67.916664C258.44772 67.916664 258.0 67.46895 258.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M284.5625 57.322914L285.70312 57.322914L285.70312 62.291664Q285.70312 63.58854 285.40625 64.354164Q285.10938 65.104164 284.34375 65.58854Q283.57812 66.05729 282.34375 66.05729Q281.14062 66.05729 280.35938 65.65104Q279.59375 65.229164 279.26562 64.447914Q278.9375 63.65104 278.9375 62.291664L278.9375 57.322914L280.07812 57.322914L280.07812 62.27604Q280.07812 63.40104 280.28125 63.93229Q280.5 64.46354 281.0 64.760414Q281.51562 65.041664 282.25 65.041664Q283.5 65.041664 284.03125 64.479164Q284.5625 63.90104 284.5625 62.27604L284.5625 57.322914ZM287.79688 65.916664L287.79688 59.697914L288.73438 59.697914L288.73438 60.572914Q289.42188 59.55729 290.71875 59.55729Q291.28125 59.55729 291.75 59.760414Q292.23438 59.96354 292.46875 60.291664Q292.70312 60.61979 292.79688 61.05729Q292.84375 61.354164 292.84375 62.08854L292.84375 65.916664L291.79688 65.916664L291.79688 62.135414Q291.79688 61.479164 291.67188 61.166664Q291.54688 60.854164 291.23438 60.666664Q290.92188 60.46354 290.5 60.46354Q289.82812 60.46354 289.32812 60.90104Q288.84375 61.322914 288.84375 62.510414L288.84375 65.916664L287.79688 65.916664ZM294.79688 58.541664L294.79688 57.322914L295.85938 57.322914L295.85938 58.541664L294.79688 58.541664ZM294.79688 65.916664L294.79688 59.697914L295.85938 59.697914L295.85938 65.916664L294.79688 65.916664ZM298.04688 65.916664L298.04688 60.510414L297.10938 60.510414L297.10938 59.697914L298.04688 59.697914L298.04688 59.02604Q298.04688 58.40104 298.15625 58.104164Q298.3125 57.68229 298.6875 57.43229Q299.07812 57.18229 299.76562 57.18229Q300.21875 57.18229 300.75 57.291664L300.59375 58.197914Q300.26562 58.15104 299.96875 58.15104Q299.48438 58.15104 299.28125 58.354164Q299.09375 58.55729 299.09375 59.11979L299.09375 59.697914L300.3125 59.697914L300.3125 60.510414L299.09375 60.510414L299.09375 65.916664L298.04688 65.916664ZM300.40625 62.80729Q300.40625 61.072914 301.35938 60.24479Q302.15625 59.55729 303.3125 59.55729Q304.59375 59.55729 305.40625 60.40104Q306.23438 61.229164 306.23438 62.71354Q306.23438 63.916664 305.875 64.604164Q305.51562 65.291664 304.8125 65.68229Q304.125 66.05729 303.3125 66.05729Q302.01562 66.05729 301.20312 65.229164Q300.40625 64.385414 300.40625 62.80729ZM301.48438 62.80729Q301.48438 63.99479 302.0 64.58854Q302.53125 65.18229 303.3125 65.18229Q304.10938 65.18229 304.625 64.58854Q305.14062 63.99479 305.14062 62.77604Q305.14062 61.61979 304.60938 61.02604Q304.09375 60.43229 303.3125 60.43229Q302.53125 60.43229 302.0 61.02604Q301.48438 61.604164 301.48438 62.80729ZM307.78125 65.916664L307.78125 59.697914L308.73438 59.697914L308.73438 60.635414Q309.09375 59.979164 309.39062 59.77604Q309.70312 59.55729 310.07812 59.55729Q310.60938 59.55729 311.15625 59.885414L310.79688 60.86979Q310.40625 60.635414 310.03125 60.635414Q309.67188 60.635414 309.39062 60.854164Q309.125 61.05729 309.01562 61.43229Q308.82812 61.99479 308.82812 62.65104L308.82812 65.916664L307.78125 65.916664ZM311.79688 65.916664L311.79688 59.697914L312.73438 59.697914L312.73438 60.572914Q313.03125 60.104164 313.51562 59.83854Q314.0 59.55729 314.625 59.55729Q315.3125 59.55729 315.75 59.83854Q316.20312 60.11979 316.375 60.635414Q317.125 59.55729 318.29688 59.55729Q319.23438 59.55729 319.71875 60.072914Q320.21875 60.572914 320.21875 61.65104L320.21875 65.916664L319.17188 65.916664L319.17188 61.99479Q319.17188 61.36979 319.0625 61.08854Q318.96875 60.80729 318.70312 60.635414Q318.4375 60.46354 318.0625 60.46354Q317.40625 60.46354 316.96875 60.90104Q316.54688 61.33854 316.54688 62.30729L316.54688 65.916664L315.48438 65.916664L315.48438 61.86979Q315.48438 61.166664 315.21875 60.822914Q314.96875 60.46354 314.39062 60.46354Q313.9375 60.46354 313.5625 60.697914Q313.1875 60.93229 313.01562 61.385414Q312.84375 61.83854 312.84375 62.68229L312.84375 65.916664L311.79688 65.916664Z" fill-rule="nonzero"/><path fill="#fbbc04" d="M338.0 56.916668C338.0 56.364384 338.44772 55.916668 339.0 55.916668L349.0 55.916668C349.55228 55.916668 350.0 56.364384 350.0 56.916668L350.0 66.916664C350.0 67.46895 349.55228 67.916664 349.0 67.916664L339.0 67.916664C338.44772 67.916664 338.0 67.46895 338.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M365.0625 62.90104L366.1875 63.197914Q365.82812 64.58854 364.90625 65.322914Q363.98438 66.05729 362.64062 66.05729Q361.25 66.05729 360.375 65.49479Q359.5 64.93229 359.04688 63.86979Q358.59375 62.791664 358.59375 61.55729Q358.59375 60.21354 359.10938 59.21354Q359.625 58.21354 360.5625 57.697914Q361.51562 57.18229 362.65625 57.18229Q363.9375 57.18229 364.8125 57.83854Q365.70312 58.49479 366.04688 59.68229L364.92188 59.947914Q364.625 59.010414 364.04688 58.58854Q363.48438 58.15104 362.625 58.15104Q361.64062 58.15104 360.96875 58.635414Q360.3125 59.104164 360.03125 59.90104Q359.76562 60.697914 359.76562 61.55729Q359.76562 62.65104 360.07812 63.46354Q360.40625 64.27604 361.07812 64.68229Q361.75 65.08854 362.54688 65.08854Q363.5 65.08854 364.15625 64.541664Q364.82812 63.99479 365.0625 62.90104ZM367.40625 62.80729Q367.40625 61.072914 368.35938 60.24479Q369.15625 59.55729 370.3125 59.55729Q371.59375 59.55729 372.40625 60.40104Q373.23438 61.229164 373.23438 62.71354Q373.23438 63.916664 372.875 64.604164Q372.51562 65.291664 371.8125 65.68229Q371.125 66.05729 370.3125 66.05729Q369.01562 66.05729 368.20312 65.229164Q367.40625 64.385414 367.40625 62.80729ZM368.48438 62.80729Q368.48438 63.99479 369.0 64.58854Q369.53125 65.18229 370.3125 65.18229Q371.10938 65.18229 371.625 64.58854Q372.14062 63.99479 372.14062 62.77604Q372.14062 61.61979 371.60938 61.02604Q371.09375 60.43229 370.3125 60.43229Q369.53125 60.43229 369.0 61.02604Q368.48438 61.604164 368.48438 62.80729ZM374.79688 65.916664L374.79688 57.322914L375.84375 57.322914L375.84375 60.40104Q376.57812 59.55729 377.70312 59.55729Q378.40625 59.55729 378.90625 59.83854Q379.42188 60.104164 379.64062 60.58854Q379.85938 61.05729 379.85938 61.979164L379.85938 65.916664L378.8125 65.916664L378.8125 61.979164Q378.8125 61.18229 378.46875 60.822914Q378.125 60.46354 377.5 60.46354Q377.03125 60.46354 376.60938 60.71354Q376.20312 60.947914 376.01562 61.36979Q375.84375 61.77604 375.84375 62.510414L375.84375 65.916664L374.79688 65.916664ZM386.04688 63.916664L387.14062 64.041664Q386.89062 64.99479 386.1875 65.52604Q385.48438 66.05729 384.40625 66.05729Q383.04688 66.05729 382.23438 65.21354Q381.4375 64.36979 381.4375 62.854164Q381.4375 61.291664 382.25 60.43229Q383.0625 59.55729 384.34375 59.55729Q385.59375 59.55729 386.375 60.40104Q387.17188 61.24479 387.17188 62.791664Q387.17188 62.885414 387.17188 63.072914L382.53125 63.072914Q382.59375 64.104164 383.10938 64.65104Q383.625 65.18229 384.40625 65.18229Q384.98438 65.18229 385.39062 64.885414Q385.8125 64.572914 386.04688 63.916664ZM382.59375 62.21354L386.0625 62.21354Q386.0 61.416664 385.67188 61.02604Q385.15625 60.416664 384.35938 60.416664Q383.625 60.416664 383.125 60.90104Q382.64062 61.385414 382.59375 62.21354ZM388.78125 65.916664L388.78125 59.697914L389.73438 59.697914L389.73438 60.635414Q390.09375 59.979164 390.39062 59.77604Q390.70312 59.55729 391.07812 59.55729Q391.60938 59.55729 392.15625 59.885414L391.79688 60.86979Q391.40625 60.635414 391.03125 60.635414Q390.67188 60.635414 390.39062 60.854164Q390.125 61.05729 390.01562 61.43229Q389.82812 61.99479 389.82812 62.65104L389.82812 65.916664L388.78125 65.916664ZM397.04688 63.916664L398.14062 64.041664Q397.89062 64.99479 397.1875 65.52604Q396.48438 66.05729 395.40625 66.05729Q394.04688 66.05729 393.23438 65.21354Q392.4375 64.36979 392.4375 62.854164Q392.4375 61.291664 393.25 60.43229Q394.0625 59.55729 395.34375 59.55729Q396.59375 59.55729 397.375 60.40104Q398.17188 61.24479 398.17188 62.791664Q398.17188 62.885414 398.17188 63.072914L393.53125 63.072914Q393.59375 64.104164 394.10938 64.65104Q394.625 65.18229 395.40625 65.18229Q395.98438 65.18229 396.39062 64.885414Q396.8125 64.572914 397.04688 63.916664ZM393.59375 62.21354L397.0625 62.21354Q397.0 61.416664 396.67188 61.02604Q396.15625 60.416664 395.35938 60.416664Q394.625 60.416664 394.125 60.90104Q393.64062 61.385414 393.59375 62.21354ZM399.79688 65.916664L399.79688 59.697914L400.73438 59.697914L400.73438 60.572914Q401.42188 59.55729 402.71875 59.55729Q403.28125 59.55729 403.75 59.760414Q404.23438 59.96354 404.46875 60.291664Q404.70312 60.61979 404.79688 61.05729Q404.84375 61.354164 404.84375 62.08854L404.84375 65.916664L403.79688 65.916664L403.79688 62.135414Q403.79688 61.479164 403.67188 61.166664Q403.54688 60.854164 403.23438 60.666664Q402.92188 60.46354 402.5 60.46354Q401.82812 60.46354 401.32812 60.90104Q400.84375 61.322914 400.84375 62.510414L400.84375 65.916664L399.79688 65.916664ZM409.09375 64.979164L409.25 65.90104Q408.79688 65.99479 408.45312 65.99479Q407.875 65.99479 407.5625 65.822914Q407.25 65.635414 407.10938 65.33854Q406.98438 65.041664 406.98438 64.08854L406.98438 60.510414L406.21875 60.510414L406.21875 59.697914L406.98438 59.697914L406.98438 58.15104L408.03125 57.52604L408.03125 59.697914L409.09375 59.697914L409.09375 60.510414L408.03125 60.510414L408.03125 64.15104Q408.03125 64.604164 408.07812 64.729164Q408.14062 64.854164 408.26562 64.93229Q408.39062 65.010414 408.625 65.010414Q408.8125 65.010414 409.09375 64.979164Z" fill-rule="nonzero"/><path fill="#757575" d="M24.190624 37.55L18.64375 23.2375L20.690624 23.2375L24.409374 33.628124Q24.8625 34.878124 25.159374 35.971874Q25.4875 34.8 25.940624 33.628124L29.8 23.2375L31.7375 23.2375L26.128124 37.55L24.190624 37.55ZM32.878124 25.253124L32.878124 23.2375L34.64375 23.2375L34.64375 25.253124L32.878124 25.253124ZM32.878124 37.55L32.878124 27.175L34.64375 27.175L34.64375 37.55L32.878124 37.55ZM36.159374 34.45625L37.909374 34.175Q38.05 35.221874 38.721874 35.784374Q39.39375 36.33125 40.596874 36.33125Q41.8 36.33125 42.378124 35.846874Q42.971874 35.346874 42.971874 34.690624Q42.971874 34.096874 42.45625 33.753124Q42.096874 33.51875 40.659374 33.159374Q38.721874 32.659374 37.971874 32.315624Q37.2375 31.95625 36.846874 31.33125Q36.45625 30.690624 36.45625 29.925Q36.45625 29.2375 36.76875 28.64375Q37.096874 28.05 37.64375 27.659374Q38.05 27.3625 38.753124 27.159374Q39.471874 26.940624 40.284374 26.940624Q41.503124 26.940624 42.425 27.3Q43.346874 27.64375 43.784374 28.253124Q44.221874 28.846874 44.39375 29.846874L42.675 30.08125Q42.55 29.284374 41.9875 28.846874Q41.425 28.39375 40.409374 28.39375Q39.190624 28.39375 38.675 28.8Q38.159374 29.190624 38.159374 29.721874Q38.159374 30.065624 38.378124 30.346874Q38.58125 30.628124 39.05 30.815624Q39.315624 30.909374 40.596874 31.253124Q42.471874 31.753124 43.20625 32.08125Q43.940624 32.39375 44.3625 33.003124Q44.784374 33.596874 44.784374 34.503124Q44.784374 35.378124 44.26875 36.159374Q43.753124 36.940624 42.784374 37.3625Q41.815624 37.784374 40.596874 37.784374Q38.58125 37.784374 37.51875 36.940624Q36.45625 36.096874 36.159374 34.45625ZM53.659374 37.55L53.659374 36.01875Q52.45625 37.784374 50.378124 37.784374Q49.45625 37.784374 48.659374 37.440624Q47.8625 37.08125 47.471874 36.55Q47.096874 36.01875 46.940624 35.2375Q46.83125 34.721874 46.83125 33.596874L46.83125 27.175L48.58125 27.175L48.58125 32.925Q48.58125 34.3 48.690624 34.784374Q48.8625 35.471874 49.39375 35.878124Q49.940624 36.26875 50.721874 36.26875Q51.51875 36.26875 52.20625 35.8625Q52.909374 35.45625 53.190624 34.76875Q53.4875 34.065624 53.4875 32.7375L53.4875 27.175L55.2375 27.175L55.2375 37.55L53.659374 37.55ZM63.64375 36.26875Q62.659374 37.096874 61.753124 37.440624Q60.846874 37.784374 59.815624 37.784374Q58.1125 37.784374 57.190624 36.95625Q56.26875 36.1125 56.26875 34.815624Q56.26875 34.05 56.6125 33.425Q56.971874 32.8 57.534374 32.425Q58.096874 32.034374 58.8 31.83125Q59.315624 31.70625 60.3625 31.565624Q62.4875 31.315624 63.4875 30.971874Q63.503124 30.6125 63.503124 30.503124Q63.503124 29.440624 63.003124 28.9875Q62.33125 28.39375 61.003124 28.39375Q59.753124 28.39375 59.159374 28.83125Q58.58125 29.26875 58.3 30.378124L56.58125 30.14375Q56.815624 29.034374 57.346874 28.3625Q57.878124 27.675 58.89375 27.315624Q59.909374 26.940624 61.253124 26.940624Q62.58125 26.940624 63.409374 27.253124Q64.2375 27.565624 64.62813 28.05Q65.01875 28.51875 65.175 29.2375Q65.26875 29.690624 65.26875 30.8625L65.26875 33.20625Q65.26875 35.659374 65.37813 36.315624Q65.4875 36.95625 65.83125 37.55L63.9875 37.55Q63.721874 37.003124 63.64375 36.26875ZM63.4875 32.346874Q62.534374 32.7375 60.6125 33.003124Q59.534374 33.159374 59.08125 33.3625Q58.64375 33.55 58.39375 33.925Q58.14375 34.3 58.14375 34.76875Q58.14375 35.471874 58.675 35.940624Q59.20625 36.409374 60.2375 36.409374Q61.253124 36.409374 62.034374 35.971874Q62.83125 35.51875 63.20625 34.753124Q63.4875 34.14375 63.4875 32.9875L63.4875 32.346874ZM67.83125 37.55L67.83125 23.2375L69.58125 23.2375L69.58125 37.55L67.83125 37.55ZM71.87813 25.253124L71.87813 23.2375L73.64375 23.2375L73.64375 25.253124L71.87813 25.253124ZM71.87813 37.55L71.87813 27.175L73.64375 27.175L73.64375 37.55L71.87813 37.55ZM74.94063 37.55L74.94063 36.128124L81.55 28.55Q80.425 28.596874 79.56563 28.596874L75.33125 28.596874L75.33125 27.175L83.81563 27.175L83.81563 28.346874L78.19063 34.925L77.1125 36.128124Q78.28438 36.034374 79.33125 36.034374L84.12813 36.034374L84.12813 37.55L74.94063 37.55ZM91.97188 34.20625L93.78438 34.440624Q93.3625 36.01875 92.19063 36.909374Q91.03438 37.784374 89.22188 37.784374Q86.95625 37.784374 85.6125 36.39375Q84.28438 34.9875 84.28438 32.45625Q84.28438 29.83125 85.62813 28.39375Q86.97188 26.940624 89.12813 26.940624Q91.20625 26.940624 92.51875 28.3625Q93.84688 29.76875 93.84688 32.346874Q93.84688 32.503124 93.83125 32.815624L86.09688 32.815624Q86.19063 34.51875 87.06563 35.425Q87.94063 36.33125 89.2375 36.33125Q90.20625 36.33125 90.87813 35.83125Q91.56563 35.315624 91.97188 34.20625ZM86.19063 31.3625L91.9875 31.3625Q91.87813 30.065624 91.33125 29.409374Q90.4875 28.39375 89.14375 28.39375Q87.94063 28.39375 87.1125 29.20625Q86.28438 30.003124 86.19063 31.3625ZM101.51875 30.58125Q101.51875 27.01875 103.425 25.003124Q105.34688 22.971874 108.37813 22.971874Q110.3625 22.971874 111.94063 23.925Q113.53438 24.878124 114.3625 26.58125Q115.20625 28.26875 115.20625 30.409374Q115.20625 32.58125 114.33125 34.3Q113.45625 36.01875 111.83125 36.909374Q110.22188 37.8 108.3625 37.8Q106.34688 37.8 104.75313 36.83125Q103.15938 35.846874 102.33125 34.159374Q101.51875 32.45625 101.51875 30.58125ZM103.47188 30.6125Q103.47188 33.190624 104.8625 34.690624Q106.25313 36.175 108.34688 36.175Q110.4875 36.175 111.8625 34.675Q113.25313 33.159374 113.25313 30.39375Q113.25313 28.659374 112.65938 27.3625Q112.08125 26.05 110.94063 25.33125Q109.8 24.6125 108.37813 24.6125Q106.37813 24.6125 104.925 26.003124Q103.47188 27.378124 103.47188 30.6125ZM118.28438 37.55L118.28438 28.55L116.7375 28.55L116.7375 27.175L118.28438 27.175L118.28438 26.08125Q118.28438 25.034374 118.47188 24.51875Q118.72188 23.83125 119.3625 23.409374Q120.00313 22.9875 121.15938 22.9875Q121.90938 22.9875 122.8 23.159374L122.53438 24.690624Q121.9875 24.596874 121.50313 24.596874Q120.70625 24.596874 120.3625 24.940624Q120.03438 25.284374 120.03438 26.221874L120.03438 27.175L122.06563 27.175L122.06563 28.55L120.03438 28.55L120.03438 37.55L118.28438 37.55ZM124.28438 37.55L124.28438 28.55L122.7375 28.55L122.7375 27.175L124.28438 27.175L124.28438 26.08125Q124.28438 25.034374 124.47188 24.51875Q124.72188 23.83125 125.3625 23.409374Q126.00313 22.9875 127.15938 22.9875Q127.90938 22.9875 128.8 23.159374L128.53438 24.690624Q127.9875 24.596874 127.50313 24.596874Q126.70625 24.596874 126.3625 24.940624Q126.03438 25.284374 126.03438 26.221874L126.03438 27.175L128.06563 27.175L128.06563 28.55L126.03438 28.55L126.03438 37.55L124.28438 37.55Z" fill-rule="nonzero"/></svg> \ No newline at end of file diff --git a/images/Visualize On.svg b/images/Visualize On.svg new file mode 100644 index 0000000..20a22da --- /dev/null +++ b/images/Visualize On.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 600.0 371.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" width="600" height="371" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" d="M0 0L600.0 0L600.0 371.0L0 371.0L0 0Z" fill-rule="nonzero"/><path stroke="#333333" stroke-width="1.0" stroke-linecap="butt" d="M77.5 300.5L581.5 300.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 247.5L581.5 247.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 194.5L581.5 194.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 141.5L581.5 141.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 88.5L581.5 88.5" fill-rule="nonzero"/><clipPath id="id_0"><path d="M77.55 88.28333L581.45 88.28333L581.45 300.45L77.55 300.45L77.55 88.28333Z" clip-rule="nonzero"/></clipPath><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M162.0 300.0L131.0 300.0L131.0 196.0C131.0 194.89543 131.89543 194.0 133.0 194.0L160.0 194.0C161.10457 194.0 162.0 194.89543 162.0 196.0Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M162.0 300.0L131.0 300.0L131.0 196.0C131.0 194.89543 131.89543 194.0 133.0 194.0L160.0 194.0C161.10457 194.0 162.0 194.89543 162.0 196.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M313.0 300.0L282.0 300.0L282.0 299.5C282.0 299.22385 282.22385 299.0 282.5 299.0L312.5 299.0C312.77615 299.0 313.0 299.22385 313.0 299.5Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M313.0 300.0L282.0 300.0L282.0 299.5C282.0 299.22385 282.22385 299.0 282.5 299.0L312.5 299.0C312.77615 299.0 313.0 299.22385 313.0 299.5Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M463.0 300.0L432.0 300.0L432.0 300.0L463.0 300.0Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M463.0 300.0L432.0 300.0L432.0 300.0L463.0 300.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M195.0 300.0L164.0 300.0L164.0 111.0C164.0 109.89543 164.89543 109.0 166.0 109.0L193.0 109.0C194.10457 109.0 195.0 109.89543 195.0 111.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M195.0 300.0L164.0 300.0L164.0 111.0C164.0 109.89543 164.89543 109.0 166.0 109.0L193.0 109.0C194.10457 109.0 195.0 109.89543 195.0 111.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M346.0 300.0L315.0 300.0L315.0 119.0C315.0 117.89543 315.89542 117.0 317.0 117.0L344.0 117.0C345.10458 117.0 346.0 117.89543 346.0 119.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M346.0 300.0L315.0 300.0L315.0 119.0C315.0 117.89543 315.89542 117.0 317.0 117.0L344.0 117.0C345.10458 117.0 346.0 117.89543 346.0 119.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M496.0 300.0L465.0 300.0L465.0 282.0C465.0 280.89542 465.89542 280.0 467.0 280.0L494.0 280.0C495.10458 280.0 496.0 280.89542 496.0 282.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M496.0 300.0L465.0 300.0L465.0 282.0C465.0 280.89542 465.89542 280.0 467.0 280.0L494.0 280.0C495.10458 280.0 496.0 280.89542 496.0 282.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M228.0 300.0L197.0 300.0L197.0 122.0C197.0 120.89543 197.89543 120.0 199.0 120.0L226.0 120.0C227.10457 120.0 228.0 120.89543 228.0 122.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M228.0 300.0L197.0 300.0L197.0 122.0C197.0 120.89543 197.89543 120.0 199.0 120.0L226.0 120.0C227.10457 120.0 228.0 120.89543 228.0 122.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M379.0 300.0L348.0 300.0L348.0 111.0C348.0 109.89543 348.89542 109.0 350.0 109.0L377.0 109.0C378.10458 109.0 379.0 109.89543 379.0 111.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M379.0 300.0L348.0 300.0L348.0 111.0C348.0 109.89543 348.89542 109.0 350.0 109.0L377.0 109.0C378.10458 109.0 379.0 109.89543 379.0 111.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M529.0 300.0L498.0 300.0L498.0 281.0C498.0 279.89542 498.89542 279.0 500.0 279.0L527.0 279.0C528.10455 279.0 529.0 279.89542 529.0 281.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M529.0 300.0L498.0 300.0L498.0 281.0C498.0 279.89542 498.89542 279.0 500.0 279.0L527.0 279.0C528.10455 279.0 529.0 279.89542 529.0 281.0Z" fill-rule="nonzero"/><path fill="#000000" d="M314.375 349.45L314.375 340.85626L317.60938 340.85626Q318.59375 340.85626 319.1875 341.1219Q319.78125 341.3875 320.10938 341.9344Q320.45312 342.46564 320.45312 343.0594Q320.45312 343.60626 320.15625 344.09064Q319.85938 344.575 319.25 344.8719Q320.03125 345.10626 320.4375 345.66876Q320.85938 346.21564 320.85938 346.96564Q320.85938 347.5594 320.60938 348.09064Q320.35938 348.60626 319.98438 348.8875Q319.60938 349.16876 319.03125 349.3094Q318.46875 349.45 317.65625 349.45L314.375 349.45ZM315.51562 344.46564L317.375 344.46564Q318.125 344.46564 318.45312 344.3719Q318.89062 344.2469 319.10938 343.95Q319.32812 343.6375 319.32812 343.1844Q319.32812 342.7625 319.125 342.4344Q318.92188 342.10626 318.53125 341.9969Q318.15625 341.8719 317.23438 341.8719L315.51562 341.8719L315.51562 344.46564ZM315.51562 348.4344L317.65625 348.4344Q318.20312 348.4344 318.42188 348.3875Q318.82812 348.325 319.07812 348.16876Q319.34375 347.9969 319.51562 347.6844Q319.6875 347.3719 319.6875 346.96564Q319.6875 346.48126 319.4375 346.1219Q319.20312 345.7625 318.76562 345.6219Q318.32812 345.48126 317.5 345.48126L315.51562 345.48126L315.51562 348.4344ZM321.90625 346.34064Q321.90625 344.60626 322.85938 343.77814Q323.65625 343.09064 324.8125 343.09064Q326.09375 343.09064 326.90625 343.9344Q327.73438 344.7625 327.73438 346.2469Q327.73438 347.45 327.375 348.1375Q327.01562 348.825 326.3125 349.21564Q325.625 349.59064 324.8125 349.59064Q323.51562 349.59064 322.70312 348.7625Q321.90625 347.91876 321.90625 346.34064ZM322.98438 346.34064Q322.98438 347.52814 323.5 348.1219Q324.03125 348.71564 324.8125 348.71564Q325.60938 348.71564 326.125 348.1219Q326.64062 347.52814 326.64062 346.3094Q326.64062 345.15314 326.10938 344.5594Q325.59375 343.96564 324.8125 343.96564Q324.03125 343.96564 323.5 344.5594Q322.98438 345.1375 322.98438 346.34064ZM329.29688 342.075L329.29688 340.85626L330.35938 340.85626L330.35938 342.075L329.29688 342.075ZM329.29688 349.45L329.29688 343.23126L330.35938 343.23126L330.35938 349.45L329.29688 349.45ZM336.32812 349.45L336.32812 348.66876Q335.73438 349.59064 334.59375 349.59064Q333.84375 349.59064 333.21875 349.1844Q332.59375 348.7625 332.25 348.02814Q331.90625 347.29376 331.90625 346.34064Q331.90625 345.41876 332.21875 344.65314Q332.53125 343.8875 333.15625 343.4969Q333.78125 343.09064 334.54688 343.09064Q335.10938 343.09064 335.54688 343.325Q335.98438 343.5594 336.26562 343.9344L336.26562 340.85626L337.3125 340.85626L337.3125 349.45L336.32812 349.45ZM333.0 346.34064Q333.0 347.54376 333.5 348.1375Q334.0 348.71564 334.6875 348.71564Q335.375 348.71564 335.85938 348.15314Q336.34375 347.59064 336.34375 346.4344Q336.34375 345.15314 335.84375 344.5594Q335.35938 343.96564 334.64062 343.96564Q333.9375 343.96564 333.46875 344.54376Q333.0 345.10626 333.0 346.34064ZM338.875 347.59064L339.90625 347.4344Q340.0 348.0594 340.39062 348.3875Q340.79688 348.71564 341.53125 348.71564Q342.25 348.71564 342.59375 348.4344Q342.95312 348.1375 342.95312 347.73126Q342.95312 347.3719 342.64062 347.16876Q342.42188 347.02814 341.5625 346.8094Q340.40625 346.5125 339.95312 346.3094Q339.51562 346.09064 339.28125 345.71564Q339.04688 345.34064 339.04688 344.8719Q339.04688 344.46564 339.23438 344.10626Q339.42188 343.7469 339.75 343.5125Q340.0 343.34064 340.42188 343.21564Q340.84375 343.09064 341.34375 343.09064Q342.0625 343.09064 342.60938 343.3094Q343.17188 343.5125 343.4375 343.8719Q343.70312 344.23126 343.79688 344.825L342.76562 344.96564Q342.70312 344.4969 342.35938 344.23126Q342.03125 343.95 341.40625 343.95Q340.6875 343.95 340.375 344.2Q340.0625 344.4344 340.0625 344.7625Q340.0625 344.96564 340.1875 345.1219Q340.32812 345.29376 340.59375 345.40314Q340.75 345.46564 341.53125 345.66876Q342.65625 345.98126 343.09375 346.16876Q343.53125 346.35626 343.78125 346.71564Q344.03125 347.075 344.03125 347.6219Q344.03125 348.15314 343.71875 348.6219Q343.42188 349.075 342.84375 349.34064Q342.26562 349.59064 341.53125 349.59064Q340.3125 349.59064 339.67188 349.09064Q339.04688 348.575 338.875 347.59064Z" fill-rule="nonzero"/><path fill="#000000" d="M29.550013 211.3823L20.956263 211.3823L20.956263 205.58542L21.971888 205.58542L21.971888 210.24167L24.628138 210.24167L24.628138 206.21042L25.643763 206.21042L25.643763 210.24167L29.550013 210.24167L29.550013 211.3823ZM29.550013 204.4448L20.956263 204.4448L20.956263 201.1948Q20.956263 200.35104 21.034388 199.89792Q21.143763 199.2573 21.440638 198.83542Q21.737513 198.39792 22.268763 198.14792Q22.800013 197.8823 23.440638 197.8823Q24.534388 197.8823 25.300013 198.58542Q26.050013 199.27292 26.050013 201.10104L26.050013 203.30417L29.550013 203.30417L29.550013 204.4448ZM25.050013 203.30417L25.050013 201.08542Q25.050013 199.97604 24.643763 199.52292Q24.221888 199.05417 23.471888 199.05417Q22.940638 199.05417 22.565638 199.33542Q22.175013 199.60104 22.050013 200.03854Q21.971888 200.33542 21.971888 201.10104L21.971888 203.30417L25.050013 203.30417ZM26.784388 196.8198L26.690638 195.7573Q27.346888 195.67917 27.753138 195.39792Q28.159388 195.11667 28.425013 194.53854Q28.675013 193.9448 28.675013 193.21042Q28.675013 192.5698 28.487513 192.0698Q28.284388 191.5698 27.956263 191.33542Q27.612513 191.08542 27.221888 191.08542Q26.815638 191.08542 26.518763 191.3198Q26.206263 191.55417 26.003138 192.08542Q25.862513 192.4448 25.581263 193.6323Q25.300013 194.80417 25.050013 195.27292Q24.721888 195.89792 24.253138 196.1948Q23.768763 196.49167 23.175013 196.49167Q22.534388 196.49167 21.971888 196.1323Q21.393763 195.7573 21.112513 195.05417Q20.815638 194.33542 20.815638 193.47604Q20.815638 192.52292 21.128138 191.78854Q21.425013 191.05417 22.034388 190.66354Q22.628138 190.27292 23.378138 190.24167L23.456263 191.33542Q22.643763 191.42917 22.237513 191.9448Q21.815638 192.4448 21.815638 193.42917Q21.815638 194.46042 22.190638 194.92917Q22.565638 195.39792 23.096888 195.39792Q23.565638 195.39792 23.862513 195.0698Q24.159388 194.74167 24.471888 193.36667Q24.784388 191.97604 25.018763 191.46042Q25.378138 190.71042 25.909388 190.35104Q26.425013 189.99167 27.128138 189.99167Q27.815638 189.99167 28.425013 190.3823Q29.018763 190.77292 29.362513 191.5073Q29.690638 192.24167 29.690638 193.16354Q29.690638 194.33542 29.362513 195.1323Q29.018763 195.91354 28.331263 196.36667Q27.643763 196.80417 26.784388 196.8198Z" fill-rule="nonzero"/><path fill="#000000" d="M65.05 300.21564Q65.05 298.6844 65.3625 297.7625Q65.675 296.825 66.28438 296.325Q66.90938 295.825 67.84688 295.825Q68.53438 295.825 69.05 296.10626Q69.58125 296.3875 69.925 296.91876Q70.26875 297.4344 70.45625 298.1844Q70.64375 298.9344 70.64375 300.21564Q70.64375 301.73126 70.33125 302.65314Q70.03438 303.575 69.40938 304.09064Q68.8 304.59064 67.84688 304.59064Q66.6125 304.59064 65.89375 303.7Q65.05 302.6375 65.05 300.21564ZM66.12813 300.21564Q66.12813 302.325 66.62813 303.02814Q67.12813 303.73126 67.84688 303.73126Q68.58125 303.73126 69.06563 303.02814Q69.56563 302.325 69.56563 300.21564Q69.56563 298.09064 69.06563 297.40314Q68.58125 296.7 67.83125 296.7Q67.1125 296.7 66.675 297.3094Q66.12813 298.09064 66.12813 300.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M55.01875 251.40834L53.971874 251.40834L53.971874 244.68959Q53.58125 245.04897 52.95625 245.42397Q52.346874 245.78334 51.8625 245.95522L51.8625 244.93959Q52.7375 244.51772 53.39375 243.93959Q54.065624 243.34584 54.346874 242.78334L55.01875 242.78334L55.01875 251.40834ZM58.05 247.17397Q58.05 245.64272 58.3625 244.72084Q58.675 243.78334 59.284374 243.28334Q59.909374 242.78334 60.846874 242.78334Q61.534374 242.78334 62.05 243.06459Q62.58125 243.34584 62.925 243.87709Q63.26875 244.39272 63.45625 245.14272Q63.64375 245.89272 63.64375 247.17397Q63.64375 248.68959 63.33125 249.61147Q63.034374 250.53334 62.409374 251.04897Q61.8 251.54897 60.846874 251.54897Q59.6125 251.54897 58.89375 250.65834Q58.05 249.59584 58.05 247.17397ZM59.128124 247.17397Q59.128124 249.28334 59.628124 249.98647Q60.128124 250.68959 60.846874 250.68959Q61.58125 250.68959 62.065624 249.98647Q62.565624 249.28334 62.565624 247.17397Q62.565624 245.04897 62.065624 244.36147Q61.58125 243.65834 60.83125 243.65834Q60.1125 243.65834 59.675 244.26772Q59.128124 245.04897 59.128124 247.17397ZM65.05 247.17397Q65.05 245.64272 65.3625 244.72084Q65.675 243.78334 66.28438 243.28334Q66.90938 242.78334 67.84688 242.78334Q68.53438 242.78334 69.05 243.06459Q69.58125 243.34584 69.925 243.87709Q70.26875 244.39272 70.45625 245.14272Q70.64375 245.89272 70.64375 247.17397Q70.64375 248.68959 70.33125 249.61147Q70.03438 250.53334 69.40938 251.04897Q68.8 251.54897 67.84688 251.54897Q66.6125 251.54897 65.89375 250.65834Q65.05 249.59584 65.05 247.17397ZM66.12813 247.17397Q66.12813 249.28334 66.62813 249.98647Q67.12813 250.68959 67.84688 250.68959Q68.58125 250.68959 69.06563 249.98647Q69.56563 249.28334 69.56563 247.17397Q69.56563 245.04897 69.06563 244.36147Q68.58125 243.65834 67.83125 243.65834Q67.1125 243.65834 66.675 244.26772Q66.12813 245.04897 66.12813 247.17397Z" fill-rule="nonzero"/><path fill="#000000" d="M56.596874 197.35104L56.596874 198.36667L50.909374 198.36667Q50.909374 197.99167 51.034374 197.6323Q51.253124 197.05417 51.721874 196.49167Q52.20625 195.92917 53.1125 195.1948Q54.51875 194.03854 55.003124 193.36667Q55.503124 192.6948 55.503124 192.10104Q55.503124 191.47604 55.05 191.05417Q54.596874 190.61667 53.878124 190.61667Q53.1125 190.61667 52.659374 191.0698Q52.20625 191.52292 52.190624 192.33542L51.1125 192.22604Q51.221874 191.0073 51.940624 190.3823Q52.675 189.74167 53.909374 189.74167Q55.14375 189.74167 55.8625 190.42917Q56.58125 191.11667 56.58125 192.1323Q56.58125 192.64792 56.3625 193.14792Q56.159374 193.6323 55.659374 194.1948Q55.175 194.74167 54.05 195.6948Q53.096874 196.49167 52.815624 196.78854Q52.55 197.0698 52.378124 197.35104L56.596874 197.35104ZM58.05 194.1323Q58.05 192.60104 58.3625 191.67917Q58.675 190.74167 59.284374 190.24167Q59.909374 189.74167 60.846874 189.74167Q61.534374 189.74167 62.05 190.02292Q62.58125 190.30417 62.925 190.83542Q63.26875 191.35104 63.45625 192.10104Q63.64375 192.85104 63.64375 194.1323Q63.64375 195.64792 63.33125 196.5698Q63.034374 197.49167 62.409374 198.0073Q61.8 198.5073 60.846874 198.5073Q59.6125 198.5073 58.89375 197.61667Q58.05 196.55417 58.05 194.1323ZM59.128124 194.1323Q59.128124 196.24167 59.628124 196.9448Q60.128124 197.64792 60.846874 197.64792Q61.58125 197.64792 62.065624 196.9448Q62.565624 196.24167 62.565624 194.1323Q62.565624 192.0073 62.065624 191.3198Q61.58125 190.61667 60.83125 190.61667Q60.1125 190.61667 59.675 191.22604Q59.128124 192.0073 59.128124 194.1323ZM65.05 194.1323Q65.05 192.60104 65.3625 191.67917Q65.675 190.74167 66.28438 190.24167Q66.90938 189.74167 67.84688 189.74167Q68.53438 189.74167 69.05 190.02292Q69.58125 190.30417 69.925 190.83542Q70.26875 191.35104 70.45625 192.10104Q70.64375 192.85104 70.64375 194.1323Q70.64375 195.64792 70.33125 196.5698Q70.03438 197.49167 69.40938 198.0073Q68.8 198.5073 67.84688 198.5073Q66.6125 198.5073 65.89375 197.61667Q65.05 196.55417 65.05 194.1323ZM66.12813 194.1323Q66.12813 196.24167 66.62813 196.9448Q67.12813 197.64792 67.84688 197.64792Q68.58125 197.64792 69.06563 196.9448Q69.56563 196.24167 69.56563 194.1323Q69.56563 192.0073 69.06563 191.3198Q68.58125 190.61667 67.83125 190.61667Q67.1125 190.61667 66.675 191.22604Q66.12813 192.0073 66.12813 194.1323Z" fill-rule="nonzero"/><path fill="#000000" d="M51.05 143.05937L52.1125 142.91875Q52.284374 143.80937 52.721874 144.21562Q53.159374 144.60625 53.784374 144.60625Q54.534374 144.60625 55.05 144.09062Q55.565624 143.575 55.565624 142.80937Q55.565624 142.09062 55.08125 141.62187Q54.6125 141.1375 53.878124 141.1375Q53.58125 141.1375 53.128124 141.2625L53.253124 140.325Q53.3625 140.34062 53.425 140.34062Q54.096874 140.34062 54.628124 139.99687Q55.175 139.6375 55.175 138.90312Q55.175 138.325 54.784374 137.95Q54.39375 137.55937 53.76875 137.55937Q53.159374 137.55937 52.7375 137.95Q52.33125 138.34062 52.221874 139.10625L51.159374 138.91875Q51.346874 137.87187 52.034374 137.29375Q52.721874 136.7 53.7375 136.7Q54.440624 136.7 55.034374 137.0125Q55.628124 137.30937 55.940624 137.825Q56.253124 138.34062 56.253124 138.93437Q56.253124 139.48125 55.95625 139.95Q55.659374 140.40312 55.08125 140.66875Q55.83125 140.84062 56.253124 141.40312Q56.675 141.95 56.675 142.79375Q56.675 143.91875 55.846874 144.7Q55.034374 145.48125 53.784374 145.48125Q52.659374 145.48125 51.909374 144.80937Q51.159374 144.12187 51.05 143.05937ZM58.05 141.09062Q58.05 139.55937 58.3625 138.6375Q58.675 137.7 59.284374 137.2Q59.909374 136.7 60.846874 136.7Q61.534374 136.7 62.05 136.98125Q62.58125 137.2625 62.925 137.79375Q63.26875 138.30937 63.45625 139.05937Q63.64375 139.80937 63.64375 141.09062Q63.64375 142.60625 63.33125 143.52812Q63.034374 144.45 62.409374 144.96562Q61.8 145.46562 60.846874 145.46562Q59.6125 145.46562 58.89375 144.575Q58.05 143.5125 58.05 141.09062ZM59.128124 141.09062Q59.128124 143.2 59.628124 143.90312Q60.128124 144.60625 60.846874 144.60625Q61.58125 144.60625 62.065624 143.90312Q62.565624 143.2 62.565624 141.09062Q62.565624 138.96562 62.065624 138.27812Q61.58125 137.575 60.83125 137.575Q60.1125 137.575 59.675 138.18437Q59.128124 138.96562 59.128124 141.09062ZM65.05 141.09062Q65.05 139.55937 65.3625 138.6375Q65.675 137.7 66.28438 137.2Q66.90938 136.7 67.84688 136.7Q68.53438 136.7 69.05 136.98125Q69.58125 137.2625 69.925 137.79375Q70.26875 138.30937 70.45625 139.05937Q70.64375 139.80937 70.64375 141.09062Q70.64375 142.60625 70.33125 143.52812Q70.03438 144.45 69.40938 144.96562Q68.8 145.46562 67.84688 145.46562Q66.6125 145.46562 65.89375 144.575Q65.05 143.5125 65.05 141.09062ZM66.12813 141.09062Q66.12813 143.2 66.62813 143.90312Q67.12813 144.60625 67.84688 144.60625Q68.58125 144.60625 69.06563 143.90312Q69.56563 143.2 69.56563 141.09062Q69.56563 138.96562 69.06563 138.27812Q68.58125 137.575 67.83125 137.575Q67.1125 137.575 66.675 138.18437Q66.12813 138.96562 66.12813 141.09062Z" fill-rule="nonzero"/><path fill="#000000" d="M54.425 92.28333L54.425 90.22083L50.70625 90.22083L50.70625 89.25208L54.628124 83.68958L55.4875 83.68958L55.4875 89.25208L56.64375 89.25208L56.64375 90.22083L55.4875 90.22083L55.4875 92.28333L54.425 92.28333ZM54.425 89.25208L54.425 85.39271L51.7375 89.25208L54.425 89.25208ZM58.05 88.04896Q58.05 86.51771 58.3625 85.59583Q58.675 84.65833 59.284374 84.15833Q59.909374 83.65833 60.846874 83.65833Q61.534374 83.65833 62.05 83.93958Q62.58125 84.22083 62.925 84.75208Q63.26875 85.26771 63.45625 86.01771Q63.64375 86.76771 63.64375 88.04896Q63.64375 89.56458 63.33125 90.48646Q63.034374 91.40833 62.409374 91.92396Q61.8 92.42396 60.846874 92.42396Q59.6125 92.42396 58.89375 91.53333Q58.05 90.47083 58.05 88.04896ZM59.128124 88.04896Q59.128124 90.15833 59.628124 90.86146Q60.128124 91.56458 60.846874 91.56458Q61.58125 91.56458 62.065624 90.86146Q62.565624 90.15833 62.565624 88.04896Q62.565624 85.92396 62.065624 85.23646Q61.58125 84.53333 60.83125 84.53333Q60.1125 84.53333 59.675 85.14271Q59.128124 85.92396 59.128124 88.04896ZM65.05 88.04896Q65.05 86.51771 65.3625 85.59583Q65.675 84.65833 66.28438 84.15833Q66.90938 83.65833 67.84688 83.65833Q68.53438 83.65833 69.05 83.93958Q69.58125 84.22083 69.925 84.75208Q70.26875 85.26771 70.45625 86.01771Q70.64375 86.76771 70.64375 88.04896Q70.64375 89.56458 70.33125 90.48646Q70.03438 91.40833 69.40938 91.92396Q68.8 92.42396 67.84688 92.42396Q66.6125 92.42396 65.89375 91.53333Q65.05 90.47083 65.05 88.04896ZM66.12813 88.04896Q66.12813 90.15833 66.62813 90.86146Q67.12813 91.56458 67.84688 91.56458Q68.58125 91.56458 69.06563 90.86146Q69.56563 90.15833 69.56563 88.04896Q69.56563 85.92396 69.06563 85.23646Q68.58125 84.53333 67.83125 84.53333Q67.1125 84.53333 66.675 85.14271Q66.12813 85.92396 66.12813 88.04896Z" fill-rule="nonzero"/><path fill="#000000" d="M165.58209 315.2L166.69147 315.10626Q166.81647 315.91876 167.25397 316.325Q167.70709 316.73126 168.34772 316.73126Q169.09772 316.73126 169.62897 316.15314Q170.16022 315.575 170.16022 314.6375Q170.16022 313.73126 169.64459 313.21564Q169.14459 312.6844 168.31647 312.6844Q167.81647 312.6844 167.39459 312.91876Q166.98834 313.15314 166.75397 313.5125L165.76959 313.3875L166.59772 308.98126L170.87897 308.98126L170.87897 309.98126L167.44147 309.98126L166.98834 312.29376Q167.75397 311.7469 168.59772 311.7469Q169.72272 311.7469 170.48834 312.52814Q171.26959 313.3094 171.26959 314.54376Q171.26959 315.7 170.59772 316.5594Q169.76959 317.59064 168.34772 317.59064Q167.17584 317.59064 166.42584 316.9344Q165.69147 316.27814 165.58209 315.2ZM172.58209 313.21564Q172.58209 311.6844 172.89459 310.7625Q173.20709 309.825 173.81647 309.325Q174.44147 308.825 175.37897 308.825Q176.06647 308.825 176.58209 309.10626Q177.11334 309.3875 177.45709 309.91876Q177.80084 310.4344 177.98834 311.1844Q178.17584 311.9344 178.17584 313.21564Q178.17584 314.73126 177.86334 315.65314Q177.56647 316.575 176.94147 317.09064Q176.33209 317.59064 175.37897 317.59064Q174.14459 317.59064 173.42584 316.7Q172.58209 315.6375 172.58209 313.21564ZM173.66022 313.21564Q173.66022 315.325 174.16022 316.02814Q174.66022 316.73126 175.37897 316.73126Q176.11334 316.73126 176.59772 316.02814Q177.09772 315.325 177.09772 313.21564Q177.09772 311.09064 176.59772 310.40314Q176.11334 309.7 175.36334 309.7Q174.64459 309.7 174.20709 310.3094Q173.66022 311.09064 173.66022 313.21564ZM179.58209 313.21564Q179.58209 311.6844 179.89459 310.7625Q180.20709 309.825 180.81647 309.325Q181.44147 308.825 182.37897 308.825Q183.06647 308.825 183.58209 309.10626Q184.11334 309.3875 184.45709 309.91876Q184.80084 310.4344 184.98834 311.1844Q185.17584 311.9344 185.17584 313.21564Q185.17584 314.73126 184.86334 315.65314Q184.56647 316.575 183.94147 317.09064Q183.33209 317.59064 182.37897 317.59064Q181.14459 317.59064 180.42584 316.7Q179.58209 315.6375 179.58209 313.21564ZM180.66022 313.21564Q180.66022 315.325 181.16022 316.02814Q181.66022 316.73126 182.37897 316.73126Q183.11334 316.73126 183.59772 316.02814Q184.09772 315.325 184.09772 313.21564Q184.09772 311.09064 183.59772 310.40314Q183.11334 309.7 182.36334 309.7Q181.64459 309.7 181.20709 310.3094Q180.66022 311.09064 180.66022 313.21564ZM186.58209 313.21564Q186.58209 311.6844 186.89459 310.7625Q187.20709 309.825 187.81647 309.325Q188.44147 308.825 189.37897 308.825Q190.06647 308.825 190.58209 309.10626Q191.11334 309.3875 191.45709 309.91876Q191.80084 310.4344 191.98834 311.1844Q192.17584 311.9344 192.17584 313.21564Q192.17584 314.73126 191.86334 315.65314Q191.56647 316.575 190.94147 317.09064Q190.33209 317.59064 189.37897 317.59064Q188.14459 317.59064 187.42584 316.7Q186.58209 315.6375 186.58209 313.21564ZM187.66022 313.21564Q187.66022 315.325 188.16022 316.02814Q188.66022 316.73126 189.37897 316.73126Q190.11334 316.73126 190.59772 316.02814Q191.09772 315.325 191.09772 313.21564Q191.09772 311.09064 190.59772 310.40314Q190.11334 309.7 189.36334 309.7Q188.64459 309.7 188.20709 310.3094Q187.66022 311.09064 187.66022 313.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M312.5 315.2L313.60938 315.10626Q313.73438 315.91876 314.17188 316.325Q314.625 316.73126 315.26562 316.73126Q316.01562 316.73126 316.54688 316.15314Q317.07812 315.575 317.07812 314.6375Q317.07812 313.73126 316.5625 313.21564Q316.0625 312.6844 315.23438 312.6844Q314.73438 312.6844 314.3125 312.91876Q313.90625 313.15314 313.67188 313.5125L312.6875 313.3875L313.51562 308.98126L317.79688 308.98126L317.79688 309.98126L314.35938 309.98126L313.90625 312.29376Q314.67188 311.7469 315.51562 311.7469Q316.64062 311.7469 317.40625 312.52814Q318.1875 313.3094 318.1875 314.54376Q318.1875 315.7 317.51562 316.5594Q316.6875 317.59064 315.26562 317.59064Q314.09375 317.59064 313.34375 316.9344Q312.60938 316.27814 312.5 315.2ZM319.5 313.21564Q319.5 311.6844 319.8125 310.7625Q320.125 309.825 320.73438 309.325Q321.35938 308.825 322.29688 308.825Q322.98438 308.825 323.5 309.10626Q324.03125 309.3875 324.375 309.91876Q324.71875 310.4344 324.90625 311.1844Q325.09375 311.9344 325.09375 313.21564Q325.09375 314.73126 324.78125 315.65314Q324.48438 316.575 323.85938 317.09064Q323.25 317.59064 322.29688 317.59064Q321.0625 317.59064 320.34375 316.7Q319.5 315.6375 319.5 313.21564ZM320.57812 313.21564Q320.57812 315.325 321.07812 316.02814Q321.57812 316.73126 322.29688 316.73126Q323.03125 316.73126 323.51562 316.02814Q324.01562 315.325 324.01562 313.21564Q324.01562 311.09064 323.51562 310.40314Q323.03125 309.7 322.28125 309.7Q321.5625 309.7 321.125 310.3094Q320.57812 311.09064 320.57812 313.21564ZM326.5 313.21564Q326.5 311.6844 326.8125 310.7625Q327.125 309.825 327.73438 309.325Q328.35938 308.825 329.29688 308.825Q329.98438 308.825 330.5 309.10626Q331.03125 309.3875 331.375 309.91876Q331.71875 310.4344 331.90625 311.1844Q332.09375 311.9344 332.09375 313.21564Q332.09375 314.73126 331.78125 315.65314Q331.48438 316.575 330.85938 317.09064Q330.25 317.59064 329.29688 317.59064Q328.0625 317.59064 327.34375 316.7Q326.5 315.6375 326.5 313.21564ZM327.57812 313.21564Q327.57812 315.325 328.07812 316.02814Q328.57812 316.73126 329.29688 316.73126Q330.03125 316.73126 330.51562 316.02814Q331.01562 315.325 331.01562 313.21564Q331.01562 311.09064 330.51562 310.40314Q330.03125 309.7 329.28125 309.7Q328.5625 309.7 328.125 310.3094Q327.57812 311.09064 327.57812 313.21564ZM333.5 313.21564Q333.5 311.6844 333.8125 310.7625Q334.125 309.825 334.73438 309.325Q335.35938 308.825 336.29688 308.825Q336.98438 308.825 337.5 309.10626Q338.03125 309.3875 338.375 309.91876Q338.71875 310.4344 338.90625 311.1844Q339.09375 311.9344 339.09375 313.21564Q339.09375 314.73126 338.78125 315.65314Q338.48438 316.575 337.85938 317.09064Q337.25 317.59064 336.29688 317.59064Q335.0625 317.59064 334.34375 316.7Q333.5 315.6375 333.5 313.21564ZM334.57812 313.21564Q334.57812 315.325 335.07812 316.02814Q335.57812 316.73126 336.29688 316.73126Q337.03125 316.73126 337.51562 316.02814Q338.01562 315.325 338.01562 313.21564Q338.01562 311.09064 337.51562 310.40314Q337.03125 309.7 336.28125 309.7Q335.5625 309.7 335.125 310.3094Q334.57812 311.09064 334.57812 313.21564ZM340.5 313.21564Q340.5 311.6844 340.8125 310.7625Q341.125 309.825 341.73438 309.325Q342.35938 308.825 343.29688 308.825Q343.98438 308.825 344.5 309.10626Q345.03125 309.3875 345.375 309.91876Q345.71875 310.4344 345.90625 311.1844Q346.09375 311.9344 346.09375 313.21564Q346.09375 314.73126 345.78125 315.65314Q345.48438 316.575 344.85938 317.09064Q344.25 317.59064 343.29688 317.59064Q342.0625 317.59064 341.34375 316.7Q340.5 315.6375 340.5 313.21564ZM341.57812 313.21564Q341.57812 315.325 342.07812 316.02814Q342.57812 316.73126 343.29688 316.73126Q344.03125 316.73126 344.51562 316.02814Q345.01562 315.325 345.01562 313.21564Q345.01562 311.09064 344.51562 310.40314Q344.03125 309.7 343.28125 309.7Q342.5625 309.7 342.125 310.3094Q341.57812 311.09064 341.57812 313.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M459.4179 315.2L460.52728 315.10626Q460.65228 315.91876 461.08978 316.325Q461.5429 316.73126 462.18353 316.73126Q462.93353 316.73126 463.46478 316.15314Q463.99603 315.575 463.99603 314.6375Q463.99603 313.73126 463.4804 313.21564Q462.9804 312.6844 462.15228 312.6844Q461.65228 312.6844 461.2304 312.91876Q460.82416 313.15314 460.58978 313.5125L459.6054 313.3875L460.43353 308.98126L464.71478 308.98126L464.71478 309.98126L461.27728 309.98126L460.82416 312.29376Q461.58978 311.7469 462.43353 311.7469Q463.55853 311.7469 464.32416 312.52814Q465.1054 313.3094 465.1054 314.54376Q465.1054 315.7 464.43353 316.5594Q463.6054 317.59064 462.18353 317.59064Q461.01166 317.59064 460.26166 316.9344Q459.52728 316.27814 459.4179 315.2ZM466.4179 313.21564Q466.4179 311.6844 466.7304 310.7625Q467.0429 309.825 467.65228 309.325Q468.27728 308.825 469.21478 308.825Q469.90228 308.825 470.4179 309.10626Q470.94916 309.3875 471.2929 309.91876Q471.63666 310.4344 471.82416 311.1844Q472.01166 311.9344 472.01166 313.21564Q472.01166 314.73126 471.69916 315.65314Q471.40228 316.575 470.77728 317.09064Q470.1679 317.59064 469.21478 317.59064Q467.9804 317.59064 467.26166 316.7Q466.4179 315.6375 466.4179 313.21564ZM467.49603 313.21564Q467.49603 315.325 467.99603 316.02814Q468.49603 316.73126 469.21478 316.73126Q469.94916 316.73126 470.43353 316.02814Q470.93353 315.325 470.93353 313.21564Q470.93353 311.09064 470.43353 310.40314Q469.94916 309.7 469.19916 309.7Q468.4804 309.7 468.0429 310.3094Q467.49603 311.09064 467.49603 313.21564ZM473.4179 313.21564Q473.4179 311.6844 473.7304 310.7625Q474.0429 309.825 474.65228 309.325Q475.27728 308.825 476.21478 308.825Q476.90228 308.825 477.4179 309.10626Q477.94916 309.3875 478.2929 309.91876Q478.63666 310.4344 478.82416 311.1844Q479.01166 311.9344 479.01166 313.21564Q479.01166 314.73126 478.69916 315.65314Q478.40228 316.575 477.77728 317.09064Q477.1679 317.59064 476.21478 317.59064Q474.9804 317.59064 474.26166 316.7Q473.4179 315.6375 473.4179 313.21564ZM474.49603 313.21564Q474.49603 315.325 474.99603 316.02814Q475.49603 316.73126 476.21478 316.73126Q476.94916 316.73126 477.43353 316.02814Q477.93353 315.325 477.93353 313.21564Q477.93353 311.09064 477.43353 310.40314Q476.94916 309.7 476.19916 309.7Q475.4804 309.7 475.0429 310.3094Q474.49603 311.09064 474.49603 313.21564ZM480.4179 313.21564Q480.4179 311.6844 480.7304 310.7625Q481.0429 309.825 481.65228 309.325Q482.27728 308.825 483.21478 308.825Q483.90228 308.825 484.4179 309.10626Q484.94916 309.3875 485.2929 309.91876Q485.63666 310.4344 485.82416 311.1844Q486.01166 311.9344 486.01166 313.21564Q486.01166 314.73126 485.69916 315.65314Q485.40228 316.575 484.77728 317.09064Q484.1679 317.59064 483.21478 317.59064Q481.9804 317.59064 481.26166 316.7Q480.4179 315.6375 480.4179 313.21564ZM481.49603 313.21564Q481.49603 315.325 481.99603 316.02814Q482.49603 316.73126 483.21478 316.73126Q483.94916 316.73126 484.43353 316.02814Q484.93353 315.325 484.93353 313.21564Q484.93353 311.09064 484.43353 310.40314Q483.94916 309.7 483.19916 309.7Q482.4804 309.7 482.0429 310.3094Q481.49603 311.09064 481.49603 313.21564ZM487.4179 313.21564Q487.4179 311.6844 487.7304 310.7625Q488.0429 309.825 488.65228 309.325Q489.27728 308.825 490.21478 308.825Q490.90228 308.825 491.4179 309.10626Q491.94916 309.3875 492.2929 309.91876Q492.63666 310.4344 492.82416 311.1844Q493.01166 311.9344 493.01166 313.21564Q493.01166 314.73126 492.69916 315.65314Q492.40228 316.575 491.77728 317.09064Q491.1679 317.59064 490.21478 317.59064Q488.9804 317.59064 488.26166 316.7Q487.4179 315.6375 487.4179 313.21564ZM488.49603 313.21564Q488.49603 315.325 488.99603 316.02814Q489.49603 316.73126 490.21478 316.73126Q490.94916 316.73126 491.43353 316.02814Q491.93353 315.325 491.93353 313.21564Q491.93353 311.09064 491.43353 310.40314Q490.94916 309.7 490.19916 309.7Q489.4804 309.7 489.0429 310.3094Q488.49603 311.09064 488.49603 313.21564ZM494.4179 313.21564Q494.4179 311.6844 494.7304 310.7625Q495.0429 309.825 495.65228 309.325Q496.27728 308.825 497.21478 308.825Q497.90228 308.825 498.4179 309.10626Q498.94916 309.3875 499.2929 309.91876Q499.63666 310.4344 499.82416 311.1844Q500.01166 311.9344 500.01166 313.21564Q500.01166 314.73126 499.69916 315.65314Q499.40228 316.575 498.77728 317.09064Q498.1679 317.59064 497.21478 317.59064Q495.9804 317.59064 495.26166 316.7Q494.4179 315.6375 494.4179 313.21564ZM495.49603 313.21564Q495.49603 315.325 495.99603 316.02814Q496.49603 316.73126 497.21478 316.73126Q497.94916 316.73126 498.43353 316.02814Q498.93353 315.325 498.93353 313.21564Q498.93353 311.09064 498.43353 310.40314Q497.94916 309.7 497.19916 309.7Q496.4804 309.7 496.0429 310.3094Q495.49603 311.09064 495.49603 313.21564Z" fill-rule="nonzero"/><path fill="#4285f4" d="M191.0 56.916668C191.0 56.364384 191.44771 55.916668 192.0 55.916668L202.0 55.916668C202.55229 55.916668 203.0 56.364384 203.0 56.916668L203.0 66.916664C203.0 67.46895 202.55229 67.916664 202.0 67.916664L192.0 67.916664C191.44771 67.916664 191.0 67.46895 191.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M211.92188 65.916664L211.92188 57.322914L213.07812 57.322914L217.59375 64.072914L217.59375 57.322914L218.6875 57.322914L218.6875 65.916664L217.51562 65.916664L213.0 59.166664L213.0 65.916664L211.92188 65.916664ZM224.85938 65.15104Q224.26562 65.65104 223.71875 65.854164Q223.1875 66.05729 222.5625 66.05729Q221.53125 66.05729 220.98438 65.55729Q220.4375 65.05729 220.4375 64.27604Q220.4375 63.822914 220.64062 63.447914Q220.84375 63.05729 221.1875 62.83854Q221.53125 62.604164 221.95312 62.49479Q222.25 62.40104 222.89062 62.322914Q224.15625 62.18229 224.76562 61.96354Q224.76562 61.74479 224.76562 61.697914Q224.76562 61.041664 224.46875 60.77604Q224.0625 60.43229 223.26562 60.43229Q222.53125 60.43229 222.17188 60.697914Q221.8125 60.947914 221.64062 61.604164L220.60938 61.46354Q220.75 60.80729 221.07812 60.40104Q221.40625 59.99479 222.01562 59.77604Q222.625 59.55729 223.42188 59.55729Q224.21875 59.55729 224.71875 59.74479Q225.21875 59.93229 225.45312 60.21354Q225.6875 60.49479 225.78125 60.93229Q225.82812 61.197914 225.82812 61.90104L225.82812 63.30729Q225.82812 64.77604 225.89062 65.166664Q225.96875 65.55729 226.17188 65.916664L225.0625 65.916664Q224.90625 65.58854 224.85938 65.15104ZM224.76562 62.791664Q224.1875 63.02604 223.04688 63.197914Q222.39062 63.291664 222.125 63.416664Q221.85938 63.52604 221.70312 63.74479Q221.5625 63.96354 221.5625 64.24479Q221.5625 64.666664 221.875 64.947914Q222.20312 65.229164 222.8125 65.229164Q223.42188 65.229164 223.89062 64.96354Q224.375 64.697914 224.59375 64.229164Q224.76562 63.86979 224.76562 63.18229L224.76562 62.791664ZM227.79688 58.541664L227.79688 57.322914L228.85938 57.322914L228.85938 58.541664L227.79688 58.541664ZM227.79688 65.916664L227.79688 59.697914L228.85938 59.697914L228.85938 65.916664L227.79688 65.916664ZM232.51562 65.916664L230.15625 59.697914L231.26562 59.697914L232.60938 63.416664Q232.8125 64.02604 233.0 64.666664Q233.14062 64.18229 233.39062 63.49479L234.78125 59.697914L235.85938 59.697914L233.5 65.916664L232.51562 65.916664ZM240.04688 63.916664L241.14062 64.041664Q240.89062 64.99479 240.1875 65.52604Q239.48438 66.05729 238.40625 66.05729Q237.04688 66.05729 236.23438 65.21354Q235.4375 64.36979 235.4375 62.854164Q235.4375 61.291664 236.25 60.43229Q237.0625 59.55729 238.34375 59.55729Q239.59375 59.55729 240.375 60.40104Q241.17188 61.24479 241.17188 62.791664Q241.17188 62.885414 241.17188 63.072914L236.53125 63.072914Q236.59375 64.104164 237.10938 64.65104Q237.625 65.18229 238.40625 65.18229Q238.98438 65.18229 239.39062 64.885414Q239.8125 64.572914 240.04688 63.916664ZM236.59375 62.21354L240.0625 62.21354Q240.0 61.416664 239.67188 61.02604Q239.15625 60.416664 238.35938 60.416664Q237.625 60.416664 237.125 60.90104Q236.64062 61.385414 236.59375 62.21354Z" fill-rule="nonzero"/><path fill="#ea4335" d="M258.0 56.916668C258.0 56.364384 258.44772 55.916668 259.0 55.916668L269.0 55.916668C269.55228 55.916668 270.0 56.364384 270.0 56.916668L270.0 66.916664C270.0 67.46895 269.55228 67.916664 269.0 67.916664L259.0 67.916664C258.44772 67.916664 258.0 67.46895 258.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M284.5625 57.322914L285.70312 57.322914L285.70312 62.291664Q285.70312 63.58854 285.40625 64.354164Q285.10938 65.104164 284.34375 65.58854Q283.57812 66.05729 282.34375 66.05729Q281.14062 66.05729 280.35938 65.65104Q279.59375 65.229164 279.26562 64.447914Q278.9375 63.65104 278.9375 62.291664L278.9375 57.322914L280.07812 57.322914L280.07812 62.27604Q280.07812 63.40104 280.28125 63.93229Q280.5 64.46354 281.0 64.760414Q281.51562 65.041664 282.25 65.041664Q283.5 65.041664 284.03125 64.479164Q284.5625 63.90104 284.5625 62.27604L284.5625 57.322914ZM287.79688 65.916664L287.79688 59.697914L288.73438 59.697914L288.73438 60.572914Q289.42188 59.55729 290.71875 59.55729Q291.28125 59.55729 291.75 59.760414Q292.23438 59.96354 292.46875 60.291664Q292.70312 60.61979 292.79688 61.05729Q292.84375 61.354164 292.84375 62.08854L292.84375 65.916664L291.79688 65.916664L291.79688 62.135414Q291.79688 61.479164 291.67188 61.166664Q291.54688 60.854164 291.23438 60.666664Q290.92188 60.46354 290.5 60.46354Q289.82812 60.46354 289.32812 60.90104Q288.84375 61.322914 288.84375 62.510414L288.84375 65.916664L287.79688 65.916664ZM294.79688 58.541664L294.79688 57.322914L295.85938 57.322914L295.85938 58.541664L294.79688 58.541664ZM294.79688 65.916664L294.79688 59.697914L295.85938 59.697914L295.85938 65.916664L294.79688 65.916664ZM298.04688 65.916664L298.04688 60.510414L297.10938 60.510414L297.10938 59.697914L298.04688 59.697914L298.04688 59.02604Q298.04688 58.40104 298.15625 58.104164Q298.3125 57.68229 298.6875 57.43229Q299.07812 57.18229 299.76562 57.18229Q300.21875 57.18229 300.75 57.291664L300.59375 58.197914Q300.26562 58.15104 299.96875 58.15104Q299.48438 58.15104 299.28125 58.354164Q299.09375 58.55729 299.09375 59.11979L299.09375 59.697914L300.3125 59.697914L300.3125 60.510414L299.09375 60.510414L299.09375 65.916664L298.04688 65.916664ZM300.40625 62.80729Q300.40625 61.072914 301.35938 60.24479Q302.15625 59.55729 303.3125 59.55729Q304.59375 59.55729 305.40625 60.40104Q306.23438 61.229164 306.23438 62.71354Q306.23438 63.916664 305.875 64.604164Q305.51562 65.291664 304.8125 65.68229Q304.125 66.05729 303.3125 66.05729Q302.01562 66.05729 301.20312 65.229164Q300.40625 64.385414 300.40625 62.80729ZM301.48438 62.80729Q301.48438 63.99479 302.0 64.58854Q302.53125 65.18229 303.3125 65.18229Q304.10938 65.18229 304.625 64.58854Q305.14062 63.99479 305.14062 62.77604Q305.14062 61.61979 304.60938 61.02604Q304.09375 60.43229 303.3125 60.43229Q302.53125 60.43229 302.0 61.02604Q301.48438 61.604164 301.48438 62.80729ZM307.78125 65.916664L307.78125 59.697914L308.73438 59.697914L308.73438 60.635414Q309.09375 59.979164 309.39062 59.77604Q309.70312 59.55729 310.07812 59.55729Q310.60938 59.55729 311.15625 59.885414L310.79688 60.86979Q310.40625 60.635414 310.03125 60.635414Q309.67188 60.635414 309.39062 60.854164Q309.125 61.05729 309.01562 61.43229Q308.82812 61.99479 308.82812 62.65104L308.82812 65.916664L307.78125 65.916664ZM311.79688 65.916664L311.79688 59.697914L312.73438 59.697914L312.73438 60.572914Q313.03125 60.104164 313.51562 59.83854Q314.0 59.55729 314.625 59.55729Q315.3125 59.55729 315.75 59.83854Q316.20312 60.11979 316.375 60.635414Q317.125 59.55729 318.29688 59.55729Q319.23438 59.55729 319.71875 60.072914Q320.21875 60.572914 320.21875 61.65104L320.21875 65.916664L319.17188 65.916664L319.17188 61.99479Q319.17188 61.36979 319.0625 61.08854Q318.96875 60.80729 318.70312 60.635414Q318.4375 60.46354 318.0625 60.46354Q317.40625 60.46354 316.96875 60.90104Q316.54688 61.33854 316.54688 62.30729L316.54688 65.916664L315.48438 65.916664L315.48438 61.86979Q315.48438 61.166664 315.21875 60.822914Q314.96875 60.46354 314.39062 60.46354Q313.9375 60.46354 313.5625 60.697914Q313.1875 60.93229 313.01562 61.385414Q312.84375 61.83854 312.84375 62.68229L312.84375 65.916664L311.79688 65.916664Z" fill-rule="nonzero"/><path fill="#fbbc04" d="M338.0 56.916668C338.0 56.364384 338.44772 55.916668 339.0 55.916668L349.0 55.916668C349.55228 55.916668 350.0 56.364384 350.0 56.916668L350.0 66.916664C350.0 67.46895 349.55228 67.916664 349.0 67.916664L339.0 67.916664C338.44772 67.916664 338.0 67.46895 338.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M365.0625 62.90104L366.1875 63.197914Q365.82812 64.58854 364.90625 65.322914Q363.98438 66.05729 362.64062 66.05729Q361.25 66.05729 360.375 65.49479Q359.5 64.93229 359.04688 63.86979Q358.59375 62.791664 358.59375 61.55729Q358.59375 60.21354 359.10938 59.21354Q359.625 58.21354 360.5625 57.697914Q361.51562 57.18229 362.65625 57.18229Q363.9375 57.18229 364.8125 57.83854Q365.70312 58.49479 366.04688 59.68229L364.92188 59.947914Q364.625 59.010414 364.04688 58.58854Q363.48438 58.15104 362.625 58.15104Q361.64062 58.15104 360.96875 58.635414Q360.3125 59.104164 360.03125 59.90104Q359.76562 60.697914 359.76562 61.55729Q359.76562 62.65104 360.07812 63.46354Q360.40625 64.27604 361.07812 64.68229Q361.75 65.08854 362.54688 65.08854Q363.5 65.08854 364.15625 64.541664Q364.82812 63.99479 365.0625 62.90104ZM367.40625 62.80729Q367.40625 61.072914 368.35938 60.24479Q369.15625 59.55729 370.3125 59.55729Q371.59375 59.55729 372.40625 60.40104Q373.23438 61.229164 373.23438 62.71354Q373.23438 63.916664 372.875 64.604164Q372.51562 65.291664 371.8125 65.68229Q371.125 66.05729 370.3125 66.05729Q369.01562 66.05729 368.20312 65.229164Q367.40625 64.385414 367.40625 62.80729ZM368.48438 62.80729Q368.48438 63.99479 369.0 64.58854Q369.53125 65.18229 370.3125 65.18229Q371.10938 65.18229 371.625 64.58854Q372.14062 63.99479 372.14062 62.77604Q372.14062 61.61979 371.60938 61.02604Q371.09375 60.43229 370.3125 60.43229Q369.53125 60.43229 369.0 61.02604Q368.48438 61.604164 368.48438 62.80729ZM374.79688 65.916664L374.79688 57.322914L375.84375 57.322914L375.84375 60.40104Q376.57812 59.55729 377.70312 59.55729Q378.40625 59.55729 378.90625 59.83854Q379.42188 60.104164 379.64062 60.58854Q379.85938 61.05729 379.85938 61.979164L379.85938 65.916664L378.8125 65.916664L378.8125 61.979164Q378.8125 61.18229 378.46875 60.822914Q378.125 60.46354 377.5 60.46354Q377.03125 60.46354 376.60938 60.71354Q376.20312 60.947914 376.01562 61.36979Q375.84375 61.77604 375.84375 62.510414L375.84375 65.916664L374.79688 65.916664ZM386.04688 63.916664L387.14062 64.041664Q386.89062 64.99479 386.1875 65.52604Q385.48438 66.05729 384.40625 66.05729Q383.04688 66.05729 382.23438 65.21354Q381.4375 64.36979 381.4375 62.854164Q381.4375 61.291664 382.25 60.43229Q383.0625 59.55729 384.34375 59.55729Q385.59375 59.55729 386.375 60.40104Q387.17188 61.24479 387.17188 62.791664Q387.17188 62.885414 387.17188 63.072914L382.53125 63.072914Q382.59375 64.104164 383.10938 64.65104Q383.625 65.18229 384.40625 65.18229Q384.98438 65.18229 385.39062 64.885414Q385.8125 64.572914 386.04688 63.916664ZM382.59375 62.21354L386.0625 62.21354Q386.0 61.416664 385.67188 61.02604Q385.15625 60.416664 384.35938 60.416664Q383.625 60.416664 383.125 60.90104Q382.64062 61.385414 382.59375 62.21354ZM388.78125 65.916664L388.78125 59.697914L389.73438 59.697914L389.73438 60.635414Q390.09375 59.979164 390.39062 59.77604Q390.70312 59.55729 391.07812 59.55729Q391.60938 59.55729 392.15625 59.885414L391.79688 60.86979Q391.40625 60.635414 391.03125 60.635414Q390.67188 60.635414 390.39062 60.854164Q390.125 61.05729 390.01562 61.43229Q389.82812 61.99479 389.82812 62.65104L389.82812 65.916664L388.78125 65.916664ZM397.04688 63.916664L398.14062 64.041664Q397.89062 64.99479 397.1875 65.52604Q396.48438 66.05729 395.40625 66.05729Q394.04688 66.05729 393.23438 65.21354Q392.4375 64.36979 392.4375 62.854164Q392.4375 61.291664 393.25 60.43229Q394.0625 59.55729 395.34375 59.55729Q396.59375 59.55729 397.375 60.40104Q398.17188 61.24479 398.17188 62.791664Q398.17188 62.885414 398.17188 63.072914L393.53125 63.072914Q393.59375 64.104164 394.10938 64.65104Q394.625 65.18229 395.40625 65.18229Q395.98438 65.18229 396.39062 64.885414Q396.8125 64.572914 397.04688 63.916664ZM393.59375 62.21354L397.0625 62.21354Q397.0 61.416664 396.67188 61.02604Q396.15625 60.416664 395.35938 60.416664Q394.625 60.416664 394.125 60.90104Q393.64062 61.385414 393.59375 62.21354ZM399.79688 65.916664L399.79688 59.697914L400.73438 59.697914L400.73438 60.572914Q401.42188 59.55729 402.71875 59.55729Q403.28125 59.55729 403.75 59.760414Q404.23438 59.96354 404.46875 60.291664Q404.70312 60.61979 404.79688 61.05729Q404.84375 61.354164 404.84375 62.08854L404.84375 65.916664L403.79688 65.916664L403.79688 62.135414Q403.79688 61.479164 403.67188 61.166664Q403.54688 60.854164 403.23438 60.666664Q402.92188 60.46354 402.5 60.46354Q401.82812 60.46354 401.32812 60.90104Q400.84375 61.322914 400.84375 62.510414L400.84375 65.916664L399.79688 65.916664ZM409.09375 64.979164L409.25 65.90104Q408.79688 65.99479 408.45312 65.99479Q407.875 65.99479 407.5625 65.822914Q407.25 65.635414 407.10938 65.33854Q406.98438 65.041664 406.98438 64.08854L406.98438 60.510414L406.21875 60.510414L406.21875 59.697914L406.98438 59.697914L406.98438 58.15104L408.03125 57.52604L408.03125 59.697914L409.09375 59.697914L409.09375 60.510414L408.03125 60.510414L408.03125 64.15104Q408.03125 64.604164 408.07812 64.729164Q408.14062 64.854164 408.26562 64.93229Q408.39062 65.010414 408.625 65.010414Q408.8125 65.010414 409.09375 64.979164Z" fill-rule="nonzero"/><path fill="#757575" d="M24.190624 37.55L18.64375 23.2375L20.690624 23.2375L24.409374 33.628124Q24.8625 34.878124 25.159374 35.971874Q25.4875 34.8 25.940624 33.628124L29.8 23.2375L31.7375 23.2375L26.128124 37.55L24.190624 37.55ZM32.878124 25.253124L32.878124 23.2375L34.64375 23.2375L34.64375 25.253124L32.878124 25.253124ZM32.878124 37.55L32.878124 27.175L34.64375 27.175L34.64375 37.55L32.878124 37.55ZM36.159374 34.45625L37.909374 34.175Q38.05 35.221874 38.721874 35.784374Q39.39375 36.33125 40.596874 36.33125Q41.8 36.33125 42.378124 35.846874Q42.971874 35.346874 42.971874 34.690624Q42.971874 34.096874 42.45625 33.753124Q42.096874 33.51875 40.659374 33.159374Q38.721874 32.659374 37.971874 32.315624Q37.2375 31.95625 36.846874 31.33125Q36.45625 30.690624 36.45625 29.925Q36.45625 29.2375 36.76875 28.64375Q37.096874 28.05 37.64375 27.659374Q38.05 27.3625 38.753124 27.159374Q39.471874 26.940624 40.284374 26.940624Q41.503124 26.940624 42.425 27.3Q43.346874 27.64375 43.784374 28.253124Q44.221874 28.846874 44.39375 29.846874L42.675 30.08125Q42.55 29.284374 41.9875 28.846874Q41.425 28.39375 40.409374 28.39375Q39.190624 28.39375 38.675 28.8Q38.159374 29.190624 38.159374 29.721874Q38.159374 30.065624 38.378124 30.346874Q38.58125 30.628124 39.05 30.815624Q39.315624 30.909374 40.596874 31.253124Q42.471874 31.753124 43.20625 32.08125Q43.940624 32.39375 44.3625 33.003124Q44.784374 33.596874 44.784374 34.503124Q44.784374 35.378124 44.26875 36.159374Q43.753124 36.940624 42.784374 37.3625Q41.815624 37.784374 40.596874 37.784374Q38.58125 37.784374 37.51875 36.940624Q36.45625 36.096874 36.159374 34.45625ZM53.659374 37.55L53.659374 36.01875Q52.45625 37.784374 50.378124 37.784374Q49.45625 37.784374 48.659374 37.440624Q47.8625 37.08125 47.471874 36.55Q47.096874 36.01875 46.940624 35.2375Q46.83125 34.721874 46.83125 33.596874L46.83125 27.175L48.58125 27.175L48.58125 32.925Q48.58125 34.3 48.690624 34.784374Q48.8625 35.471874 49.39375 35.878124Q49.940624 36.26875 50.721874 36.26875Q51.51875 36.26875 52.20625 35.8625Q52.909374 35.45625 53.190624 34.76875Q53.4875 34.065624 53.4875 32.7375L53.4875 27.175L55.2375 27.175L55.2375 37.55L53.659374 37.55ZM63.64375 36.26875Q62.659374 37.096874 61.753124 37.440624Q60.846874 37.784374 59.815624 37.784374Q58.1125 37.784374 57.190624 36.95625Q56.26875 36.1125 56.26875 34.815624Q56.26875 34.05 56.6125 33.425Q56.971874 32.8 57.534374 32.425Q58.096874 32.034374 58.8 31.83125Q59.315624 31.70625 60.3625 31.565624Q62.4875 31.315624 63.4875 30.971874Q63.503124 30.6125 63.503124 30.503124Q63.503124 29.440624 63.003124 28.9875Q62.33125 28.39375 61.003124 28.39375Q59.753124 28.39375 59.159374 28.83125Q58.58125 29.26875 58.3 30.378124L56.58125 30.14375Q56.815624 29.034374 57.346874 28.3625Q57.878124 27.675 58.89375 27.315624Q59.909374 26.940624 61.253124 26.940624Q62.58125 26.940624 63.409374 27.253124Q64.2375 27.565624 64.62813 28.05Q65.01875 28.51875 65.175 29.2375Q65.26875 29.690624 65.26875 30.8625L65.26875 33.20625Q65.26875 35.659374 65.37813 36.315624Q65.4875 36.95625 65.83125 37.55L63.9875 37.55Q63.721874 37.003124 63.64375 36.26875ZM63.4875 32.346874Q62.534374 32.7375 60.6125 33.003124Q59.534374 33.159374 59.08125 33.3625Q58.64375 33.55 58.39375 33.925Q58.14375 34.3 58.14375 34.76875Q58.14375 35.471874 58.675 35.940624Q59.20625 36.409374 60.2375 36.409374Q61.253124 36.409374 62.034374 35.971874Q62.83125 35.51875 63.20625 34.753124Q63.4875 34.14375 63.4875 32.9875L63.4875 32.346874ZM67.83125 37.55L67.83125 23.2375L69.58125 23.2375L69.58125 37.55L67.83125 37.55ZM71.87813 25.253124L71.87813 23.2375L73.64375 23.2375L73.64375 25.253124L71.87813 25.253124ZM71.87813 37.55L71.87813 27.175L73.64375 27.175L73.64375 37.55L71.87813 37.55ZM74.94063 37.55L74.94063 36.128124L81.55 28.55Q80.425 28.596874 79.56563 28.596874L75.33125 28.596874L75.33125 27.175L83.81563 27.175L83.81563 28.346874L78.19063 34.925L77.1125 36.128124Q78.28438 36.034374 79.33125 36.034374L84.12813 36.034374L84.12813 37.55L74.94063 37.55ZM91.97188 34.20625L93.78438 34.440624Q93.3625 36.01875 92.19063 36.909374Q91.03438 37.784374 89.22188 37.784374Q86.95625 37.784374 85.6125 36.39375Q84.28438 34.9875 84.28438 32.45625Q84.28438 29.83125 85.62813 28.39375Q86.97188 26.940624 89.12813 26.940624Q91.20625 26.940624 92.51875 28.3625Q93.84688 29.76875 93.84688 32.346874Q93.84688 32.503124 93.83125 32.815624L86.09688 32.815624Q86.19063 34.51875 87.06563 35.425Q87.94063 36.33125 89.2375 36.33125Q90.20625 36.33125 90.87813 35.83125Q91.56563 35.315624 91.97188 34.20625ZM86.19063 31.3625L91.9875 31.3625Q91.87813 30.065624 91.33125 29.409374Q90.4875 28.39375 89.14375 28.39375Q87.94063 28.39375 87.1125 29.20625Q86.28438 30.003124 86.19063 31.3625ZM101.51875 30.58125Q101.51875 27.01875 103.425 25.003124Q105.34688 22.971874 108.37813 22.971874Q110.3625 22.971874 111.94063 23.925Q113.53438 24.878124 114.3625 26.58125Q115.20625 28.26875 115.20625 30.409374Q115.20625 32.58125 114.33125 34.3Q113.45625 36.01875 111.83125 36.909374Q110.22188 37.8 108.3625 37.8Q106.34688 37.8 104.75313 36.83125Q103.15938 35.846874 102.33125 34.159374Q101.51875 32.45625 101.51875 30.58125ZM103.47188 30.6125Q103.47188 33.190624 104.8625 34.690624Q106.25313 36.175 108.34688 36.175Q110.4875 36.175 111.8625 34.675Q113.25313 33.159374 113.25313 30.39375Q113.25313 28.659374 112.65938 27.3625Q112.08125 26.05 110.94063 25.33125Q109.8 24.6125 108.37813 24.6125Q106.37813 24.6125 104.925 26.003124Q103.47188 27.378124 103.47188 30.6125ZM117.8625 37.55L117.8625 27.175L119.45625 27.175L119.45625 28.659374Q120.59688 26.940624 122.75313 26.940624Q123.69063 26.940624 124.47188 27.284374Q125.26875 27.6125 125.65938 28.159374Q126.05 28.70625 126.20625 29.45625Q126.3 29.95625 126.3 31.175L126.3 37.55L124.53438 37.55L124.53438 31.2375Q124.53438 30.159374 124.33125 29.628124Q124.12813 29.096874 123.59688 28.784374Q123.08125 28.471874 122.37813 28.471874Q121.25313 28.471874 120.44063 29.190624Q119.62813 29.89375 119.62813 31.878124L119.62813 37.55L117.8625 37.55Z" fill-rule="nonzero"/></svg> \ No newline at end of file diff --git a/images/blocksize.svg b/images/blocksize.svg new file mode 100644 index 0000000..edd9802 --- /dev/null +++ b/images/blocksize.svg @@ -0,0 +1 @@ +<svg version="1.1" viewBox="0.0 0.0 600.0 371.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" width="600" height="371" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" d="M0 0L600.0 0L600.0 371.0L0 371.0L0 0Z" fill-rule="nonzero"/><path stroke="#333333" stroke-width="1.0" stroke-linecap="butt" d="M77.5 300.5L581.5 300.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 247.5L581.5 247.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 194.5L581.5 194.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 141.5L581.5 141.5" fill-rule="nonzero"/><path stroke="#cccccc" stroke-width="1.0" stroke-linecap="butt" d="M77.5 88.5L581.5 88.5" fill-rule="nonzero"/><clipPath id="id_0"><path d="M77.55 88.28333L581.45 88.28333L581.45 300.45L77.55 300.45L77.55 88.28333Z" clip-rule="nonzero"/></clipPath><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M162.0 300.0L131.0 300.0L131.0 299.5C131.0 299.22385 131.22386 299.0 131.5 299.0L161.5 299.0C161.77614 299.0 162.0 299.22385 162.0 299.5Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M162.0 300.0L131.0 300.0L131.0 299.5C131.0 299.22385 131.22386 299.0 131.5 299.0L161.5 299.0C161.77614 299.0 162.0 299.22385 162.0 299.5Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M313.0 300.0L282.0 300.0L282.0 299.5C282.0 299.22385 282.22385 299.0 282.5 299.0L312.5 299.0C312.77615 299.0 313.0 299.22385 313.0 299.5Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M313.0 300.0L282.0 300.0L282.0 299.5C282.0 299.22385 282.22385 299.0 282.5 299.0L312.5 299.0C312.77615 299.0 313.0 299.22385 313.0 299.5Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M463.0 300.0L432.0 300.0L432.0 299.5C432.0 299.22385 432.22385 299.0 432.5 299.0L462.5 299.0C462.77615 299.0 463.0 299.22385 463.0 299.5Z" fill-rule="nonzero"/><path fill="#4285f4" clip-path="url(#id_0)" d="M463.0 300.0L432.0 300.0L432.0 299.5C432.0 299.22385 432.22385 299.0 432.5 299.0L462.5 299.0C462.77615 299.0 463.0 299.22385 463.0 299.5Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M195.0 300.0L164.0 300.0L164.0 119.0C164.0 117.89543 164.89543 117.0 166.0 117.0L193.0 117.0C194.10457 117.0 195.0 117.89543 195.0 119.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M195.0 300.0L164.0 300.0L164.0 119.0C164.0 117.89543 164.89543 117.0 166.0 117.0L193.0 117.0C194.10457 117.0 195.0 117.89543 195.0 119.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M346.0 300.0L315.0 300.0L315.0 119.0C315.0 117.89543 315.89542 117.0 317.0 117.0L344.0 117.0C345.10458 117.0 346.0 117.89543 346.0 119.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M346.0 300.0L315.0 300.0L315.0 119.0C315.0 117.89543 315.89542 117.0 317.0 117.0L344.0 117.0C345.10458 117.0 346.0 117.89543 346.0 119.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M496.0 300.0L465.0 300.0L465.0 121.0C465.0 119.89543 465.89542 119.0 467.0 119.0L494.0 119.0C495.10458 119.0 496.0 119.89543 496.0 121.0Z" fill-rule="nonzero"/><path fill="#ea4335" clip-path="url(#id_0)" d="M496.0 300.0L465.0 300.0L465.0 121.0C465.0 119.89543 465.89542 119.0 467.0 119.0L494.0 119.0C495.10458 119.0 496.0 119.89543 496.0 121.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M228.0 300.0L197.0 300.0L197.0 111.0C197.0 109.89543 197.89543 109.0 199.0 109.0L226.0 109.0C227.10457 109.0 228.0 109.89543 228.0 111.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M228.0 300.0L197.0 300.0L197.0 111.0C197.0 109.89543 197.89543 109.0 199.0 109.0L226.0 109.0C227.10457 109.0 228.0 109.89543 228.0 111.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M379.0 300.0L348.0 300.0L348.0 113.0C348.0 111.89543 348.89542 111.0 350.0 111.0L377.0 111.0C378.10458 111.0 379.0 111.89543 379.0 113.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M379.0 300.0L348.0 300.0L348.0 113.0C348.0 111.89543 348.89542 111.0 350.0 111.0L377.0 111.0C378.10458 111.0 379.0 111.89543 379.0 113.0Z" fill-rule="nonzero"/><path stroke="#000000" stroke-width="2.0" stroke-linecap="butt" stroke-opacity="0.0" clip-path="url(#id_0)" d="M529.0 300.0L498.0 300.0L498.0 111.0C498.0 109.89543 498.89542 109.0 500.0 109.0L527.0 109.0C528.10455 109.0 529.0 109.89543 529.0 111.0Z" fill-rule="nonzero"/><path fill="#fbbc04" clip-path="url(#id_0)" d="M529.0 300.0L498.0 300.0L498.0 111.0C498.0 109.89543 498.89542 109.0 500.0 109.0L527.0 109.0C528.10455 109.0 529.0 109.89543 529.0 111.0Z" fill-rule="nonzero"/><path fill="#000000" d="M303.875 349.45L303.875 340.85626L307.10938 340.85626Q308.09375 340.85626 308.6875 341.1219Q309.28125 341.3875 309.60938 341.9344Q309.95312 342.46564 309.95312 343.0594Q309.95312 343.60626 309.65625 344.09064Q309.35938 344.575 308.75 344.8719Q309.53125 345.10626 309.9375 345.66876Q310.35938 346.21564 310.35938 346.96564Q310.35938 347.5594 310.10938 348.09064Q309.85938 348.60626 309.48438 348.8875Q309.10938 349.16876 308.53125 349.3094Q307.96875 349.45 307.15625 349.45L303.875 349.45ZM305.01562 344.46564L306.875 344.46564Q307.625 344.46564 307.95312 344.3719Q308.39062 344.2469 308.60938 343.95Q308.82812 343.6375 308.82812 343.1844Q308.82812 342.7625 308.625 342.4344Q308.42188 342.10626 308.03125 341.9969Q307.65625 341.8719 306.73438 341.8719L305.01562 341.8719L305.01562 344.46564ZM305.01562 348.4344L307.15625 348.4344Q307.70312 348.4344 307.92188 348.3875Q308.32812 348.325 308.57812 348.16876Q308.84375 347.9969 309.01562 347.6844Q309.1875 347.3719 309.1875 346.96564Q309.1875 346.48126 308.9375 346.1219Q308.70312 345.7625 308.26562 345.6219Q307.82812 345.48126 307.0 345.48126L305.01562 345.48126L305.01562 348.4344ZM311.76562 349.45L311.76562 340.85626L312.82812 340.85626L312.82812 349.45L311.76562 349.45ZM314.40625 346.34064Q314.40625 344.60626 315.35938 343.77814Q316.15625 343.09064 317.3125 343.09064Q318.59375 343.09064 319.40625 343.9344Q320.23438 344.7625 320.23438 346.2469Q320.23438 347.45 319.875 348.1375Q319.51562 348.825 318.8125 349.21564Q318.125 349.59064 317.3125 349.59064Q316.01562 349.59064 315.20312 348.7625Q314.40625 347.91876 314.40625 346.34064ZM315.48438 346.34064Q315.48438 347.52814 316.0 348.1219Q316.53125 348.71564 317.3125 348.71564Q318.10938 348.71564 318.625 348.1219Q319.14062 347.52814 319.14062 346.3094Q319.14062 345.15314 318.60938 344.5594Q318.09375 343.96564 317.3125 343.96564Q316.53125 343.96564 316.0 344.5594Q315.48438 345.1375 315.48438 346.34064ZM325.85938 347.16876L326.89062 347.3094Q326.71875 348.3719 326.01562 348.98126Q325.3125 349.59064 324.29688 349.59064Q323.01562 349.59064 322.23438 348.7625Q321.46875 347.91876 321.46875 346.35626Q321.46875 345.35626 321.79688 344.60626Q322.14062 343.84064 322.8125 343.46564Q323.5 343.09064 324.3125 343.09064Q325.3125 343.09064 325.95312 343.60626Q326.60938 344.10626 326.79688 345.0594L325.76562 345.21564Q325.625 344.59064 325.25 344.27814Q324.875 343.95 324.34375 343.95Q323.54688 343.95 323.04688 344.52814Q322.54688 345.09064 322.54688 346.325Q322.54688 347.59064 323.03125 348.15314Q323.51562 348.71564 324.28125 348.71564Q324.90625 348.71564 325.3125 348.34064Q325.73438 347.96564 325.85938 347.16876ZM327.79688 349.45L327.79688 340.85626L328.85938 340.85626L328.85938 345.7625L331.34375 343.23126L332.71875 343.23126L330.32812 345.52814L332.95312 349.45L331.65625 349.45L329.59375 346.2625L328.85938 346.98126L328.85938 349.45L327.79688 349.45ZM333.54688 346.6844L334.60938 346.59064Q334.6875 347.2469 334.96875 347.65314Q335.25 348.0594 335.82812 348.325Q336.42188 348.575 337.15625 348.575Q337.79688 348.575 338.29688 348.3875Q338.79688 348.1844 339.03125 347.85626Q339.28125 347.5125 339.28125 347.1219Q339.28125 346.71564 339.04688 346.41876Q338.8125 346.10626 338.28125 345.90314Q337.92188 345.7625 336.73438 345.48126Q335.5625 345.2 335.09375 344.95Q334.46875 344.6219 334.17188 344.15314Q333.875 343.66876 333.875 343.075Q333.875 342.4344 334.23438 341.8719Q334.60938 341.29376 335.3125 341.0125Q336.03125 340.71564 336.89062 340.71564Q337.84375 340.71564 338.57812 341.02814Q339.3125 341.325 339.70312 341.9344Q340.09375 342.52814 340.125 343.27814L339.03125 343.35626Q338.9375 342.54376 338.42188 342.1375Q337.92188 341.71564 336.9375 341.71564Q335.90625 341.71564 335.4375 342.09064Q334.96875 342.46564 334.96875 342.9969Q334.96875 343.46564 335.29688 343.7625Q335.625 344.0594 337.0 344.3719Q338.39062 344.6844 338.90625 344.91876Q339.65625 345.27814 340.01562 345.8094Q340.375 346.325 340.375 347.02814Q340.375 347.71564 339.98438 348.325Q339.59375 348.91876 338.85938 349.2625Q338.125 349.59064 337.20312 349.59064Q336.03125 349.59064 335.23438 349.2625Q334.45312 348.91876 334.0 348.23126Q333.5625 347.54376 333.54688 346.6844ZM341.79688 342.075L341.79688 340.85626L342.85938 340.85626L342.85938 342.075L341.79688 342.075ZM341.79688 349.45L341.79688 343.23126L342.85938 343.23126L342.85938 349.45L341.79688 349.45ZM344.23438 349.45L344.23438 348.59064L348.20312 344.04376Q347.51562 344.075 347.0 344.075L344.46875 344.075L344.46875 343.23126L349.5625 343.23126L349.5625 343.91876L346.1875 347.8719L345.53125 348.59064Q346.25 348.54376 346.85938 348.54376L349.75 348.54376L349.75 349.45L344.23438 349.45ZM354.04688 347.45L355.14062 347.575Q354.89062 348.52814 354.1875 349.0594Q353.48438 349.59064 352.40625 349.59064Q351.04688 349.59064 350.23438 348.7469Q349.4375 347.90314 349.4375 346.3875Q349.4375 344.825 350.25 343.96564Q351.0625 343.09064 352.34375 343.09064Q353.59375 343.09064 354.375 343.9344Q355.17188 344.77814 355.17188 346.325Q355.17188 346.41876 355.17188 346.60626L350.53125 346.60626Q350.59375 347.6375 351.10938 348.1844Q351.625 348.71564 352.40625 348.71564Q352.98438 348.71564 353.39062 348.41876Q353.8125 348.10626 354.04688 347.45ZM350.59375 345.7469L354.0625 345.7469Q354.0 344.95 353.67188 344.5594Q353.15625 343.95 352.35938 343.95Q351.625 343.95 351.125 344.4344Q350.64062 344.91876 350.59375 345.7469Z" fill-rule="nonzero"/><path fill="#000000" d="M29.550013 211.3823L20.956263 211.3823L20.956263 205.58542L21.971888 205.58542L21.971888 210.24167L24.628138 210.24167L24.628138 206.21042L25.643763 206.21042L25.643763 210.24167L29.550013 210.24167L29.550013 211.3823ZM29.550013 204.4448L20.956263 204.4448L20.956263 201.1948Q20.956263 200.35104 21.034388 199.89792Q21.143763 199.2573 21.440638 198.83542Q21.737513 198.39792 22.268763 198.14792Q22.800013 197.8823 23.440638 197.8823Q24.534388 197.8823 25.300013 198.58542Q26.050013 199.27292 26.050013 201.10104L26.050013 203.30417L29.550013 203.30417L29.550013 204.4448ZM25.050013 203.30417L25.050013 201.08542Q25.050013 199.97604 24.643763 199.52292Q24.221888 199.05417 23.471888 199.05417Q22.940638 199.05417 22.565638 199.33542Q22.175013 199.60104 22.050013 200.03854Q21.971888 200.33542 21.971888 201.10104L21.971888 203.30417L25.050013 203.30417ZM26.784388 196.8198L26.690638 195.7573Q27.346888 195.67917 27.753138 195.39792Q28.159388 195.11667 28.425013 194.53854Q28.675013 193.9448 28.675013 193.21042Q28.675013 192.5698 28.487513 192.0698Q28.284388 191.5698 27.956263 191.33542Q27.612513 191.08542 27.221888 191.08542Q26.815638 191.08542 26.518763 191.3198Q26.206263 191.55417 26.003138 192.08542Q25.862513 192.4448 25.581263 193.6323Q25.300013 194.80417 25.050013 195.27292Q24.721888 195.89792 24.253138 196.1948Q23.768763 196.49167 23.175013 196.49167Q22.534388 196.49167 21.971888 196.1323Q21.393763 195.7573 21.112513 195.05417Q20.815638 194.33542 20.815638 193.47604Q20.815638 192.52292 21.128138 191.78854Q21.425013 191.05417 22.034388 190.66354Q22.628138 190.27292 23.378138 190.24167L23.456263 191.33542Q22.643763 191.42917 22.237513 191.9448Q21.815638 192.4448 21.815638 193.42917Q21.815638 194.46042 22.190638 194.92917Q22.565638 195.39792 23.096888 195.39792Q23.565638 195.39792 23.862513 195.0698Q24.159388 194.74167 24.471888 193.36667Q24.784388 191.97604 25.018763 191.46042Q25.378138 190.71042 25.909388 190.35104Q26.425013 189.99167 27.128138 189.99167Q27.815638 189.99167 28.425013 190.3823Q29.018763 190.77292 29.362513 191.5073Q29.690638 192.24167 29.690638 193.16354Q29.690638 194.33542 29.362513 195.1323Q29.018763 195.91354 28.331263 196.36667Q27.643763 196.80417 26.784388 196.8198Z" fill-rule="nonzero"/><path fill="#000000" d="M65.05 300.21564Q65.05 298.6844 65.3625 297.7625Q65.675 296.825 66.28438 296.325Q66.90938 295.825 67.84688 295.825Q68.53438 295.825 69.05 296.10626Q69.58125 296.3875 69.925 296.91876Q70.26875 297.4344 70.45625 298.1844Q70.64375 298.9344 70.64375 300.21564Q70.64375 301.73126 70.33125 302.65314Q70.03438 303.575 69.40938 304.09064Q68.8 304.59064 67.84688 304.59064Q66.6125 304.59064 65.89375 303.7Q65.05 302.6375 65.05 300.21564ZM66.12813 300.21564Q66.12813 302.325 66.62813 303.02814Q67.12813 303.73126 67.84688 303.73126Q68.58125 303.73126 69.06563 303.02814Q69.56563 302.325 69.56563 300.21564Q69.56563 298.09064 69.06563 297.40314Q68.58125 296.7 67.83125 296.7Q67.1125 296.7 66.675 297.3094Q66.12813 298.09064 66.12813 300.21564Z" fill-rule="nonzero"/><path fill="#000000" d="M55.01875 251.40834L53.971874 251.40834L53.971874 244.68959Q53.58125 245.04897 52.95625 245.42397Q52.346874 245.78334 51.8625 245.95522L51.8625 244.93959Q52.7375 244.51772 53.39375 243.93959Q54.065624 243.34584 54.346874 242.78334L55.01875 242.78334L55.01875 251.40834ZM58.05 247.17397Q58.05 245.64272 58.3625 244.72084Q58.675 243.78334 59.284374 243.28334Q59.909374 242.78334 60.846874 242.78334Q61.534374 242.78334 62.05 243.06459Q62.58125 243.34584 62.925 243.87709Q63.26875 244.39272 63.45625 245.14272Q63.64375 245.89272 63.64375 247.17397Q63.64375 248.68959 63.33125 249.61147Q63.034374 250.53334 62.409374 251.04897Q61.8 251.54897 60.846874 251.54897Q59.6125 251.54897 58.89375 250.65834Q58.05 249.59584 58.05 247.17397ZM59.128124 247.17397Q59.128124 249.28334 59.628124 249.98647Q60.128124 250.68959 60.846874 250.68959Q61.58125 250.68959 62.065624 249.98647Q62.565624 249.28334 62.565624 247.17397Q62.565624 245.04897 62.065624 244.36147Q61.58125 243.65834 60.83125 243.65834Q60.1125 243.65834 59.675 244.26772Q59.128124 245.04897 59.128124 247.17397ZM65.05 247.17397Q65.05 245.64272 65.3625 244.72084Q65.675 243.78334 66.28438 243.28334Q66.90938 242.78334 67.84688 242.78334Q68.53438 242.78334 69.05 243.06459Q69.58125 243.34584 69.925 243.87709Q70.26875 244.39272 70.45625 245.14272Q70.64375 245.89272 70.64375 247.17397Q70.64375 248.68959 70.33125 249.61147Q70.03438 250.53334 69.40938 251.04897Q68.8 251.54897 67.84688 251.54897Q66.6125 251.54897 65.89375 250.65834Q65.05 249.59584 65.05 247.17397ZM66.12813 247.17397Q66.12813 249.28334 66.62813 249.98647Q67.12813 250.68959 67.84688 250.68959Q68.58125 250.68959 69.06563 249.98647Q69.56563 249.28334 69.56563 247.17397Q69.56563 245.04897 69.06563 244.36147Q68.58125 243.65834 67.83125 243.65834Q67.1125 243.65834 66.675 244.26772Q66.12813 245.04897 66.12813 247.17397Z" fill-rule="nonzero"/><path fill="#000000" d="M56.596874 197.35104L56.596874 198.36667L50.909374 198.36667Q50.909374 197.99167 51.034374 197.6323Q51.253124 197.05417 51.721874 196.49167Q52.20625 195.92917 53.1125 195.1948Q54.51875 194.03854 55.003124 193.36667Q55.503124 192.6948 55.503124 192.10104Q55.503124 191.47604 55.05 191.05417Q54.596874 190.61667 53.878124 190.61667Q53.1125 190.61667 52.659374 191.0698Q52.20625 191.52292 52.190624 192.33542L51.1125 192.22604Q51.221874 191.0073 51.940624 190.3823Q52.675 189.74167 53.909374 189.74167Q55.14375 189.74167 55.8625 190.42917Q56.58125 191.11667 56.58125 192.1323Q56.58125 192.64792 56.3625 193.14792Q56.159374 193.6323 55.659374 194.1948Q55.175 194.74167 54.05 195.6948Q53.096874 196.49167 52.815624 196.78854Q52.55 197.0698 52.378124 197.35104L56.596874 197.35104ZM58.05 194.1323Q58.05 192.60104 58.3625 191.67917Q58.675 190.74167 59.284374 190.24167Q59.909374 189.74167 60.846874 189.74167Q61.534374 189.74167 62.05 190.02292Q62.58125 190.30417 62.925 190.83542Q63.26875 191.35104 63.45625 192.10104Q63.64375 192.85104 63.64375 194.1323Q63.64375 195.64792 63.33125 196.5698Q63.034374 197.49167 62.409374 198.0073Q61.8 198.5073 60.846874 198.5073Q59.6125 198.5073 58.89375 197.61667Q58.05 196.55417 58.05 194.1323ZM59.128124 194.1323Q59.128124 196.24167 59.628124 196.9448Q60.128124 197.64792 60.846874 197.64792Q61.58125 197.64792 62.065624 196.9448Q62.565624 196.24167 62.565624 194.1323Q62.565624 192.0073 62.065624 191.3198Q61.58125 190.61667 60.83125 190.61667Q60.1125 190.61667 59.675 191.22604Q59.128124 192.0073 59.128124 194.1323ZM65.05 194.1323Q65.05 192.60104 65.3625 191.67917Q65.675 190.74167 66.28438 190.24167Q66.90938 189.74167 67.84688 189.74167Q68.53438 189.74167 69.05 190.02292Q69.58125 190.30417 69.925 190.83542Q70.26875 191.35104 70.45625 192.10104Q70.64375 192.85104 70.64375 194.1323Q70.64375 195.64792 70.33125 196.5698Q70.03438 197.49167 69.40938 198.0073Q68.8 198.5073 67.84688 198.5073Q66.6125 198.5073 65.89375 197.61667Q65.05 196.55417 65.05 194.1323ZM66.12813 194.1323Q66.12813 196.24167 66.62813 196.9448Q67.12813 197.64792 67.84688 197.64792Q68.58125 197.64792 69.06563 196.9448Q69.56563 196.24167 69.56563 194.1323Q69.56563 192.0073 69.06563 191.3198Q68.58125 190.61667 67.83125 190.61667Q67.1125 190.61667 66.675 191.22604Q66.12813 192.0073 66.12813 194.1323Z" fill-rule="nonzero"/><path fill="#000000" d="M51.05 143.05937L52.1125 142.91875Q52.284374 143.80937 52.721874 144.21562Q53.159374 144.60625 53.784374 144.60625Q54.534374 144.60625 55.05 144.09062Q55.565624 143.575 55.565624 142.80937Q55.565624 142.09062 55.08125 141.62187Q54.6125 141.1375 53.878124 141.1375Q53.58125 141.1375 53.128124 141.2625L53.253124 140.325Q53.3625 140.34062 53.425 140.34062Q54.096874 140.34062 54.628124 139.99687Q55.175 139.6375 55.175 138.90312Q55.175 138.325 54.784374 137.95Q54.39375 137.55937 53.76875 137.55937Q53.159374 137.55937 52.7375 137.95Q52.33125 138.34062 52.221874 139.10625L51.159374 138.91875Q51.346874 137.87187 52.034374 137.29375Q52.721874 136.7 53.7375 136.7Q54.440624 136.7 55.034374 137.0125Q55.628124 137.30937 55.940624 137.825Q56.253124 138.34062 56.253124 138.93437Q56.253124 139.48125 55.95625 139.95Q55.659374 140.40312 55.08125 140.66875Q55.83125 140.84062 56.253124 141.40312Q56.675 141.95 56.675 142.79375Q56.675 143.91875 55.846874 144.7Q55.034374 145.48125 53.784374 145.48125Q52.659374 145.48125 51.909374 144.80937Q51.159374 144.12187 51.05 143.05937ZM58.05 141.09062Q58.05 139.55937 58.3625 138.6375Q58.675 137.7 59.284374 137.2Q59.909374 136.7 60.846874 136.7Q61.534374 136.7 62.05 136.98125Q62.58125 137.2625 62.925 137.79375Q63.26875 138.30937 63.45625 139.05937Q63.64375 139.80937 63.64375 141.09062Q63.64375 142.60625 63.33125 143.52812Q63.034374 144.45 62.409374 144.96562Q61.8 145.46562 60.846874 145.46562Q59.6125 145.46562 58.89375 144.575Q58.05 143.5125 58.05 141.09062ZM59.128124 141.09062Q59.128124 143.2 59.628124 143.90312Q60.128124 144.60625 60.846874 144.60625Q61.58125 144.60625 62.065624 143.90312Q62.565624 143.2 62.565624 141.09062Q62.565624 138.96562 62.065624 138.27812Q61.58125 137.575 60.83125 137.575Q60.1125 137.575 59.675 138.18437Q59.128124 138.96562 59.128124 141.09062ZM65.05 141.09062Q65.05 139.55937 65.3625 138.6375Q65.675 137.7 66.28438 137.2Q66.90938 136.7 67.84688 136.7Q68.53438 136.7 69.05 136.98125Q69.58125 137.2625 69.925 137.79375Q70.26875 138.30937 70.45625 139.05937Q70.64375 139.80937 70.64375 141.09062Q70.64375 142.60625 70.33125 143.52812Q70.03438 144.45 69.40938 144.96562Q68.8 145.46562 67.84688 145.46562Q66.6125 145.46562 65.89375 144.575Q65.05 143.5125 65.05 141.09062ZM66.12813 141.09062Q66.12813 143.2 66.62813 143.90312Q67.12813 144.60625 67.84688 144.60625Q68.58125 144.60625 69.06563 143.90312Q69.56563 143.2 69.56563 141.09062Q69.56563 138.96562 69.06563 138.27812Q68.58125 137.575 67.83125 137.575Q67.1125 137.575 66.675 138.18437Q66.12813 138.96562 66.12813 141.09062Z" fill-rule="nonzero"/><path fill="#000000" d="M54.425 92.28333L54.425 90.22083L50.70625 90.22083L50.70625 89.25208L54.628124 83.68958L55.4875 83.68958L55.4875 89.25208L56.64375 89.25208L56.64375 90.22083L55.4875 90.22083L55.4875 92.28333L54.425 92.28333ZM54.425 89.25208L54.425 85.39271L51.7375 89.25208L54.425 89.25208ZM58.05 88.04896Q58.05 86.51771 58.3625 85.59583Q58.675 84.65833 59.284374 84.15833Q59.909374 83.65833 60.846874 83.65833Q61.534374 83.65833 62.05 83.93958Q62.58125 84.22083 62.925 84.75208Q63.26875 85.26771 63.45625 86.01771Q63.64375 86.76771 63.64375 88.04896Q63.64375 89.56458 63.33125 90.48646Q63.034374 91.40833 62.409374 91.92396Q61.8 92.42396 60.846874 92.42396Q59.6125 92.42396 58.89375 91.53333Q58.05 90.47083 58.05 88.04896ZM59.128124 88.04896Q59.128124 90.15833 59.628124 90.86146Q60.128124 91.56458 60.846874 91.56458Q61.58125 91.56458 62.065624 90.86146Q62.565624 90.15833 62.565624 88.04896Q62.565624 85.92396 62.065624 85.23646Q61.58125 84.53333 60.83125 84.53333Q60.1125 84.53333 59.675 85.14271Q59.128124 85.92396 59.128124 88.04896ZM65.05 88.04896Q65.05 86.51771 65.3625 85.59583Q65.675 84.65833 66.28438 84.15833Q66.90938 83.65833 67.84688 83.65833Q68.53438 83.65833 69.05 83.93958Q69.58125 84.22083 69.925 84.75208Q70.26875 85.26771 70.45625 86.01771Q70.64375 86.76771 70.64375 88.04896Q70.64375 89.56458 70.33125 90.48646Q70.03438 91.40833 69.40938 91.92396Q68.8 92.42396 67.84688 92.42396Q66.6125 92.42396 65.89375 91.53333Q65.05 90.47083 65.05 88.04896ZM66.12813 88.04896Q66.12813 90.15833 66.62813 90.86146Q67.12813 91.56458 67.84688 91.56458Q68.58125 91.56458 69.06563 90.86146Q69.56563 90.15833 69.56563 88.04896Q69.56563 85.92396 69.06563 85.23646Q68.58125 84.53333 67.83125 84.53333Q67.1125 84.53333 66.675 85.14271Q66.12813 85.92396 66.12813 88.04896Z" fill-rule="nonzero"/><path fill="#000000" d="M173.05084 317.45L172.00397 317.45L172.00397 310.73126Q171.61334 311.09064 170.98834 311.46564Q170.37897 311.825 169.89459 311.9969L169.89459 310.98126Q170.76959 310.5594 171.42584 309.98126Q172.09772 309.3875 172.37897 308.825L173.05084 308.825L173.05084 317.45ZM181.62897 316.4344L181.62897 317.45L175.94147 317.45Q175.94147 317.075 176.06647 316.71564Q176.28522 316.1375 176.75397 315.575Q177.23834 315.0125 178.14459 314.27814Q179.55084 313.1219 180.03522 312.45Q180.53522 311.77814 180.53522 311.1844Q180.53522 310.5594 180.08209 310.1375Q179.62897 309.7 178.91022 309.7Q178.14459 309.7 177.69147 310.15314Q177.23834 310.60626 177.22272 311.41876L176.14459 311.3094Q176.25397 310.09064 176.97272 309.46564Q177.70709 308.825 178.94147 308.825Q180.17584 308.825 180.89459 309.5125Q181.61334 310.2 181.61334 311.21564Q181.61334 311.73126 181.39459 312.23126Q181.19147 312.71564 180.69147 313.27814Q180.20709 313.825 179.08209 314.77814Q178.12897 315.575 177.84772 315.8719Q177.58209 316.15314 177.41022 316.4344L181.62897 316.4344ZM184.70709 312.79376Q184.05084 312.54376 183.72272 312.10626Q183.41022 311.65314 183.41022 311.04376Q183.41022 310.10626 184.08209 309.46564Q184.76959 308.825 185.87897 308.825Q187.00397 308.825 187.69147 309.48126Q188.37897 310.1375 188.37897 311.075Q188.37897 311.66876 188.06647 312.10626Q187.75397 312.54376 187.11334 312.79376Q187.91022 313.04376 188.31647 313.6219Q188.72272 314.2 188.72272 314.9969Q188.72272 316.09064 187.94147 316.84064Q187.17584 317.59064 185.89459 317.59064Q184.62897 317.59064 183.84772 316.84064Q183.06647 316.09064 183.06647 314.96564Q183.06647 314.1219 183.48834 313.5594Q183.92584 312.9969 184.70709 312.79376ZM184.48834 310.9969Q184.48834 311.60626 184.87897 311.9969Q185.28522 312.3875 185.91022 312.3875Q186.51959 312.3875 186.91022 312.0125Q187.30084 311.6219 187.30084 311.0594Q187.30084 310.48126 186.89459 310.09064Q186.48834 309.6844 185.89459 309.6844Q185.28522 309.6844 184.87897 310.075Q184.48834 310.46564 184.48834 310.9969ZM184.16022 314.96564Q184.16022 315.41876 184.36334 315.84064Q184.58209 316.2625 185.00397 316.4969Q185.42584 316.73126 185.91022 316.73126Q186.66022 316.73126 187.14459 316.2469Q187.64459 315.7625 187.64459 315.0125Q187.64459 314.2469 187.14459 313.7469Q186.64459 313.2469 185.87897 313.2469Q185.12897 313.2469 184.64459 313.7469Q184.16022 314.23126 184.16022 314.96564Z" fill-rule="nonzero"/><path fill="#000000" d="M325.04688 316.4344L325.04688 317.45L319.35938 317.45Q319.35938 317.075 319.48438 316.71564Q319.70312 316.1375 320.17188 315.575Q320.65625 315.0125 321.5625 314.27814Q322.96875 313.1219 323.45312 312.45Q323.95312 311.77814 323.95312 311.1844Q323.95312 310.5594 323.5 310.1375Q323.04688 309.7 322.32812 309.7Q321.5625 309.7 321.10938 310.15314Q320.65625 310.60626 320.64062 311.41876L319.5625 311.3094Q319.67188 310.09064 320.39062 309.46564Q321.125 308.825 322.35938 308.825Q323.59375 308.825 324.3125 309.5125Q325.03125 310.2 325.03125 311.21564Q325.03125 311.73126 324.8125 312.23126Q324.60938 312.71564 324.10938 313.27814Q323.625 313.825 322.5 314.77814Q321.54688 315.575 321.26562 315.8719Q321.0 316.15314 320.82812 316.4344L325.04688 316.4344ZM326.5 315.2L327.60938 315.10626Q327.73438 315.91876 328.17188 316.325Q328.625 316.73126 329.26562 316.73126Q330.01562 316.73126 330.54688 316.15314Q331.07812 315.575 331.07812 314.6375Q331.07812 313.73126 330.5625 313.21564Q330.0625 312.6844 329.23438 312.6844Q328.73438 312.6844 328.3125 312.91876Q327.90625 313.15314 327.67188 313.5125L326.6875 313.3875L327.51562 308.98126L331.79688 308.98126L331.79688 309.98126L328.35938 309.98126L327.90625 312.29376Q328.67188 311.7469 329.51562 311.7469Q330.64062 311.7469 331.40625 312.52814Q332.1875 313.3094 332.1875 314.54376Q332.1875 315.7 331.51562 316.5594Q330.6875 317.59064 329.26562 317.59064Q328.09375 317.59064 327.34375 316.9344Q326.60938 316.27814 326.5 315.2ZM338.96875 310.96564L337.92188 311.04376Q337.78125 310.41876 337.53125 310.1375Q337.09375 309.6844 336.46875 309.6844Q335.96875 309.6844 335.57812 309.96564Q335.09375 310.34064 334.79688 311.04376Q334.51562 311.73126 334.5 313.0125Q334.875 312.4344 335.42188 312.15314Q335.98438 311.8719 336.59375 311.8719Q337.64062 311.8719 338.375 312.65314Q339.125 313.4344 339.125 314.65314Q339.125 315.46564 338.76562 316.16876Q338.42188 316.85626 337.8125 317.23126Q337.20312 317.59064 336.4375 317.59064Q335.10938 317.59064 334.28125 316.6219Q333.45312 315.65314 333.45312 313.4344Q333.45312 310.9344 334.375 309.8094Q335.17188 308.825 336.53125 308.825Q337.54688 308.825 338.1875 309.40314Q338.84375 309.96564 338.96875 310.96564ZM334.67188 314.66876Q334.67188 315.21564 334.89062 315.71564Q335.125 316.2 335.53125 316.46564Q335.95312 316.73126 336.42188 316.73126Q337.07812 316.73126 337.5625 316.2Q338.04688 315.65314 338.04688 314.73126Q338.04688 313.84064 337.5625 313.325Q337.09375 312.8094 336.375 312.8094Q335.65625 312.8094 335.15625 313.325Q334.67188 313.84064 334.67188 314.66876Z" fill-rule="nonzero"/><path fill="#000000" d="M469.9179 315.2L471.02728 315.10626Q471.15228 315.91876 471.58978 316.325Q472.0429 316.73126 472.68353 316.73126Q473.43353 316.73126 473.96478 316.15314Q474.49603 315.575 474.49603 314.6375Q474.49603 313.73126 473.9804 313.21564Q473.4804 312.6844 472.65228 312.6844Q472.15228 312.6844 471.7304 312.91876Q471.32416 313.15314 471.08978 313.5125L470.1054 313.3875L470.93353 308.98126L475.21478 308.98126L475.21478 309.98126L471.77728 309.98126L471.32416 312.29376Q472.08978 311.7469 472.93353 311.7469Q474.05853 311.7469 474.82416 312.52814Q475.6054 313.3094 475.6054 314.54376Q475.6054 315.7 474.93353 316.5594Q474.1054 317.59064 472.68353 317.59064Q471.51166 317.59064 470.76166 316.9344Q470.02728 316.27814 469.9179 315.2ZM480.88666 317.45L479.83978 317.45L479.83978 310.73126Q479.44916 311.09064 478.82416 311.46564Q478.21478 311.825 477.7304 311.9969L477.7304 310.98126Q478.6054 310.5594 479.26166 309.98126Q479.93353 309.3875 480.21478 308.825L480.88666 308.825L480.88666 317.45ZM489.46478 316.4344L489.46478 317.45L483.77728 317.45Q483.77728 317.075 483.90228 316.71564Q484.12103 316.1375 484.58978 315.575Q485.07416 315.0125 485.9804 314.27814Q487.38666 313.1219 487.87103 312.45Q488.37103 311.77814 488.37103 311.1844Q488.37103 310.5594 487.9179 310.1375Q487.46478 309.7 486.74603 309.7Q485.9804 309.7 485.52728 310.15314Q485.07416 310.60626 485.05853 311.41876L483.9804 311.3094Q484.08978 310.09064 484.80853 309.46564Q485.5429 308.825 486.77728 308.825Q488.01166 308.825 488.7304 309.5125Q489.44916 310.2 489.44916 311.21564Q489.44916 311.73126 489.2304 312.23126Q489.02728 312.71564 488.52728 313.27814Q488.0429 313.825 486.9179 314.77814Q485.96478 315.575 485.68353 315.8719Q485.4179 316.15314 485.24603 316.4344L489.46478 316.4344Z" fill-rule="nonzero"/><path fill="#4285f4" d="M191.0 56.916668C191.0 56.364384 191.44771 55.916668 192.0 55.916668L202.0 55.916668C202.55229 55.916668 203.0 56.364384 203.0 56.916668L203.0 66.916664C203.0 67.46895 202.55229 67.916664 202.0 67.916664L192.0 67.916664C191.44771 67.916664 191.0 67.46895 191.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M211.92188 65.916664L211.92188 57.322914L213.07812 57.322914L217.59375 64.072914L217.59375 57.322914L218.6875 57.322914L218.6875 65.916664L217.51562 65.916664L213.0 59.166664L213.0 65.916664L211.92188 65.916664ZM224.85938 65.15104Q224.26562 65.65104 223.71875 65.854164Q223.1875 66.05729 222.5625 66.05729Q221.53125 66.05729 220.98438 65.55729Q220.4375 65.05729 220.4375 64.27604Q220.4375 63.822914 220.64062 63.447914Q220.84375 63.05729 221.1875 62.83854Q221.53125 62.604164 221.95312 62.49479Q222.25 62.40104 222.89062 62.322914Q224.15625 62.18229 224.76562 61.96354Q224.76562 61.74479 224.76562 61.697914Q224.76562 61.041664 224.46875 60.77604Q224.0625 60.43229 223.26562 60.43229Q222.53125 60.43229 222.17188 60.697914Q221.8125 60.947914 221.64062 61.604164L220.60938 61.46354Q220.75 60.80729 221.07812 60.40104Q221.40625 59.99479 222.01562 59.77604Q222.625 59.55729 223.42188 59.55729Q224.21875 59.55729 224.71875 59.74479Q225.21875 59.93229 225.45312 60.21354Q225.6875 60.49479 225.78125 60.93229Q225.82812 61.197914 225.82812 61.90104L225.82812 63.30729Q225.82812 64.77604 225.89062 65.166664Q225.96875 65.55729 226.17188 65.916664L225.0625 65.916664Q224.90625 65.58854 224.85938 65.15104ZM224.76562 62.791664Q224.1875 63.02604 223.04688 63.197914Q222.39062 63.291664 222.125 63.416664Q221.85938 63.52604 221.70312 63.74479Q221.5625 63.96354 221.5625 64.24479Q221.5625 64.666664 221.875 64.947914Q222.20312 65.229164 222.8125 65.229164Q223.42188 65.229164 223.89062 64.96354Q224.375 64.697914 224.59375 64.229164Q224.76562 63.86979 224.76562 63.18229L224.76562 62.791664ZM227.79688 58.541664L227.79688 57.322914L228.85938 57.322914L228.85938 58.541664L227.79688 58.541664ZM227.79688 65.916664L227.79688 59.697914L228.85938 59.697914L228.85938 65.916664L227.79688 65.916664ZM232.51562 65.916664L230.15625 59.697914L231.26562 59.697914L232.60938 63.416664Q232.8125 64.02604 233.0 64.666664Q233.14062 64.18229 233.39062 63.49479L234.78125 59.697914L235.85938 59.697914L233.5 65.916664L232.51562 65.916664ZM240.04688 63.916664L241.14062 64.041664Q240.89062 64.99479 240.1875 65.52604Q239.48438 66.05729 238.40625 66.05729Q237.04688 66.05729 236.23438 65.21354Q235.4375 64.36979 235.4375 62.854164Q235.4375 61.291664 236.25 60.43229Q237.0625 59.55729 238.34375 59.55729Q239.59375 59.55729 240.375 60.40104Q241.17188 61.24479 241.17188 62.791664Q241.17188 62.885414 241.17188 63.072914L236.53125 63.072914Q236.59375 64.104164 237.10938 64.65104Q237.625 65.18229 238.40625 65.18229Q238.98438 65.18229 239.39062 64.885414Q239.8125 64.572914 240.04688 63.916664ZM236.59375 62.21354L240.0625 62.21354Q240.0 61.416664 239.67188 61.02604Q239.15625 60.416664 238.35938 60.416664Q237.625 60.416664 237.125 60.90104Q236.64062 61.385414 236.59375 62.21354Z" fill-rule="nonzero"/><path fill="#ea4335" d="M258.0 56.916668C258.0 56.364384 258.44772 55.916668 259.0 55.916668L269.0 55.916668C269.55228 55.916668 270.0 56.364384 270.0 56.916668L270.0 66.916664C270.0 67.46895 269.55228 67.916664 269.0 67.916664L259.0 67.916664C258.44772 67.916664 258.0 67.46895 258.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M284.5625 57.322914L285.70312 57.322914L285.70312 62.291664Q285.70312 63.58854 285.40625 64.354164Q285.10938 65.104164 284.34375 65.58854Q283.57812 66.05729 282.34375 66.05729Q281.14062 66.05729 280.35938 65.65104Q279.59375 65.229164 279.26562 64.447914Q278.9375 63.65104 278.9375 62.291664L278.9375 57.322914L280.07812 57.322914L280.07812 62.27604Q280.07812 63.40104 280.28125 63.93229Q280.5 64.46354 281.0 64.760414Q281.51562 65.041664 282.25 65.041664Q283.5 65.041664 284.03125 64.479164Q284.5625 63.90104 284.5625 62.27604L284.5625 57.322914ZM287.79688 65.916664L287.79688 59.697914L288.73438 59.697914L288.73438 60.572914Q289.42188 59.55729 290.71875 59.55729Q291.28125 59.55729 291.75 59.760414Q292.23438 59.96354 292.46875 60.291664Q292.70312 60.61979 292.79688 61.05729Q292.84375 61.354164 292.84375 62.08854L292.84375 65.916664L291.79688 65.916664L291.79688 62.135414Q291.79688 61.479164 291.67188 61.166664Q291.54688 60.854164 291.23438 60.666664Q290.92188 60.46354 290.5 60.46354Q289.82812 60.46354 289.32812 60.90104Q288.84375 61.322914 288.84375 62.510414L288.84375 65.916664L287.79688 65.916664ZM294.79688 58.541664L294.79688 57.322914L295.85938 57.322914L295.85938 58.541664L294.79688 58.541664ZM294.79688 65.916664L294.79688 59.697914L295.85938 59.697914L295.85938 65.916664L294.79688 65.916664ZM298.04688 65.916664L298.04688 60.510414L297.10938 60.510414L297.10938 59.697914L298.04688 59.697914L298.04688 59.02604Q298.04688 58.40104 298.15625 58.104164Q298.3125 57.68229 298.6875 57.43229Q299.07812 57.18229 299.76562 57.18229Q300.21875 57.18229 300.75 57.291664L300.59375 58.197914Q300.26562 58.15104 299.96875 58.15104Q299.48438 58.15104 299.28125 58.354164Q299.09375 58.55729 299.09375 59.11979L299.09375 59.697914L300.3125 59.697914L300.3125 60.510414L299.09375 60.510414L299.09375 65.916664L298.04688 65.916664ZM300.40625 62.80729Q300.40625 61.072914 301.35938 60.24479Q302.15625 59.55729 303.3125 59.55729Q304.59375 59.55729 305.40625 60.40104Q306.23438 61.229164 306.23438 62.71354Q306.23438 63.916664 305.875 64.604164Q305.51562 65.291664 304.8125 65.68229Q304.125 66.05729 303.3125 66.05729Q302.01562 66.05729 301.20312 65.229164Q300.40625 64.385414 300.40625 62.80729ZM301.48438 62.80729Q301.48438 63.99479 302.0 64.58854Q302.53125 65.18229 303.3125 65.18229Q304.10938 65.18229 304.625 64.58854Q305.14062 63.99479 305.14062 62.77604Q305.14062 61.61979 304.60938 61.02604Q304.09375 60.43229 303.3125 60.43229Q302.53125 60.43229 302.0 61.02604Q301.48438 61.604164 301.48438 62.80729ZM307.78125 65.916664L307.78125 59.697914L308.73438 59.697914L308.73438 60.635414Q309.09375 59.979164 309.39062 59.77604Q309.70312 59.55729 310.07812 59.55729Q310.60938 59.55729 311.15625 59.885414L310.79688 60.86979Q310.40625 60.635414 310.03125 60.635414Q309.67188 60.635414 309.39062 60.854164Q309.125 61.05729 309.01562 61.43229Q308.82812 61.99479 308.82812 62.65104L308.82812 65.916664L307.78125 65.916664ZM311.79688 65.916664L311.79688 59.697914L312.73438 59.697914L312.73438 60.572914Q313.03125 60.104164 313.51562 59.83854Q314.0 59.55729 314.625 59.55729Q315.3125 59.55729 315.75 59.83854Q316.20312 60.11979 316.375 60.635414Q317.125 59.55729 318.29688 59.55729Q319.23438 59.55729 319.71875 60.072914Q320.21875 60.572914 320.21875 61.65104L320.21875 65.916664L319.17188 65.916664L319.17188 61.99479Q319.17188 61.36979 319.0625 61.08854Q318.96875 60.80729 318.70312 60.635414Q318.4375 60.46354 318.0625 60.46354Q317.40625 60.46354 316.96875 60.90104Q316.54688 61.33854 316.54688 62.30729L316.54688 65.916664L315.48438 65.916664L315.48438 61.86979Q315.48438 61.166664 315.21875 60.822914Q314.96875 60.46354 314.39062 60.46354Q313.9375 60.46354 313.5625 60.697914Q313.1875 60.93229 313.01562 61.385414Q312.84375 61.83854 312.84375 62.68229L312.84375 65.916664L311.79688 65.916664Z" fill-rule="nonzero"/><path fill="#fbbc04" d="M338.0 56.916668C338.0 56.364384 338.44772 55.916668 339.0 55.916668L349.0 55.916668C349.55228 55.916668 350.0 56.364384 350.0 56.916668L350.0 66.916664C350.0 67.46895 349.55228 67.916664 349.0 67.916664L339.0 67.916664C338.44772 67.916664 338.0 67.46895 338.0 66.916664Z" fill-rule="nonzero"/><path fill="#1a1a1a" d="M365.0625 62.90104L366.1875 63.197914Q365.82812 64.58854 364.90625 65.322914Q363.98438 66.05729 362.64062 66.05729Q361.25 66.05729 360.375 65.49479Q359.5 64.93229 359.04688 63.86979Q358.59375 62.791664 358.59375 61.55729Q358.59375 60.21354 359.10938 59.21354Q359.625 58.21354 360.5625 57.697914Q361.51562 57.18229 362.65625 57.18229Q363.9375 57.18229 364.8125 57.83854Q365.70312 58.49479 366.04688 59.68229L364.92188 59.947914Q364.625 59.010414 364.04688 58.58854Q363.48438 58.15104 362.625 58.15104Q361.64062 58.15104 360.96875 58.635414Q360.3125 59.104164 360.03125 59.90104Q359.76562 60.697914 359.76562 61.55729Q359.76562 62.65104 360.07812 63.46354Q360.40625 64.27604 361.07812 64.68229Q361.75 65.08854 362.54688 65.08854Q363.5 65.08854 364.15625 64.541664Q364.82812 63.99479 365.0625 62.90104ZM367.40625 62.80729Q367.40625 61.072914 368.35938 60.24479Q369.15625 59.55729 370.3125 59.55729Q371.59375 59.55729 372.40625 60.40104Q373.23438 61.229164 373.23438 62.71354Q373.23438 63.916664 372.875 64.604164Q372.51562 65.291664 371.8125 65.68229Q371.125 66.05729 370.3125 66.05729Q369.01562 66.05729 368.20312 65.229164Q367.40625 64.385414 367.40625 62.80729ZM368.48438 62.80729Q368.48438 63.99479 369.0 64.58854Q369.53125 65.18229 370.3125 65.18229Q371.10938 65.18229 371.625 64.58854Q372.14062 63.99479 372.14062 62.77604Q372.14062 61.61979 371.60938 61.02604Q371.09375 60.43229 370.3125 60.43229Q369.53125 60.43229 369.0 61.02604Q368.48438 61.604164 368.48438 62.80729ZM374.79688 65.916664L374.79688 57.322914L375.84375 57.322914L375.84375 60.40104Q376.57812 59.55729 377.70312 59.55729Q378.40625 59.55729 378.90625 59.83854Q379.42188 60.104164 379.64062 60.58854Q379.85938 61.05729 379.85938 61.979164L379.85938 65.916664L378.8125 65.916664L378.8125 61.979164Q378.8125 61.18229 378.46875 60.822914Q378.125 60.46354 377.5 60.46354Q377.03125 60.46354 376.60938 60.71354Q376.20312 60.947914 376.01562 61.36979Q375.84375 61.77604 375.84375 62.510414L375.84375 65.916664L374.79688 65.916664ZM386.04688 63.916664L387.14062 64.041664Q386.89062 64.99479 386.1875 65.52604Q385.48438 66.05729 384.40625 66.05729Q383.04688 66.05729 382.23438 65.21354Q381.4375 64.36979 381.4375 62.854164Q381.4375 61.291664 382.25 60.43229Q383.0625 59.55729 384.34375 59.55729Q385.59375 59.55729 386.375 60.40104Q387.17188 61.24479 387.17188 62.791664Q387.17188 62.885414 387.17188 63.072914L382.53125 63.072914Q382.59375 64.104164 383.10938 64.65104Q383.625 65.18229 384.40625 65.18229Q384.98438 65.18229 385.39062 64.885414Q385.8125 64.572914 386.04688 63.916664ZM382.59375 62.21354L386.0625 62.21354Q386.0 61.416664 385.67188 61.02604Q385.15625 60.416664 384.35938 60.416664Q383.625 60.416664 383.125 60.90104Q382.64062 61.385414 382.59375 62.21354ZM388.78125 65.916664L388.78125 59.697914L389.73438 59.697914L389.73438 60.635414Q390.09375 59.979164 390.39062 59.77604Q390.70312 59.55729 391.07812 59.55729Q391.60938 59.55729 392.15625 59.885414L391.79688 60.86979Q391.40625 60.635414 391.03125 60.635414Q390.67188 60.635414 390.39062 60.854164Q390.125 61.05729 390.01562 61.43229Q389.82812 61.99479 389.82812 62.65104L389.82812 65.916664L388.78125 65.916664ZM397.04688 63.916664L398.14062 64.041664Q397.89062 64.99479 397.1875 65.52604Q396.48438 66.05729 395.40625 66.05729Q394.04688 66.05729 393.23438 65.21354Q392.4375 64.36979 392.4375 62.854164Q392.4375 61.291664 393.25 60.43229Q394.0625 59.55729 395.34375 59.55729Q396.59375 59.55729 397.375 60.40104Q398.17188 61.24479 398.17188 62.791664Q398.17188 62.885414 398.17188 63.072914L393.53125 63.072914Q393.59375 64.104164 394.10938 64.65104Q394.625 65.18229 395.40625 65.18229Q395.98438 65.18229 396.39062 64.885414Q396.8125 64.572914 397.04688 63.916664ZM393.59375 62.21354L397.0625 62.21354Q397.0 61.416664 396.67188 61.02604Q396.15625 60.416664 395.35938 60.416664Q394.625 60.416664 394.125 60.90104Q393.64062 61.385414 393.59375 62.21354ZM399.79688 65.916664L399.79688 59.697914L400.73438 59.697914L400.73438 60.572914Q401.42188 59.55729 402.71875 59.55729Q403.28125 59.55729 403.75 59.760414Q404.23438 59.96354 404.46875 60.291664Q404.70312 60.61979 404.79688 61.05729Q404.84375 61.354164 404.84375 62.08854L404.84375 65.916664L403.79688 65.916664L403.79688 62.135414Q403.79688 61.479164 403.67188 61.166664Q403.54688 60.854164 403.23438 60.666664Q402.92188 60.46354 402.5 60.46354Q401.82812 60.46354 401.32812 60.90104Q400.84375 61.322914 400.84375 62.510414L400.84375 65.916664L399.79688 65.916664ZM409.09375 64.979164L409.25 65.90104Q408.79688 65.99479 408.45312 65.99479Q407.875 65.99479 407.5625 65.822914Q407.25 65.635414 407.10938 65.33854Q406.98438 65.041664 406.98438 64.08854L406.98438 60.510414L406.21875 60.510414L406.21875 59.697914L406.98438 59.697914L406.98438 58.15104L408.03125 57.52604L408.03125 59.697914L409.09375 59.697914L409.09375 60.510414L408.03125 60.510414L408.03125 64.15104Q408.03125 64.604164 408.07812 64.729164Q408.14062 64.854164 408.26562 64.93229Q408.39062 65.010414 408.625 65.010414Q408.8125 65.010414 409.09375 64.979164Z" fill-rule="nonzero"/><path fill="#757575" d="M20.190624 37.55L20.190624 23.2375L29.846874 23.2375L29.846874 24.925L22.08125 24.925L22.08125 29.3625L28.8 29.3625L28.8 31.05L22.08125 31.05L22.08125 37.55L20.190624 37.55ZM32.096874 37.55L32.096874 23.2375L37.4875 23.2375Q38.925 23.2375 39.675 23.3625Q40.721874 23.55 41.440624 24.05Q42.159374 24.534374 42.58125 25.425Q43.01875 26.315624 43.01875 27.378124Q43.01875 29.20625 41.846874 30.471874Q40.690624 31.721874 37.659374 31.721874L33.9875 31.721874L33.9875 37.55L32.096874 37.55ZM33.9875 30.034374L37.690624 30.034374Q39.51875 30.034374 40.284374 29.3625Q41.065624 28.675 41.065624 27.425Q41.065624 26.534374 40.6125 25.89375Q40.159374 25.253124 39.425 25.05Q38.940624 24.925 37.64375 24.925L33.9875 24.925L33.9875 30.034374ZM44.45625 32.95625L46.2375 32.8Q46.3625 33.8625 46.815624 34.55Q47.284374 35.2375 48.253124 35.675Q49.2375 36.096874 50.471874 36.096874Q51.55 36.096874 52.378124 35.784374Q53.20625 35.45625 53.6125 34.89375Q54.01875 34.33125 54.01875 33.659374Q54.01875 32.9875 53.628124 32.4875Q53.2375 31.9875 52.346874 31.64375Q51.76875 31.409374 49.784374 30.940624Q47.815624 30.471874 47.034374 30.05Q46.003124 29.51875 45.503124 28.721874Q45.003124 27.925 45.003124 26.940624Q45.003124 25.846874 45.6125 24.909374Q46.221874 23.971874 47.409374 23.4875Q48.596874 22.9875 50.034374 22.9875Q51.628124 22.9875 52.846874 23.503124Q54.065624 24.01875 54.70625 25.01875Q55.3625 26.003124 55.409374 27.26875L53.596874 27.409374Q53.45625 26.05 52.6125 25.3625Q51.76875 24.659374 50.1125 24.659374Q48.39375 24.659374 47.596874 25.3Q46.815624 25.925 46.815624 26.8Q46.815624 27.58125 47.378124 28.08125Q47.925 28.58125 50.2375 29.096874Q52.55 29.6125 53.409374 30.003124Q54.659374 30.58125 55.253124 31.471874Q55.846874 32.346874 55.846874 33.503124Q55.846874 34.64375 55.190624 35.659374Q54.534374 36.675 53.3 37.2375Q52.08125 37.8 50.55 37.8Q48.6125 37.8 47.3 37.2375Q45.9875 36.659374 45.2375 35.51875Q44.4875 34.378124 44.45625 32.95625ZM66.75313 37.55L62.8 27.175L64.65938 27.175L66.89375 33.39375Q67.25313 34.39375 67.55 35.471874Q67.78438 34.659374 68.20625 33.503124L70.50313 27.175L72.31563 27.175L68.39375 37.55L66.75313 37.55ZM72.15938 34.45625L73.90938 34.175Q74.05 35.221874 74.72188 35.784374Q75.39375 36.33125 76.59688 36.33125Q77.8 36.33125 78.37813 35.846874Q78.97188 35.346874 78.97188 34.690624Q78.97188 34.096874 78.45625 33.753124Q78.09688 33.51875 76.65938 33.159374Q74.72188 32.659374 73.97188 32.315624Q73.2375 31.95625 72.84688 31.33125Q72.45625 30.690624 72.45625 29.925Q72.45625 29.2375 72.76875 28.64375Q73.09688 28.05 73.64375 27.659374Q74.05 27.3625 74.75313 27.159374Q75.47188 26.940624 76.28438 26.940624Q77.50313 26.940624 78.425 27.3Q79.34688 27.64375 79.78438 28.253124Q80.22188 28.846874 80.39375 29.846874L78.675 30.08125Q78.55 29.284374 77.9875 28.846874Q77.425 28.39375 76.40938 28.39375Q75.19063 28.39375 74.675 28.8Q74.15938 29.190624 74.15938 29.721874Q74.15938 30.065624 74.37813 30.346874Q74.58125 30.628124 75.05 30.815624Q75.31563 30.909374 76.59688 31.253124Q78.47188 31.753124 79.20625 32.08125Q79.94063 32.39375 80.3625 33.003124Q80.78438 33.596874 80.78438 34.503124Q80.78438 35.378124 80.26875 36.159374Q79.75313 36.940624 78.78438 37.3625Q77.81563 37.784374 76.59688 37.784374Q74.58125 37.784374 73.51875 36.940624Q72.45625 36.096874 72.15938 34.45625ZM89.01875 37.55L89.01875 23.2375L94.39375 23.2375Q96.03438 23.2375 97.01875 23.675Q98.00313 24.096874 98.56563 25.003124Q99.12813 25.909374 99.12813 26.89375Q99.12813 27.815624 98.62813 28.628124Q98.14375 29.440624 97.12813 29.925Q98.425 30.315624 99.12813 31.2375Q99.83125 32.14375 99.83125 33.39375Q99.83125 34.409374 99.39375 35.26875Q98.97188 36.128124 98.34688 36.596874Q97.72188 37.065624 96.78438 37.315624Q95.84688 37.55 94.47188 37.55L89.01875 37.55ZM90.90938 29.253124L94.00313 29.253124Q95.26875 29.253124 95.81563 29.08125Q96.53438 28.8625 96.89375 28.378124Q97.26875 27.878124 97.26875 27.1125Q97.26875 26.409374 96.925 25.8625Q96.58125 25.315624 95.94063 25.128124Q95.31563 24.925 93.76875 24.925L90.90938 24.925L90.90938 29.253124ZM90.90938 35.8625L94.47188 35.8625Q95.39375 35.8625 95.76875 35.784374Q96.425 35.675 96.8625 35.409374Q97.3 35.128124 97.58125 34.6125Q97.8625 34.08125 97.8625 33.39375Q97.8625 32.596874 97.45625 32.003124Q97.05 31.409374 96.31563 31.175Q95.58125 30.940624 94.22188 30.940624L90.90938 30.940624L90.90938 35.8625ZM101.83125 37.55L101.83125 23.2375L103.58125 23.2375L103.58125 37.55L101.83125 37.55ZM105.22188 32.3625Q105.22188 29.4875 106.81563 28.096874Q108.15938 26.940624 110.08125 26.940624Q112.22188 26.940624 113.56563 28.346874Q114.925 29.753124 114.925 32.221874Q114.925 34.221874 114.33125 35.378124Q113.7375 36.51875 112.58125 37.159374Q111.44063 37.784374 110.08125 37.784374Q107.89375 37.784374 106.55 36.39375Q105.22188 34.9875 105.22188 32.3625ZM107.01875 32.3625Q107.01875 34.3625 107.87813 35.346874Q108.75313 36.33125 110.08125 36.33125Q111.39375 36.33125 112.25313 35.346874Q113.12813 34.346874 113.12813 32.3Q113.12813 30.378124 112.25313 29.39375Q111.37813 28.39375 110.08125 28.39375Q108.75313 28.39375 107.87813 29.39375Q107.01875 30.378124 107.01875 32.3625ZM123.64375 33.753124L125.3625 33.971874Q125.08125 35.76875 123.90938 36.784374Q122.75313 37.784374 121.05 37.784374Q118.925 37.784374 117.62813 36.39375Q116.33125 35.003124 116.33125 32.409374Q116.33125 30.721874 116.87813 29.471874Q117.44063 28.20625 118.58125 27.58125Q119.72188 26.940624 121.06563 26.940624Q122.75313 26.940624 123.81563 27.8Q124.89375 28.659374 125.20625 30.221874L123.4875 30.4875Q123.25313 29.440624 122.62813 28.925Q122.00313 28.39375 121.12813 28.39375Q119.8 28.39375 118.97188 29.346874Q118.14375 30.3 118.14375 32.346874Q118.14375 34.440624 118.94063 35.39375Q119.7375 36.33125 121.03438 36.33125Q122.06563 36.33125 122.75313 35.70625Q123.45625 35.065624 123.64375 33.753124ZM126.87813 37.55L126.87813 23.2375L128.64375 23.2375L128.64375 31.39375L132.8 27.175L135.06563 27.175L131.1125 31.01875L135.47188 37.55L133.3 37.55L129.87813 32.253124L128.64375 33.440624L128.64375 37.55L126.87813 37.55ZM136.45625 32.95625L138.2375 32.8Q138.3625 33.8625 138.81563 34.55Q139.28438 35.2375 140.25313 35.675Q141.2375 36.096874 142.47188 36.096874Q143.55 36.096874 144.37813 35.784374Q145.20625 35.45625 145.6125 34.89375Q146.01875 34.33125 146.01875 33.659374Q146.01875 32.9875 145.62813 32.4875Q145.2375 31.9875 144.34688 31.64375Q143.76875 31.409374 141.78438 30.940624Q139.81563 30.471874 139.03438 30.05Q138.00313 29.51875 137.50313 28.721874Q137.00313 27.925 137.00313 26.940624Q137.00313 25.846874 137.6125 24.909374Q138.22188 23.971874 139.40938 23.4875Q140.59688 22.9875 142.03438 22.9875Q143.62813 22.9875 144.84688 23.503124Q146.06563 24.01875 146.70625 25.01875Q147.3625 26.003124 147.40938 27.26875L145.59688 27.409374Q145.45625 26.05 144.6125 25.3625Q143.76875 24.659374 142.1125 24.659374Q140.39375 24.659374 139.59688 25.3Q138.81563 25.925 138.81563 26.8Q138.81563 27.58125 139.37813 28.08125Q139.925 28.58125 142.2375 29.096874Q144.55 29.6125 145.40938 30.003124Q146.65938 30.58125 147.25313 31.471874Q147.84688 32.346874 147.84688 33.503124Q147.84688 34.64375 147.19063 35.659374Q146.53438 36.675 145.3 37.2375Q144.08125 37.8 142.55 37.8Q140.6125 37.8 139.3 37.2375Q137.9875 36.659374 137.2375 35.51875Q136.4875 34.378124 136.45625 32.95625ZM149.87813 25.253124L149.87813 23.2375L151.64375 23.2375L151.64375 25.253124L149.87813 25.253124ZM149.87813 37.55L149.87813 27.175L151.64375 27.175L151.64375 37.55L149.87813 37.55ZM152.94063 37.55L152.94063 36.128124L159.55 28.55Q158.425 28.596874 157.56563 28.596874L153.33125 28.596874L153.33125 27.175L161.81563 27.175L161.81563 28.346874L156.19063 34.925L155.1125 36.128124Q156.28438 36.034374 157.33125 36.034374L162.12813 36.034374L162.12813 37.55L152.94063 37.55ZM169.97188 34.20625L171.78438 34.440624Q171.3625 36.01875 170.19063 36.909374Q169.03438 37.784374 167.22188 37.784374Q164.95625 37.784374 163.6125 36.39375Q162.28438 34.9875 162.28438 32.45625Q162.28438 29.83125 163.62813 28.39375Q164.97188 26.940624 167.12813 26.940624Q169.20625 26.940624 170.51875 28.3625Q171.84688 29.76875 171.84688 32.346874Q171.84688 32.503124 171.83125 32.815624L164.09688 32.815624Q164.19063 34.51875 165.06563 35.425Q165.94063 36.33125 167.2375 36.33125Q168.20625 36.33125 168.87813 35.83125Q169.56563 35.315624 169.97188 34.20625ZM164.19063 31.3625L169.9875 31.3625Q169.87813 30.065624 169.33125 29.409374Q168.4875 28.39375 167.14375 28.39375Q165.94063 28.39375 165.1125 29.20625Q164.28438 30.003124 164.19063 31.3625ZM186.64375 36.26875Q185.65938 37.096874 184.75313 37.440624Q183.84688 37.784374 182.81563 37.784374Q181.1125 37.784374 180.19063 36.95625Q179.26875 36.1125 179.26875 34.815624Q179.26875 34.05 179.6125 33.425Q179.97188 32.8 180.53438 32.425Q181.09688 32.034374 181.8 31.83125Q182.31563 31.70625 183.3625 31.565624Q185.4875 31.315624 186.4875 30.971874Q186.50313 30.6125 186.50313 30.503124Q186.50313 29.440624 186.00313 28.9875Q185.33125 28.39375 184.00313 28.39375Q182.75313 28.39375 182.15938 28.83125Q181.58125 29.26875 181.3 30.378124L179.58125 30.14375Q179.81563 29.034374 180.34688 28.3625Q180.87813 27.675 181.89375 27.315624Q182.90938 26.940624 184.25313 26.940624Q185.58125 26.940624 186.40938 27.253124Q187.2375 27.565624 187.62813 28.05Q188.01875 28.51875 188.175 29.2375Q188.26875 29.690624 188.26875 30.8625L188.26875 33.20625Q188.26875 35.659374 188.37813 36.315624Q188.4875 36.95625 188.83125 37.55L186.9875 37.55Q186.72188 37.003124 186.64375 36.26875ZM186.4875 32.346874Q185.53438 32.7375 183.6125 33.003124Q182.53438 33.159374 182.08125 33.3625Q181.64375 33.55 181.39375 33.925Q181.14375 34.3 181.14375 34.76875Q181.14375 35.471874 181.675 35.940624Q182.20625 36.409374 183.2375 36.409374Q184.25313 36.409374 185.03438 35.971874Q185.83125 35.51875 186.20625 34.753124Q186.4875 34.14375 186.4875 32.9875L186.4875 32.346874ZM194.70625 35.971874L194.95625 37.534374Q194.22188 37.690624 193.62813 37.690624Q192.675 37.690624 192.14375 37.39375Q191.62813 37.08125 191.40938 36.596874Q191.19063 36.096874 191.19063 34.51875L191.19063 28.55L189.90938 28.55L189.90938 27.175L191.19063 27.175L191.19063 24.6125L192.94063 23.55L192.94063 27.175L194.70625 27.175L194.70625 28.55L192.94063 28.55L192.94063 34.6125Q192.94063 35.3625 193.03438 35.58125Q193.12813 35.784374 193.33125 35.925Q193.55 36.05 193.94063 36.05Q194.22188 36.05 194.70625 35.971874ZM202.37813 33.8L204.22188 33.64375Q204.425 34.9875 205.175 35.675Q205.925 36.346874 206.9875 36.346874Q208.25313 36.346874 209.12813 35.39375Q210.00313 34.440624 210.00313 32.846874Q210.00313 31.346874 209.15938 30.4875Q208.31563 29.6125 206.95625 29.6125Q206.09688 29.6125 205.40938 30.003124Q204.7375 30.378124 204.34688 31.003124L202.69063 30.784374L204.08125 23.425L211.20625 23.425L211.20625 25.1125L205.4875 25.1125L204.72188 28.95625Q206.00313 28.05 207.425 28.05Q209.3 28.05 210.58125 29.3625Q211.87813 30.659374 211.87813 32.690624Q211.87813 34.64375 210.7375 36.05Q209.3625 37.8 206.9875 37.8Q205.03438 37.8 203.78438 36.70625Q202.55 35.6125 202.37813 33.8ZM213.37813 30.4875Q213.37813 27.95625 213.89375 26.409374Q214.425 24.846874 215.45625 24.01875Q216.4875 23.175 218.05 23.175Q219.20625 23.175 220.06563 23.64375Q220.94063 24.096874 221.50313 24.971874Q222.06563 25.846874 222.39375 27.1125Q222.72188 28.3625 222.72188 30.4875Q222.72188 33.003124 222.19063 34.55Q221.675 36.096874 220.64375 36.95625Q219.62813 37.8 218.05 37.8Q215.97188 37.8 214.8 36.315624Q213.37813 34.51875 213.37813 30.4875ZM215.19063 30.4875Q215.19063 34.01875 216.00313 35.190624Q216.83125 36.346874 218.05 36.346874Q219.25313 36.346874 220.08125 35.175Q220.90938 34.003124 220.90938 30.4875Q220.90938 26.95625 220.08125 25.8Q219.25313 24.628124 218.03438 24.628124Q216.81563 24.628124 216.09688 25.659374Q215.19063 26.95625 215.19063 30.4875ZM225.33125 37.55L225.33125 35.55L227.33125 35.55L227.33125 37.55Q227.33125 38.659374 226.94063 39.33125Q226.55 40.01875 225.70625 40.378124L225.20625 39.628124Q225.76875 39.39375 226.03438 38.909374Q226.3 38.440624 226.33125 37.55L225.33125 37.55ZM230.37813 30.4875Q230.37813 27.95625 230.89375 26.409374Q231.425 24.846874 232.45625 24.01875Q233.4875 23.175 235.05 23.175Q236.20625 23.175 237.06563 23.64375Q237.94063 24.096874 238.50313 24.971874Q239.06563 25.846874 239.39375 27.1125Q239.72188 28.3625 239.72188 30.4875Q239.72188 33.003124 239.19063 34.55Q238.675 36.096874 237.64375 36.95625Q236.62813 37.8 235.05 37.8Q232.97188 37.8 231.8 36.315624Q230.37813 34.51875 230.37813 30.4875ZM232.19063 30.4875Q232.19063 34.01875 233.00313 35.190624Q233.83125 36.346874 235.05 36.346874Q236.25313 36.346874 237.08125 35.175Q237.90938 34.003124 237.90938 30.4875Q237.90938 26.95625 237.08125 25.8Q236.25313 24.628124 235.03438 24.628124Q233.81563 24.628124 233.09688 25.659374Q232.19063 26.95625 232.19063 30.4875ZM241.37813 30.4875Q241.37813 27.95625 241.89375 26.409374Q242.425 24.846874 243.45625 24.01875Q244.4875 23.175 246.05 23.175Q247.20625 23.175 248.06563 23.64375Q248.94063 24.096874 249.50313 24.971874Q250.06563 25.846874 250.39375 27.1125Q250.72188 28.3625 250.72188 30.4875Q250.72188 33.003124 250.19063 34.55Q249.675 36.096874 248.64375 36.95625Q247.62813 37.8 246.05 37.8Q243.97188 37.8 242.8 36.315624Q241.37813 34.51875 241.37813 30.4875ZM243.19063 30.4875Q243.19063 34.01875 244.00313 35.190624Q244.83125 36.346874 246.05 36.346874Q247.25313 36.346874 248.08125 35.175Q248.90938 34.003124 248.90938 30.4875Q248.90938 26.95625 248.08125 25.8Q247.25313 24.628124 246.03438 24.628124Q244.81563 24.628124 244.09688 25.659374Q243.19063 26.95625 243.19063 30.4875ZM252.37813 30.4875Q252.37813 27.95625 252.89375 26.409374Q253.425 24.846874 254.45625 24.01875Q255.4875 23.175 257.05 23.175Q258.20624 23.175 259.0656 23.64375Q259.9406 24.096874 260.5031 24.971874Q261.0656 25.846874 261.39374 27.1125Q261.72186 28.3625 261.72186 30.4875Q261.72186 33.003124 261.1906 34.55Q260.675 36.096874 259.64374 36.95625Q258.6281 37.8 257.05 37.8Q254.97188 37.8 253.8 36.315624Q252.37813 34.51875 252.37813 30.4875ZM254.19063 30.4875Q254.19063 34.01875 255.00313 35.190624Q255.83125 36.346874 257.05 36.346874Q258.2531 36.346874 259.08124 35.175Q259.90936 34.003124 259.90936 30.4875Q259.90936 26.95625 259.08124 25.8Q258.2531 24.628124 257.03436 24.628124Q255.81563 24.628124 255.09688 25.659374Q254.19063 26.95625 254.19063 30.4875ZM270.01874 37.55L270.01874 23.2375L275.39374 23.2375Q277.03436 23.2375 278.01874 23.675Q279.0031 24.096874 279.5656 25.003124Q280.1281 25.909374 280.1281 26.89375Q280.1281 27.815624 279.6281 28.628124Q279.14374 29.440624 278.1281 29.925Q279.425 30.315624 280.1281 31.2375Q280.83124 32.14375 280.83124 33.39375Q280.83124 34.409374 280.39374 35.26875Q279.97186 36.128124 279.34686 36.596874Q278.72186 37.065624 277.78436 37.315624Q276.84686 37.55 275.47186 37.55L270.01874 37.55ZM271.90936 29.253124L275.0031 29.253124Q276.26874 29.253124 276.8156 29.08125Q277.53436 28.8625 277.89374 28.378124Q278.26874 27.878124 278.26874 27.1125Q278.26874 26.409374 277.925 25.8625Q277.58124 25.315624 276.9406 25.128124Q276.3156 24.925 274.76874 24.925L271.90936 24.925L271.90936 29.253124ZM271.90936 35.8625L275.47186 35.8625Q276.39374 35.8625 276.76874 35.784374Q277.425 35.675 277.8625 35.409374Q278.3 35.128124 278.58124 34.6125Q278.8625 34.08125 278.8625 33.39375Q278.8625 32.596874 278.45624 32.003124Q278.05 31.409374 277.3156 31.175Q276.58124 30.940624 275.22186 30.940624L271.90936 30.940624L271.90936 35.8625ZM282.22186 32.3625Q282.22186 29.4875 283.8156 28.096874Q285.15936 26.940624 287.08124 26.940624Q289.22186 26.940624 290.5656 28.346874Q291.925 29.753124 291.925 32.221874Q291.925 34.221874 291.33124 35.378124Q290.7375 36.51875 289.58124 37.159374Q288.4406 37.784374 287.08124 37.784374Q284.89374 37.784374 283.55 36.39375Q282.22186 34.9875 282.22186 32.3625ZM284.01874 32.3625Q284.01874 34.3625 284.8781 35.346874Q285.7531 36.33125 287.08124 36.33125Q288.39374 36.33125 289.2531 35.346874Q290.1281 34.346874 290.1281 32.3Q290.1281 30.378124 289.2531 29.39375Q288.3781 28.39375 287.08124 28.39375Q285.7531 28.39375 284.8781 29.39375Q284.01874 30.378124 284.01874 32.3625ZM293.8781 25.253124L293.8781 23.2375L295.64374 23.2375L295.64374 25.253124L293.8781 25.253124ZM293.8781 37.55L293.8781 27.175L295.64374 27.175L295.64374 37.55L293.8781 37.55ZM304.59686 37.55L304.59686 36.2375Q303.6125 37.784374 301.6906 37.784374Q300.45624 37.784374 299.40936 37.096874Q298.3781 36.409374 297.8 35.190624Q297.2375 33.971874 297.2375 32.378124Q297.2375 30.815624 297.7531 29.55Q298.26874 28.284374 299.3 27.6125Q300.34686 26.940624 301.6125 26.940624Q302.55 26.940624 303.28436 27.346874Q304.01874 27.7375 304.4875 28.3625L304.4875 23.2375L306.22186 23.2375L306.22186 37.55L304.59686 37.55ZM299.03436 32.378124Q299.03436 34.3625 299.8781 35.346874Q300.72186 36.33125 301.8625 36.33125Q303.01874 36.33125 303.8156 35.39375Q304.6281 34.45625 304.6281 32.51875Q304.6281 30.39375 303.8 29.39375Q302.9875 28.39375 301.78436 28.39375Q300.6125 28.39375 299.8156 29.3625Q299.03436 30.315624 299.03436 32.378124ZM308.15936 34.45625L309.90936 34.175Q310.05 35.221874 310.72186 35.784374Q311.39374 36.33125 312.59686 36.33125Q313.8 36.33125 314.3781 35.846874Q314.97186 35.346874 314.97186 34.690624Q314.97186 34.096874 314.45624 33.753124Q314.09686 33.51875 312.65936 33.159374Q310.72186 32.659374 309.97186 32.315624Q309.2375 31.95625 308.84686 31.33125Q308.45624 30.690624 308.45624 29.925Q308.45624 29.2375 308.76874 28.64375Q309.09686 28.05 309.64374 27.659374Q310.05 27.3625 310.7531 27.159374Q311.47186 26.940624 312.28436 26.940624Q313.5031 26.940624 314.425 27.3Q315.34686 27.64375 315.78436 28.253124Q316.22186 28.846874 316.39374 29.846874L314.675 30.08125Q314.55 29.284374 313.9875 28.846874Q313.425 28.39375 312.40936 28.39375Q311.1906 28.39375 310.675 28.8Q310.15936 29.190624 310.15936 29.721874Q310.15936 30.065624 310.3781 30.346874Q310.58124 30.628124 311.05 30.815624Q311.3156 30.909374 312.59686 31.253124Q314.47186 31.753124 315.20624 32.08125Q315.9406 32.39375 316.3625 33.003124Q316.78436 33.596874 316.78436 34.503124Q316.78436 35.378124 316.26874 36.159374Q315.7531 36.940624 314.78436 37.3625Q313.8156 37.784374 312.59686 37.784374Q310.58124 37.784374 309.51874 36.940624Q308.45624 36.096874 308.15936 34.45625Z" fill-rule="nonzero"/></svg> \ No newline at end of file diff --git a/images/naiveIsSlow.png b/images/naiveIsSlow.png new file mode 100644 index 0000000..b281f43 Binary files /dev/null and b/images/naiveIsSlow.png differ diff --git a/images/recording1.gif b/images/recording1.gif new file mode 100644 index 0000000..daaafdb Binary files /dev/null and b/images/recording1.gif differ diff --git a/images/recording2.gif b/images/recording2.gif new file mode 100644 index 0000000..30771bc Binary files /dev/null and b/images/recording2.gif differ diff --git a/images/uniformIsFine.png b/images/uniformIsFine.png new file mode 100644 index 0000000..5dc3f85 Binary files /dev/null and b/images/uniformIsFine.png differ diff --git a/src/kernel.cu b/src/kernel.cu index 74dffcb..6f7e796 100644 --- a/src/kernel.cu +++ b/src/kernel.cu @@ -6,13 +6,15 @@ #include "utilityCore.hpp" #include "kernel.h" +#include "fstream" + // LOOK-2.1 potentially useful for doing grid-based neighbor search #ifndef imax -#define imax( a, b ) ( ((a) > (b)) ? (a) : (b) ) +#define imax(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef imin -#define imin( a, b ) ( ((a) < (b)) ? (a) : (b) ) +#define imin(a, b) (((a) < (b)) ? (a) : (b)) #endif #define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) @@ -20,10 +22,13 @@ /** * Check for CUDA errors; print and exit if there was a problem. */ -void checkCUDAError(const char *msg, int line = -1) { +void checkCUDAError(const char *msg, int line = -1) +{ cudaError_t err = cudaGetLastError(); - if (cudaSuccess != err) { - if (line >= 0) { + if (cudaSuccess != err) + { + if (line >= 0) + { fprintf(stderr, "Line %d: ", line); } fprintf(stderr, "Cuda error: %s: %s.\n", msg, cudaGetErrorString(err)); @@ -31,7 +36,6 @@ void checkCUDAError(const char *msg, int line = -1) { } } - /***************** * Configuration * *****************/ @@ -53,6 +57,7 @@ void checkCUDAError(const char *msg, int line = -1) { /*! Size of the starting area in simulation space. */ #define scene_scale 100.0f +// #define scene_scale 20.f /*********************************************** * Kernel state (pointers are device pointers) * @@ -75,7 +80,7 @@ glm::vec3 *dev_vel2; // For efficient sorting and the uniform grid. These should always be parallel. int *dev_particleArrayIndices; // What index in dev_pos and dev_velX represents this particle? -int *dev_particleGridIndices; // What grid cell is this particle in? +int *dev_particleGridIndices; // What grid cell is this particle in? // needed for use with thrust thrust::device_ptr<int> dev_thrust_particleArrayIndices; thrust::device_ptr<int> dev_thrust_particleGridIndices; @@ -85,6 +90,7 @@ int *dev_gridCellEndIndices; // to this cell? // TODO-2.3 - consider what additional buffers you might need to reshuffle // the position and velocity data to be coherent within cells. +glm::vec3 *dev_newPos; // LOOK-2.1 - Grid parameters based on simulation parameters. // These are automatically computed for you in Boids::initSimulation @@ -98,7 +104,8 @@ glm::vec3 gridMinimum; * initSimulation * ******************/ -__host__ __device__ unsigned int hash(unsigned int a) { +__host__ __device__ unsigned int hash(unsigned int a) +{ a = (a + 0x7ed55d16) + (a << 12); a = (a ^ 0xc761c23c) ^ (a >> 19); a = (a + 0x165667b1) + (a << 5); @@ -112,7 +119,8 @@ __host__ __device__ unsigned int hash(unsigned int a) { * LOOK-1.2 - this is a typical helper function for a CUDA kernel. * Function for generating a random vec3. */ -__host__ __device__ glm::vec3 generateRandomVec3(float time, int index) { +__host__ __device__ glm::vec3 generateRandomVec3(float time, int index) +{ thrust::default_random_engine rng(hash((int)(index * time))); thrust::uniform_real_distribution<float> unitDistrib(-1, 1); @@ -123,9 +131,11 @@ __host__ __device__ glm::vec3 generateRandomVec3(float time, int index) { * LOOK-1.2 - This is a basic CUDA kernel. * CUDA kernel for generating boids with a specified mass randomly around the star. */ -__global__ void kernGenerateRandomPosArray(int time, int N, glm::vec3 * arr, float scale) { +__global__ void kernGenerateRandomPosArray(int time, int N, glm::vec3 *arr, float scale) +{ int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if (index < N) { + if (index < N) + { glm::vec3 rand = generateRandomVec3(time, index); arr[index].x = scale * rand.x; arr[index].y = scale * rand.y; @@ -136,28 +146,30 @@ __global__ void kernGenerateRandomPosArray(int time, int N, glm::vec3 * arr, flo /** * Initialize memory, update some globals */ -void Boids::initSimulation(int N) { +void Boids::initSimulation(int N) +{ numObjects = N; dim3 fullBlocksPerGrid((N + blockSize - 1) / blockSize); // LOOK-1.2 - This is basic CUDA memory management and error checking. // Don't forget to cudaFree in Boids::endSimulation. - cudaMalloc((void**)&dev_pos, N * sizeof(glm::vec3)); + cudaMalloc((void **)&dev_pos, N * sizeof(glm::vec3)); checkCUDAErrorWithLine("cudaMalloc dev_pos failed!"); - cudaMalloc((void**)&dev_vel1, N * sizeof(glm::vec3)); + cudaMalloc((void **)&dev_vel1, N * sizeof(glm::vec3)); checkCUDAErrorWithLine("cudaMalloc dev_vel1 failed!"); - cudaMalloc((void**)&dev_vel2, N * sizeof(glm::vec3)); + cudaMalloc((void **)&dev_vel2, N * sizeof(glm::vec3)); checkCUDAErrorWithLine("cudaMalloc dev_vel2 failed!"); // LOOK-1.2 - This is a typical CUDA kernel invocation. kernGenerateRandomPosArray<<<fullBlocksPerGrid, blockSize>>>(1, numObjects, - dev_pos, scene_scale); + dev_pos, scene_scale); checkCUDAErrorWithLine("kernGenerateRandomPosArray failed!"); // LOOK-2.1 computing grid params gridCellWidth = 2.0f * std::max(std::max(rule1Distance, rule2Distance), rule3Distance); + gridCellWidth *= 0.5f; int halfSideCount = (int)(scene_scale / gridCellWidth) + 1; gridSideCount = 2 * halfSideCount; @@ -169,10 +181,24 @@ void Boids::initSimulation(int N) { gridMinimum.z -= halfGridWidth; // TODO-2.1 TODO-2.3 - Allocate additional buffers here. + cudaMalloc((void **)&dev_particleArrayIndices, N * sizeof(glm::vec3)); + checkCUDAErrorWithLine("cudaMalloc dev_particleArrayIndices failed!"); + + cudaMalloc((void **)&dev_particleGridIndices, N * sizeof(glm::vec3)); + checkCUDAErrorWithLine("cudaMalloc dev_particleGridIndices failed!"); + + cudaMalloc((void **)&dev_gridCellStartIndices, gridCellCount * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_gridCellStartIndices failed!"); + + cudaMalloc((void **)&dev_gridCellEndIndices, gridCellCount * sizeof(int)); + checkCUDAErrorWithLine("cudaMalloc dev_gridCellEndIndices failed!"); + + cudaMalloc((void **)&dev_newPos, N * sizeof(glm::vec3)); + checkCUDAErrorWithLine("cudaMalloc dev_newPos failed!"); + cudaDeviceSynchronize(); } - /****************** * copyBoidsToVBO * ******************/ @@ -180,12 +206,14 @@ void Boids::initSimulation(int N) { /** * Copy the boid positions into the VBO so that they can be drawn by OpenGL. */ -__global__ void kernCopyPositionsToVBO(int N, glm::vec3 *pos, float *vbo, float s_scale) { +__global__ void kernCopyPositionsToVBO(int N, glm::vec3 *pos, float *vbo, float s_scale) +{ int index = threadIdx.x + (blockIdx.x * blockDim.x); float c_scale = -1.0f / s_scale; - if (index < N) { + if (index < N) + { vbo[4 * index + 0] = pos[index].x * c_scale; vbo[4 * index + 1] = pos[index].y * c_scale; vbo[4 * index + 2] = pos[index].z * c_scale; @@ -193,10 +221,12 @@ __global__ void kernCopyPositionsToVBO(int N, glm::vec3 *pos, float *vbo, float } } -__global__ void kernCopyVelocitiesToVBO(int N, glm::vec3 *vel, float *vbo, float s_scale) { +__global__ void kernCopyVelocitiesToVBO(int N, glm::vec3 *vel, float *vbo, float s_scale) +{ int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index < N) { + if (index < N) + { vbo[4 * index + 0] = vel[index].x + 0.3f; vbo[4 * index + 1] = vel[index].y + 0.3f; vbo[4 * index + 2] = vel[index].z + 0.3f; @@ -207,18 +237,18 @@ __global__ void kernCopyVelocitiesToVBO(int N, glm::vec3 *vel, float *vbo, float /** * Wrapper for call to the kernCopyboidsToVBO CUDA kernel. */ -void Boids::copyBoidsToVBO(float *vbodptr_positions, float *vbodptr_velocities) { +void Boids::copyBoidsToVBO(float *vbodptr_positions, float *vbodptr_velocities) +{ dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); - kernCopyPositionsToVBO << <fullBlocksPerGrid, blockSize >> >(numObjects, dev_pos, vbodptr_positions, scene_scale); - kernCopyVelocitiesToVBO << <fullBlocksPerGrid, blockSize >> >(numObjects, dev_vel1, vbodptr_velocities, scene_scale); + kernCopyPositionsToVBO<<<fullBlocksPerGrid, blockSize>>>(numObjects, dev_pos, vbodptr_positions, scene_scale); + kernCopyVelocitiesToVBO<<<fullBlocksPerGrid, blockSize>>>(numObjects, dev_vel1, vbodptr_velocities, scene_scale); checkCUDAErrorWithLine("copyBoidsToVBO failed!"); cudaDeviceSynchronize(); } - /****************** * stepSimulation * ******************/ @@ -229,32 +259,79 @@ void Boids::copyBoidsToVBO(float *vbodptr_positions, float *vbodptr_velocities) * Compute the new velocity on the body with index `iSelf` due to the `N` boids * in the `pos` and `vel` arrays. */ -__device__ glm::vec3 computeVelocityChange(int N, int iSelf, const glm::vec3 *pos, const glm::vec3 *vel) { +__device__ glm::vec3 computeVelocityChange(int N, int iSelf, const glm::vec3 *pos, const glm::vec3 *vel) +{ + glm::vec3 const myPos = pos[iSelf]; // Rule 1: boids fly towards their local perceived center of mass, which excludes themselves + glm::vec3 perceivedCenter(0); + int neighbors = 0; + for (int i = 0; i < N; i++) + { + if (i != iSelf && (glm::distance(pos[i], myPos) < rule1Distance)) + { + perceivedCenter += pos[i]; + neighbors++; + } + } + perceivedCenter /= neighbors > 0 ? neighbors : 1; + glm::vec3 dV1 = rule1Scale * (perceivedCenter - myPos); // Rule 2: boids try to stay a distance d away from each other + glm::vec3 c(0); + for (int i = 0; i < N; i++) + { + if (i != iSelf && (glm::distance(pos[i], myPos) < rule2Distance)) + { + c -= pos[i] - myPos; + } + } + glm::vec3 dV2 = rule2Scale * c; // Rule 3: boids try to match the speed of surrounding boids - return glm::vec3(0.0f, 0.0f, 0.0f); + glm::vec3 perceivedVelocity(0); + int neighbors2 = 0; + for (int i = 0; i < N; i++) + { + if (i != iSelf && (glm::distance(pos[i], myPos) < rule3Distance)) + { + perceivedVelocity += vel[i]; + neighbors2++; + } + } + perceivedVelocity /= neighbors2 > 0 ? neighbors2 : 1; + glm::vec3 dV3 = rule3Scale * perceivedVelocity; + return dV1 + dV2 + dV3; } /** * TODO-1.2 implement basic flocking -* For each of the `N` bodies, update its position based on its current velocity. +* For each of the `N` bodies, update its next velocity based on its current velocity. */ __global__ void kernUpdateVelocityBruteForce(int N, glm::vec3 *pos, - glm::vec3 *vel1, glm::vec3 *vel2) { + glm::vec3 *vel1, glm::vec3 *vel2) +{ + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) + { + return; + } // Compute a new velocity based on pos and vel1 + glm::vec3 dVel(computeVelocityChange(N, index, pos, vel1)); // Clamp the speed + // dVel = glm::length(dVel) > maxSpeed ? glm::normalize(dVel) : dVel; + dVel = maxSpeed * glm::normalize(dVel); // Record the new velocity into vel2. Question: why NOT vel1? + vel2[index] = dVel; // + vel1[index]; } /** * LOOK-1.2 Since this is pretty trivial, we implemented it for you. * For each of the `N` bodies, update its position based on its current velocity. */ -__global__ void kernUpdatePos(int N, float dt, glm::vec3 *pos, glm::vec3 *vel) { +__global__ void kernUpdatePos(int N, float dt, glm::vec3 *pos, glm::vec3 *vel) +{ // Update position by velocity int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= N) { + if (index >= N) + { return; } glm::vec3 thisPos = pos[index]; @@ -278,57 +355,172 @@ __global__ void kernUpdatePos(int N, float dt, glm::vec3 *pos, glm::vec3 *vel) { // for(x) // for(y) // for(z)? Or some other order? -__device__ int gridIndex3Dto1D(int x, int y, int z, int gridResolution) { +__device__ int gridIndex3Dto1D(int x, int y, int z, int gridResolution) +{ return x + y * gridResolution + z * gridResolution * gridResolution; } __global__ void kernComputeIndices(int N, int gridResolution, - glm::vec3 gridMin, float inverseCellWidth, - glm::vec3 *pos, int *indices, int *gridIndices) { - // TODO-2.1 - // - Label each boid with the index of its grid cell. - // - Set up a parallel array of integer indices as pointers to the actual - // boid data in pos and vel1/vel2 + glm::vec3 gridMin, float inverseCellWidth, + glm::vec3 *pos, int *indices, int *gridIndices) +{ + // TODO-2.1 + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= N) + { + return; + } + // - Label each boid with the index of its grid cell. + indices[index] = index; + // - Set up a parallel array of integer indices as pointers to the actual + // boid data in pos and vel1/vel2 + glm::ivec3 gridCoord(glm::floor(inverseCellWidth * (pos[index] - gridMin))); + gridIndices[index] = gridIndex3Dto1D(gridCoord.x, + gridCoord.y, + gridCoord.z, + gridResolution); } // LOOK-2.1 Consider how this could be useful for indicating that a cell // does not enclose any boids -__global__ void kernResetIntBuffer(int N, int *intBuffer, int value) { +__global__ void kernResetIntBuffer(int N, int *intBuffer, int value) +{ + // set null value as -1 int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if (index < N) { + if (index < N) + { intBuffer[index] = value; } } __global__ void kernIdentifyCellStartEnd(int N, int *particleGridIndices, - int *gridCellStartIndices, int *gridCellEndIndices) { + int *gridCellStartIndices, int *gridCellEndIndices) +{ // TODO-2.1 + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= N) + { + return; + } + auto myGridIdx = particleGridIndices[index]; + auto prevGridIdx = index == 0 ? -1 : particleGridIndices[index - 1]; + auto nextGridIdx = index == N - 1 ? -1 : particleGridIndices[index + 1]; + __syncthreads(); + if (prevGridIdx == -1 || myGridIdx != prevGridIdx) + { + gridCellStartIndices[myGridIdx] = index; + } + if (nextGridIdx == -1 || myGridIdx != nextGridIdx) + { + gridCellEndIndices[myGridIdx] = index; + } + __syncthreads(); // Identify the start point of each cell in the gridIndices array. // This is basically a parallel unrolling of a loop that goes // "this index doesn't match the one before it, must be a new cell!" } __global__ void kernUpdateVelNeighborSearchScattered( - int N, int gridResolution, glm::vec3 gridMin, - float inverseCellWidth, float cellWidth, - int *gridCellStartIndices, int *gridCellEndIndices, - int *particleArrayIndices, - glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) { + int N, int gridResolution, glm::vec3 gridMin, + float inverseCellWidth, float cellWidth, + int *gridCellStartIndices, int *gridCellEndIndices, + int *particleArrayIndices, + glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) +{ + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= N) + { + return; + } // TODO-2.1 - Update a boid's velocity using the uniform grid to reduce // the number of boids that need to be checked. + auto selfIdx = particleArrayIndices[index]; + auto myPos = pos[selfIdx]; + auto myGridPos = inverseCellWidth * (myPos - gridMin); // - Identify the grid cell that this particle is in + glm::ivec3 gridCoord(glm::floor(myGridPos)); // - Identify which cells may contain neighbors. This isn't always 8. + int xNew = gridCoord.x + (glm::fract(myGridPos.x) > 0.5 ? 1 : -1); + int yNew = gridCoord.y + (glm::fract(myGridPos.y) > 0.5 ? 1 : -1); + int zNew = gridCoord.z + (glm::fract(myGridPos.z) > 0.5 ? 1 : -1); + xNew = xNew < 0 || xNew > gridResolution - 1 ? -1 : xNew; + yNew = yNew < 0 || yNew > gridResolution - 1 ? -1 : yNew; + zNew = zNew < 0 || zNew > gridResolution - 1 ? -1 : zNew; + int myGridCells[8] = {-1}; + myGridCells[0] = gridIndex3Dto1D(gridCoord.x, gridCoord.y, gridCoord.z, gridResolution); + myGridCells[1] = xNew >= 0 ? gridIndex3Dto1D(xNew, gridCoord.y, gridCoord.z, gridResolution) : -1; + myGridCells[2] = yNew >= 0 ? gridIndex3Dto1D(gridCoord.x, yNew, gridCoord.z, gridResolution) : -1; + myGridCells[3] = yNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, yNew, gridCoord.z, gridResolution) : -1; + myGridCells[4] = zNew >= 0 ? gridIndex3Dto1D(gridCoord.x, gridCoord.y, zNew, gridResolution) : -1; + myGridCells[5] = zNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, gridCoord.y, zNew, gridResolution) : -1; + myGridCells[6] = zNew >= 0 && yNew >= 0 ? gridIndex3Dto1D(gridCoord.x, yNew, zNew, gridResolution) : -1; + myGridCells[7] = zNew >= 0 && yNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, yNew, zNew, gridResolution) : -1; // - For each cell, read the start/end indices in the boid pointer array. // - Access each boid in the cell and compute velocity change from // the boids rules, if this boid is within the neighborhood distance. + glm::vec3 perceivedCenter(0); + int neighbors = 0; + glm::vec3 c(0); + glm::vec3 perceivedVelocity(0); + int neighbors2 = 0; + for (int i = 0; i < 8; i++) + { + if (myGridCells[i] == -1) + { + continue; + } + int currIdx = myGridCells[i]; + for (int boid = gridCellStartIndices[currIdx]; boid <= gridCellEndIndices[currIdx]; boid++) + { + auto boidIdx = particleArrayIndices[boid]; + auto otherPos = pos[boidIdx]; + if (boidIdx != selfIdx) + { + if (glm::distance(otherPos, myPos) < rule1Distance) + { + perceivedCenter += otherPos; + neighbors++; + } + if (glm::distance(otherPos, myPos) < rule2Distance) + { + c -= otherPos - myPos; + } + if (glm::distance(otherPos, myPos) < rule3Distance) + { + perceivedVelocity += vel1[boidIdx]; + neighbors2++; + } + } + } + } + glm::vec3 dVel(0.f); + if (neighbors > 0) + { + perceivedCenter /= neighbors; + dVel += rule1Scale * (perceivedCenter - myPos); + } + dVel += rule2Scale * c; + if (neighbors2 > 0) + { + perceivedVelocity /= neighbors2; + dVel += rule3Scale * perceivedVelocity; + } + auto newVel = vel1[selfIdx] + dVel; // - Clamp the speed change before putting the new speed in vel2 + vel2[selfIdx] = glm::length(newVel) > maxSpeed ? maxSpeed * glm::normalize(newVel) : newVel; } __global__ void kernUpdateVelNeighborSearchCoherent( - int N, int gridResolution, glm::vec3 gridMin, - float inverseCellWidth, float cellWidth, - int *gridCellStartIndices, int *gridCellEndIndices, - glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) { + int N, int gridResolution, glm::vec3 gridMin, + float inverseCellWidth, float cellWidth, + int *gridCellStartIndices, int *gridCellEndIndices, + glm::vec3 *pos, glm::vec3 *vel1, glm::vec3 *vel2) +{ + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= N) + { + return; + } // TODO-2.3 - This should be very similar to kernUpdateVelNeighborSearchScattered, // except with one less level of indirection. // This should expect gridCellStartIndices and gridCellEndIndices to refer @@ -341,58 +533,288 @@ __global__ void kernUpdateVelNeighborSearchCoherent( // - Access each boid in the cell and compute velocity change from // the boids rules, if this boid is within the neighborhood distance. // - Clamp the speed change before putting the new speed in vel2 + // TODO-2.1 - Update a boid's velocity using the uniform grid to reduce + // the number of boids that need to be checked. + auto myPos = pos[index]; + auto myGridPos = inverseCellWidth * (myPos - gridMin); + // - Identify the grid cell that this particle is in + glm::ivec3 gridCoord(glm::floor(myGridPos)); + // - Identify which cells may contain neighbors. This isn't always 8. + // int xNew = gridCoord.x + (glm::fract(myGridPos.x) > 0.5 ? 1 : -1); + // int yNew = gridCoord.y + (glm::fract(myGridPos.y) > 0.5 ? 1 : -1); + // int zNew = gridCoord.z + (glm::fract(myGridPos.z) > 0.5 ? 1 : -1); + // xNew = xNew < 0 || xNew > gridResolution - 1 ? -1 : xNew; + // yNew = yNew < 0 || yNew > gridResolution - 1 ? -1 : yNew; + // zNew = zNew < 0 || zNew > gridResolution - 1 ? -1 : zNew; + // int myGridCells[8] = {-1}; + // myGridCells[0] = gridIndex3Dto1D(gridCoord.x, gridCoord.y, gridCoord.z, gridResolution); + // myGridCells[1] = xNew >= 0 ? gridIndex3Dto1D(xNew, gridCoord.y, gridCoord.z, gridResolution) : -1; + // myGridCells[2] = yNew >= 0 ? gridIndex3Dto1D(gridCoord.x, yNew, gridCoord.z, gridResolution) : -1; + // myGridCells[3] = yNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, yNew, gridCoord.z, gridResolution) : -1; + // myGridCells[4] = zNew >= 0 ? gridIndex3Dto1D(gridCoord.x, gridCoord.y, zNew, gridResolution) : -1; + // myGridCells[5] = zNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, gridCoord.y, zNew, gridResolution) : -1; + // myGridCells[6] = zNew >= 0 && yNew >= 0 ? gridIndex3Dto1D(gridCoord.x, yNew, zNew, gridResolution) : -1; + // myGridCells[7] = zNew >= 0 && yNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, yNew, zNew, gridResolution) : -1; + int myGridCells[27] = {-1}; + for (int i = -1; i <= 1; i++) + { + for (int j = -1; j <= 1; j++) + { + for (int k = -1; k <= 1; k++) + { + auto xNew = gridCoord.x + k; + xNew = xNew < 0 || xNew > gridResolution - 1 ? -1 : xNew; + auto yNew = gridCoord.y + j; + yNew = yNew < 0 || yNew > gridResolution - 1 ? -1 : yNew; + auto zNew = gridCoord.z + i; + zNew = zNew < 0 || zNew > gridResolution - 1 ? -1 : zNew; + myGridCells[k + 1 + (j + 1) * 3 + (i + 1) * 9] = + zNew >= 0 && yNew >= 0 && xNew >= 0 ? gridIndex3Dto1D(xNew, yNew, zNew, gridResolution) : -1; + } + } + } + // - For each cell, read the start/end indices in the boid pointer array. + // - Access each boid in the cell and compute velocity change from + // the boids rules, if this boid is within the neighborhood distance. + glm::vec3 perceivedCenter(0); + int neighbors = 0; + glm::vec3 c(0); + glm::vec3 perceivedVelocity(0); + int neighbors2 = 0; + // for (int i = 0; i < 8; i++) + for (int i = 0; i < 27; i++) + { + if (myGridCells[i] == -1) + { + continue; + } + int currIdx = myGridCells[i]; + for (int boid = gridCellStartIndices[currIdx]; boid <= gridCellEndIndices[currIdx]; boid++) + { + // auto boidIdx = particleArrayIndices[boid]; + auto otherPos = pos[boid]; + if (boid != index) + { + if (glm::distance(otherPos, myPos) < rule1Distance) + { + perceivedCenter += otherPos; + neighbors++; + } + if (glm::distance(otherPos, myPos) < rule2Distance) + { + c -= otherPos - myPos; + } + if (glm::distance(otherPos, myPos) < rule3Distance) + { + perceivedVelocity += vel1[boid]; + neighbors2++; + } + } + } + } + glm::vec3 dVel(0.f); + if (neighbors > 0) + { + perceivedCenter /= neighbors; + dVel += rule1Scale * (perceivedCenter - myPos); + } + dVel += rule2Scale * c; + if (neighbors2 > 0) + { + perceivedVelocity /= neighbors2; + dVel += rule3Scale * perceivedVelocity; + } + auto newVel = vel1[index] + dVel; + // - Clamp the speed change before putting the new speed in vel2 + vel2[index] = glm::length(newVel) > maxSpeed ? maxSpeed * glm::normalize(newVel) : newVel; } /** * Step the entire N-body simulation by `dt` seconds. */ -void Boids::stepSimulationNaive(float dt) { +void Boids::stepSimulationNaive(float dt) +{ + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); // TODO-1.2 - use the kernels you wrote to step the simulation forward in time. + kernUpdateVelocityBruteForce<<<fullBlocksPerGrid, blockSize>>>(numObjects, dev_pos, dev_vel1, dev_vel2); + checkCUDAErrorWithLine("kernUpdateVelocityBruteForce failed!"); + kernUpdatePos<<<fullBlocksPerGrid, blockSize>>>(numObjects, dt, dev_pos, dev_vel1); + checkCUDAErrorWithLine("kernUpdatePos failed!"); // TODO-1.2 ping-pong the velocity buffers + glm::vec3 *tmp = dev_vel1; + dev_vel1 = dev_vel2; + dev_vel2 = tmp; } -void Boids::stepSimulationScatteredGrid(float dt) { +void Boids::stepSimulationScatteredGrid(float dt) +{ + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); + dim3 fullBlocksPerGridCells((gridCellCount + blockSize - 1) / blockSize); // TODO-2.1 // Uniform Grid Neighbor search using Thrust sort. // In Parallel: // - label each particle with its array index as well as its grid index. // Use 2x width grids. + kernComputeIndices<<<fullBlocksPerGrid, blockSize>>>(numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + dev_pos, + dev_particleArrayIndices, + dev_particleGridIndices); + checkCUDAErrorWithLine("kernComputeIndices failed!"); + // - Unstable key sort using Thrust. A stable sort isn't necessary, but you // are welcome to do a performance comparison. + dev_thrust_particleArrayIndices = thrust::device_ptr<int>(dev_particleArrayIndices); + dev_thrust_particleGridIndices = thrust::device_ptr<int>(dev_particleGridIndices); + thrust::sort_by_key(dev_thrust_particleGridIndices, + dev_thrust_particleGridIndices + numObjects, + dev_thrust_particleArrayIndices); + // - Naively unroll the loop for finding the start and end indices of each // cell's data pointers in the array of boid indices + kernResetIntBuffer<<<fullBlocksPerGridCells, blockSize>>>( + gridCellCount, dev_gridCellStartIndices, -1); + checkCUDAErrorWithLine("kernResetIntBuffer gridCellStartIndices failed!"); + kernResetIntBuffer<<<fullBlocksPerGridCells, blockSize>>>( + gridCellCount, dev_gridCellEndIndices, -1); + checkCUDAErrorWithLine("kernResetIntBuffer gridCellEndIndices failed!"); + kernIdentifyCellStartEnd<<<fullBlocksPerGrid, blockSize>>>(numObjects, + dev_particleGridIndices, + dev_gridCellStartIndices, + dev_gridCellEndIndices); + checkCUDAErrorWithLine("kernIdentifyCellStartEnd failed!"); + // - Perform velocity updates using neighbor search + kernUpdateVelNeighborSearchScattered<<<fullBlocksPerGrid, blockSize>>>(numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + gridCellWidth, + dev_gridCellStartIndices, + dev_gridCellEndIndices, + dev_particleArrayIndices, + dev_pos, + dev_vel1, + dev_vel2); + checkCUDAErrorWithLine("kernUpdateVelNeighborSearchScattered failed!"); + // kernUpdateVelocityBruteForce<<<fullBlocksPerGrid, blockSize>>>(numObjects, dev_pos, dev_vel1, dev_vel2); // - Update positions + kernUpdatePos<<<fullBlocksPerGrid, blockSize>>>(numObjects, + dt, + dev_pos, + dev_vel1); + checkCUDAErrorWithLine("kernUpdatePos failed!"); // - Ping-pong buffers as needed + glm::vec3 *tmp = dev_vel1; + dev_vel1 = dev_vel2; + dev_vel2 = tmp; } -void Boids::stepSimulationCoherentGrid(float dt) { +__global__ void kernRearrangeParticleData( + int N, int *particleArrayIndices, + glm::vec3 *oldPos, glm::vec3 *newPos, + glm::vec3 *oldVel, glm::vec3 *newVel) +{ + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= N) + { + return; + } + newPos[index] = oldPos[particleArrayIndices[index]]; + newVel[index] = oldVel[particleArrayIndices[index]]; +} +void Boids::stepSimulationCoherentGrid(float dt) +{ + dim3 fullBlocksPerGrid((numObjects + blockSize - 1) / blockSize); + dim3 fullBlocksPerGridCells((gridCellCount + blockSize - 1) / blockSize); // TODO-2.3 - start by copying Boids::stepSimulationNaiveGrid // Uniform Grid Neighbor search using Thrust sort on cell-coherent data. // In Parallel: // - Label each particle with its array index as well as its grid index. // Use 2x width grids + kernComputeIndices<<<fullBlocksPerGrid, blockSize>>>(numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + dev_pos, + dev_particleArrayIndices, + dev_particleGridIndices); + checkCUDAErrorWithLine("kernComputeIndices failed!"); // - Unstable key sort using Thrust. A stable sort isn't necessary, but you // are welcome to do a performance comparison. + dev_thrust_particleArrayIndices = thrust::device_ptr<int>(dev_particleArrayIndices); + dev_thrust_particleGridIndices = thrust::device_ptr<int>(dev_particleGridIndices); + thrust::sort_by_key(dev_thrust_particleGridIndices, + dev_thrust_particleGridIndices + numObjects, + dev_thrust_particleArrayIndices); // - Naively unroll the loop for finding the start and end indices of each // cell's data pointers in the array of boid indices + kernResetIntBuffer<<<fullBlocksPerGridCells, blockSize>>>( + gridCellCount, dev_gridCellStartIndices, -1); + checkCUDAErrorWithLine("kernResetIntBuffer gridCellStartIndices failed!"); + kernResetIntBuffer<<<fullBlocksPerGridCells, blockSize>>>( + gridCellCount, dev_gridCellEndIndices, -1); + checkCUDAErrorWithLine("kernResetIntBuffer gridCellEndIndices failed!"); + kernIdentifyCellStartEnd<<<fullBlocksPerGrid, blockSize>>>(numObjects, + dev_particleGridIndices, + dev_gridCellStartIndices, + dev_gridCellEndIndices); + checkCUDAErrorWithLine("kernIdentifyCellStartEnd failed!"); // - BIG DIFFERENCE: use the rearranged array index buffer to reshuffle all // the particle data in the simulation array. // CONSIDER WHAT ADDITIONAL BUFFERS YOU NEED + + // v1 holds current velocity data, rearrange into v2. + // in next function, flip so v1 after holds the next timesteps + kernRearrangeParticleData<<<fullBlocksPerGrid, blockSize>>>(numObjects, + dev_particleArrayIndices, + dev_pos, + dev_newPos, + dev_vel1, + dev_vel2); + checkCUDAErrorWithLine("kernRearrangeParticleData failed!"); // - Perform velocity updates using neighbor search + kernUpdateVelNeighborSearchCoherent<<<fullBlocksPerGrid, blockSize>>>(numObjects, + gridSideCount, + gridMinimum, + gridInverseCellWidth, + gridCellWidth, + dev_gridCellStartIndices, + dev_gridCellEndIndices, + dev_newPos, + dev_vel2, + dev_vel1); + checkCUDAErrorWithLine("kernUpdateVelNeighborSearchScattered failed!"); // - Update positions + kernUpdatePos<<<fullBlocksPerGrid, blockSize>>>(numObjects, + dt, + dev_newPos, + dev_vel2); + checkCUDAErrorWithLine("kernUpdatePos failed!"); // - Ping-pong buffers as needed. THIS MAY BE DIFFERENT FROM BEFORE. + glm::vec3 *tmp = dev_pos; + dev_pos = dev_newPos; + dev_newPos = tmp; } -void Boids::endSimulation() { +void Boids::endSimulation() +{ cudaFree(dev_vel1); cudaFree(dev_vel2); cudaFree(dev_pos); // TODO-2.1 TODO-2.3 - Free any additional buffers here. + cudaFree(dev_gridCellEndIndices); + cudaFree(dev_gridCellStartIndices); + cudaFree(dev_particleGridIndices); + cudaFree(dev_particleArrayIndices); + cudaFree(dev_newPos); } -void Boids::unitTest() { +void Boids::unitTest() +{ // LOOK-1.2 Feel free to write additional tests here. // test unstable sort @@ -400,30 +822,41 @@ void Boids::unitTest() { int *dev_intValues; int N = 10; - std::unique_ptr<int[]>intKeys{ new int[N] }; - std::unique_ptr<int[]>intValues{ new int[N] }; - - intKeys[0] = 0; intValues[0] = 0; - intKeys[1] = 1; intValues[1] = 1; - intKeys[2] = 0; intValues[2] = 2; - intKeys[3] = 3; intValues[3] = 3; - intKeys[4] = 0; intValues[4] = 4; - intKeys[5] = 2; intValues[5] = 5; - intKeys[6] = 2; intValues[6] = 6; - intKeys[7] = 0; intValues[7] = 7; - intKeys[8] = 5; intValues[8] = 8; - intKeys[9] = 6; intValues[9] = 9; - - cudaMalloc((void**)&dev_intKeys, N * sizeof(int)); + std::unique_ptr<int[]> intKeys{new int[N]}; + std::unique_ptr<int[]> intValues{new int[N]}; + + intKeys[0] = 0; + intValues[0] = 0; + intKeys[1] = 1; + intValues[1] = 1; + intKeys[2] = 0; + intValues[2] = 2; + intKeys[3] = 3; + intValues[3] = 3; + intKeys[4] = 0; + intValues[4] = 4; + intKeys[5] = 2; + intValues[5] = 5; + intKeys[6] = 2; + intValues[6] = 6; + intKeys[7] = 0; + intValues[7] = 7; + intKeys[8] = 5; + intValues[8] = 8; + intKeys[9] = 6; + intValues[9] = 9; + + cudaMalloc((void **)&dev_intKeys, N * sizeof(int)); checkCUDAErrorWithLine("cudaMalloc dev_intKeys failed!"); - cudaMalloc((void**)&dev_intValues, N * sizeof(int)); + cudaMalloc((void **)&dev_intValues, N * sizeof(int)); checkCUDAErrorWithLine("cudaMalloc dev_intValues failed!"); dim3 fullBlocksPerGrid((N + blockSize - 1) / blockSize); std::cout << "before unstable sort: " << std::endl; - for (int i = 0; i < N; i++) { + for (int i = 0; i < N; i++) + { std::cout << " key: " << intKeys[i]; std::cout << " value: " << intValues[i] << std::endl; } @@ -444,7 +877,8 @@ void Boids::unitTest() { checkCUDAErrorWithLine("memcpy back failed!"); std::cout << "after unstable sort: " << std::endl; - for (int i = 0; i < N; i++) { + for (int i = 0; i < N; i++) + { std::cout << " key: " << intKeys[i]; std::cout << " value: " << intValues[i] << std::endl; } diff --git a/src/main.cpp b/src/main.cpp index b82c8c6..8ae7691 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,24 +14,28 @@ // LOOK-2.1 LOOK-2.3 - toggles for UNIFORM_GRID and COHERENT_GRID #define VISUALIZE 1 -#define UNIFORM_GRID 0 -#define COHERENT_GRID 0 +#define UNIFORM_GRID 1 +#define COHERENT_GRID 1 // LOOK-1.2 - change this to adjust particle count in the simulation -const int N_FOR_VIS = 5000; +const int N_FOR_VIS = 50000; const float DT = 0.2f; /** * C main function. */ -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) +{ projectName = "565 CUDA Intro: Boids"; - if (init(argc, argv)) { + if (init(argc, argv)) + { mainLoop(); Boids::endSimulation(); return 0; - } else { + } + else + { return 1; } } @@ -46,17 +50,19 @@ GLFWwindow *window; /** * Initialization of CUDA and GLFW. */ -bool init(int argc, char **argv) { +bool init(int argc, char **argv) +{ // Set window title to "Student Name: [SM 2.0] GPU Name" cudaDeviceProp deviceProp; int gpuDevice = 0; int device_count = 0; cudaGetDeviceCount(&device_count); - if (gpuDevice > device_count) { + if (gpuDevice > device_count) + { std::cout - << "Error: GPU device number is greater than the number of devices!" - << " Perhaps a CUDA-capable GPU is not installed?" - << std::endl; + << "Error: GPU device number is greater than the number of devices!" + << " Perhaps a CUDA-capable GPU is not installed?" + << std::endl; return false; } cudaGetDeviceProperties(&deviceProp, gpuDevice); @@ -70,11 +76,12 @@ bool init(int argc, char **argv) { // Window setup stuff glfwSetErrorCallback(errorCallback); - if (!glfwInit()) { + if (!glfwInit()) + { std::cout - << "Error: Could not initialize GLFW!" - << " Perhaps OpenGL 3.3 isn't available?" - << std::endl; + << "Error: Could not initialize GLFW!" + << " Perhaps OpenGL 3.3 isn't available?" + << std::endl; return false; } @@ -84,7 +91,8 @@ bool init(int argc, char **argv) { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); window = glfwCreateWindow(width, height, deviceName.c_str(), NULL, NULL); - if (!window) { + if (!window) + { glfwTerminate(); return false; } @@ -94,7 +102,8 @@ bool init(int argc, char **argv) { glfwSetMouseButtonCallback(window, mouseButtonCallback); glewExperimental = GL_TRUE; - if (glewInit() != GLEW_OK) { + if (glewInit() != GLEW_OK) + { return false; } @@ -120,15 +129,17 @@ bool init(int argc, char **argv) { return true; } -void initVAO() { +void initVAO() +{ - std::unique_ptr<GLfloat[]> bodies{ new GLfloat[4 * (N_FOR_VIS)] }; - std::unique_ptr<GLuint[]> bindices{ new GLuint[N_FOR_VIS] }; + std::unique_ptr<GLfloat[]> bodies{new GLfloat[4 * (N_FOR_VIS)]}; + std::unique_ptr<GLuint[]> bindices{new GLuint[N_FOR_VIS]}; glm::vec4 ul(-1.0, -1.0, 1.0, 1.0); glm::vec4 lr(1.0, 1.0, 0.0, 0.0); - for (int i = 0; i < N_FOR_VIS; i++) { + for (int i = 0; i < N_FOR_VIS; i++) + { bodies[4 * i + 0] = 0.0f; bodies[4 * i + 1] = 0.0f; bodies[4 * i + 2] = 0.0f; @@ -136,7 +147,6 @@ void initVAO() { bindices[i] = i; } - glGenVertexArrays(1, &boidVAO); // Attach everything needed to draw a particle to this glGenBuffers(1, &boidVBO_positions); glGenBuffers(1, &boidVBO_velocities); @@ -145,7 +155,7 @@ void initVAO() { glBindVertexArray(boidVAO); // Bind the positions array to the boidVAO by way of the boidVBO_positions - glBindBuffer(GL_ARRAY_BUFFER, boidVBO_positions); // bind the buffer + glBindBuffer(GL_ARRAY_BUFFER, boidVBO_positions); // bind the buffer glBufferData(GL_ARRAY_BUFFER, 4 * (N_FOR_VIS) * sizeof(GLfloat), bodies.get(), GL_DYNAMIC_DRAW); // transfer data glEnableVertexAttribArray(positionLocation); @@ -163,151 +173,166 @@ void initVAO() { glBindVertexArray(0); } -void initShaders(GLuint * program) { +void initShaders(GLuint *program) +{ GLint location; program[PROG_BOID] = glslUtility::createProgram( - "shaders/boid.vert.glsl", - "shaders/boid.geom.glsl", - "shaders/boid.frag.glsl", attributeLocations, 2); - glUseProgram(program[PROG_BOID]); - - if ((location = glGetUniformLocation(program[PROG_BOID], "u_projMatrix")) != -1) { - glUniformMatrix4fv(location, 1, GL_FALSE, &projection[0][0]); - } - if ((location = glGetUniformLocation(program[PROG_BOID], "u_cameraPos")) != -1) { - glUniform3fv(location, 1, &cameraPosition[0]); - } + "shaders/boid.vert.glsl", + "shaders/boid.geom.glsl", + "shaders/boid.frag.glsl", attributeLocations, 2); + glUseProgram(program[PROG_BOID]); + + if ((location = glGetUniformLocation(program[PROG_BOID], "u_projMatrix")) != -1) + { + glUniformMatrix4fv(location, 1, GL_FALSE, &projection[0][0]); } - - //==================================== - // Main loop - //==================================== - void runCUDA() { - // Map OpenGL buffer object for writing from CUDA on a single GPU - // No data is moved (Win & Linux). When mapped to CUDA, OpenGL should not - // use this buffer - - float4 *dptr = NULL; - float *dptrVertPositions = NULL; - float *dptrVertVelocities = NULL; - - cudaGLMapBufferObject((void**)&dptrVertPositions, boidVBO_positions); - cudaGLMapBufferObject((void**)&dptrVertVelocities, boidVBO_velocities); - - // execute the kernel - #if UNIFORM_GRID && COHERENT_GRID - Boids::stepSimulationCoherentGrid(DT); - #elif UNIFORM_GRID - Boids::stepSimulationScatteredGrid(DT); - #else - Boids::stepSimulationNaive(DT); - #endif - - #if VISUALIZE - Boids::copyBoidsToVBO(dptrVertPositions, dptrVertVelocities); - #endif - // unmap buffer object - cudaGLUnmapBufferObject(boidVBO_positions); - cudaGLUnmapBufferObject(boidVBO_velocities); + if ((location = glGetUniformLocation(program[PROG_BOID], "u_cameraPos")) != -1) + { + glUniform3fv(location, 1, &cameraPosition[0]); } +} - void mainLoop() { - double fps = 0; - double timebase = 0; - int frame = 0; - - Boids::unitTest(); // LOOK-1.2 We run some basic example code to make sure - // your CUDA development setup is ready to go. +//==================================== +// Main loop +//==================================== +void runCUDA() +{ + // Map OpenGL buffer object for writing from CUDA on a single GPU + // No data is moved (Win & Linux). When mapped to CUDA, OpenGL should not + // use this buffer + + float4 *dptr = NULL; + float *dptrVertPositions = NULL; + float *dptrVertVelocities = NULL; + + cudaGLMapBufferObject((void **)&dptrVertPositions, boidVBO_positions); + cudaGLMapBufferObject((void **)&dptrVertVelocities, boidVBO_velocities); + +// execute the kernel +#if UNIFORM_GRID && COHERENT_GRID + Boids::stepSimulationCoherentGrid(DT); +#elif UNIFORM_GRID + Boids::stepSimulationScatteredGrid(DT); +#else + Boids::stepSimulationNaive(DT); +#endif + +#if VISUALIZE + Boids::copyBoidsToVBO(dptrVertPositions, dptrVertVelocities); +#endif + // unmap buffer object + cudaGLUnmapBufferObject(boidVBO_positions); + cudaGLUnmapBufferObject(boidVBO_velocities); +} - while (!glfwWindowShouldClose(window)) { - glfwPollEvents(); +void mainLoop() +{ + double fps = 0; + double timebase = 0; + int frame = 0; - frame++; - double time = glfwGetTime(); + Boids::unitTest(); // LOOK-1.2 We run some basic example code to make sure + // your CUDA development setup is ready to go. - if (time - timebase > 1.0) { - fps = frame / (time - timebase); - timebase = time; - frame = 0; - } + while (!glfwWindowShouldClose(window)) + { + glfwPollEvents(); - runCUDA(); + frame++; + double time = glfwGetTime(); - std::ostringstream ss; - ss << "["; - ss.precision(1); - ss << std::fixed << fps; - ss << " fps] " << deviceName; - glfwSetWindowTitle(window, ss.str().c_str()); + if (time - timebase > 1.0) + { + fps = frame / (time - timebase); + timebase = time; + frame = 0; + } - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + runCUDA(); - #if VISUALIZE - glUseProgram(program[PROG_BOID]); - glBindVertexArray(boidVAO); - glPointSize((GLfloat)pointSize); - glDrawElements(GL_POINTS, N_FOR_VIS + 1, GL_UNSIGNED_INT, 0); - glPointSize(1.0f); + std::ostringstream ss; + ss << "["; + ss.precision(1); + ss << std::fixed << fps; + ss << " fps] " << deviceName; + glfwSetWindowTitle(window, ss.str().c_str()); - glUseProgram(0); - glBindVertexArray(0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glfwSwapBuffers(window); - #endif - } - glfwDestroyWindow(window); - glfwTerminate(); - } +#if VISUALIZE + glUseProgram(program[PROG_BOID]); + glBindVertexArray(boidVAO); + glPointSize((GLfloat)pointSize); + glDrawElements(GL_POINTS, N_FOR_VIS + 1, GL_UNSIGNED_INT, 0); + glPointSize(1.0f); + glUseProgram(0); + glBindVertexArray(0); - void errorCallback(int error, const char *description) { - fprintf(stderr, "error %d: %s\n", error, description); + glfwSwapBuffers(window); +#endif } + glfwDestroyWindow(window); + glfwTerminate(); +} - void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { - if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { - glfwSetWindowShouldClose(window, GL_TRUE); - } - } +void errorCallback(int error, const char *description) +{ + fprintf(stderr, "error %d: %s\n", error, description); +} - void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods) { - leftMousePressed = (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS); - rightMousePressed = (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS); +void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + { + glfwSetWindowShouldClose(window, GL_TRUE); } +} - void mousePositionCallback(GLFWwindow* window, double xpos, double ypos) { - if (leftMousePressed) { - // compute new camera parameters - phi += (xpos - lastX) / width; - theta -= (ypos - lastY) / height; - theta = std::fmax(0.01f, std::fmin(theta, 3.14f)); - updateCamera(); - } - else if (rightMousePressed) { - zoom += (ypos - lastY) / height; - zoom = std::fmax(0.1f, std::fmin(zoom, 5.0f)); - updateCamera(); - } +void mouseButtonCallback(GLFWwindow *window, int button, int action, int mods) +{ + leftMousePressed = (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS); + rightMousePressed = (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS); +} - lastX = xpos; - lastY = ypos; +void mousePositionCallback(GLFWwindow *window, double xpos, double ypos) +{ + if (leftMousePressed) + { + // compute new camera parameters + phi += (xpos - lastX) / width; + theta -= (ypos - lastY) / height; + theta = std::fmax(0.01f, std::fmin(theta, 3.14f)); + updateCamera(); + } + else if (rightMousePressed) + { + zoom += (ypos - lastY) / height; + zoom = std::fmax(0.1f, std::fmin(zoom, 5.0f)); + updateCamera(); } - void updateCamera() { - cameraPosition.x = zoom * sin(phi) * sin(theta); - cameraPosition.z = zoom * cos(theta); - cameraPosition.y = zoom * cos(phi) * sin(theta); - cameraPosition += lookAt; + lastX = xpos; + lastY = ypos; +} - projection = glm::perspective(fovy, float(width) / float(height), zNear, zFar); - glm::mat4 view = glm::lookAt(cameraPosition, lookAt, glm::vec3(0, 0, 1)); - projection = projection * view; +void updateCamera() +{ + cameraPosition.x = zoom * sin(phi) * sin(theta); + cameraPosition.z = zoom * cos(theta); + cameraPosition.y = zoom * cos(phi) * sin(theta); + cameraPosition += lookAt; - GLint location; + projection = glm::perspective(fovy, float(width) / float(height), zNear, zFar); + glm::mat4 view = glm::lookAt(cameraPosition, lookAt, glm::vec3(0, 0, 1)); + projection = projection * view; - glUseProgram(program[PROG_BOID]); - if ((location = glGetUniformLocation(program[PROG_BOID], "u_projMatrix")) != -1) { - glUniformMatrix4fv(location, 1, GL_FALSE, &projection[0][0]); - } + GLint location; + + glUseProgram(program[PROG_BOID]); + if ((location = glGetUniformLocation(program[PROG_BOID], "u_projMatrix")) != -1) + { + glUniformMatrix4fv(location, 1, GL_FALSE, &projection[0][0]); } +}